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

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

Issue 357483007: DevTools: [CodeMirror] add support for camel case movements. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: minor method renaming Created 6 years, 6 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 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
76 "Ctrl-A": "selectAll", 76 "Ctrl-A": "selectAll",
77 "Ctrl-Z": "undoAndReveal", 77 "Ctrl-Z": "undoAndReveal",
78 "Shift-Ctrl-Z": "redoAndReveal", 78 "Shift-Ctrl-Z": "redoAndReveal",
79 "Ctrl-Y": "redo", 79 "Ctrl-Y": "redo",
80 "Ctrl-Home": "goDocStart", 80 "Ctrl-Home": "goDocStart",
81 "Ctrl-Up": "goDocStart", 81 "Ctrl-Up": "goDocStart",
82 "Ctrl-End": "goDocEnd", 82 "Ctrl-End": "goDocEnd",
83 "Ctrl-Down": "goDocEnd", 83 "Ctrl-Down": "goDocEnd",
84 "Ctrl-Left": "goGroupLeft", 84 "Ctrl-Left": "goGroupLeft",
85 "Ctrl-Right": "goGroupRight", 85 "Ctrl-Right": "goGroupRight",
86 "Alt-Left": "goLineStart", 86 "Alt-Left": "moveCamelLeft",
87 "Alt-Right": "goLineEnd", 87 "Alt-Right": "moveCamelRight",
88 "Shift-Alt-Left": "moveCamelLeftShift",
vsevik 2014/06/27 11:25:43 consider selectCamelLeft
lushnikov 2014/06/27 11:58:23 Done.
89 "Shift-Alt-Right": "moveCamelRightShift",
88 "Ctrl-Backspace": "delGroupBefore", 90 "Ctrl-Backspace": "delGroupBefore",
89 "Ctrl-Delete": "delGroupAfter", 91 "Ctrl-Delete": "delGroupAfter",
90 "Ctrl-/": "toggleComment", 92 "Ctrl-/": "toggleComment",
91 "Ctrl-D": "selectNextOccurrence", 93 "Ctrl-D": "selectNextOccurrence",
92 "Ctrl-U": "undoLastSelection", 94 "Ctrl-U": "undoLastSelection",
93 fallthrough: "devtools-common" 95 fallthrough: "devtools-common"
94 }; 96 };
95 97
96 CodeMirror.keyMap["devtools-mac"] = { 98 CodeMirror.keyMap["devtools-mac"] = {
97 "Cmd-A" : "selectAll", 99 "Cmd-A" : "selectAll",
98 "Cmd-Z" : "undoAndReveal", 100 "Cmd-Z" : "undoAndReveal",
99 "Shift-Cmd-Z": "redoAndReveal", 101 "Shift-Cmd-Z": "redoAndReveal",
100 "Cmd-Up": "goDocStart", 102 "Cmd-Up": "goDocStart",
101 "Cmd-Down": "goDocEnd", 103 "Cmd-Down": "goDocEnd",
102 "Alt-Left": "goGroupLeft", 104 "Alt-Left": "goGroupLeft",
103 "Alt-Right": "goGroupRight", 105 "Alt-Right": "goGroupRight",
106 "Ctrl-Left": "moveCamelLeft",
107 "Ctrl-Right": "moveCamelRight",
108 "Shift-Ctrl-Left": "moveCamelLeftShift",
109 "Shift-Ctrl-Right": "moveCamelRightShift",
104 "Cmd-Left": "goLineStartSmart", 110 "Cmd-Left": "goLineStartSmart",
105 "Cmd-Right": "goLineEnd", 111 "Cmd-Right": "goLineEnd",
106 "Alt-Backspace": "delGroupBefore", 112 "Alt-Backspace": "delGroupBefore",
107 "Alt-Delete": "delGroupAfter", 113 "Alt-Delete": "delGroupAfter",
108 "Cmd-/": "toggleComment", 114 "Cmd-/": "toggleComment",
109 "Cmd-D": "selectNextOccurrence", 115 "Cmd-D": "selectNextOccurrence",
110 "Cmd-U": "undoLastSelection", 116 "Cmd-U": "undoLastSelection",
111 fallthrough: "devtools-common" 117 fallthrough: "devtools-common"
112 }; 118 };
113 119
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 /** 199 /**
194 * @param {!CodeMirror} codeMirror 200 * @param {!CodeMirror} codeMirror
195 */ 201 */
196 WebInspector.CodeMirrorTextEditor.selectNextOccurrenceCommand = function(codeMir ror) 202 WebInspector.CodeMirrorTextEditor.selectNextOccurrenceCommand = function(codeMir ror)
197 { 203 {
198 codeMirror._codeMirrorTextEditor._selectNextOccurrenceController.selectNextO ccurrence(); 204 codeMirror._codeMirrorTextEditor._selectNextOccurrenceController.selectNextO ccurrence();
199 } 205 }
200 CodeMirror.commands.selectNextOccurrence = WebInspector.CodeMirrorTextEditor.sel ectNextOccurrenceCommand; 206 CodeMirror.commands.selectNextOccurrence = WebInspector.CodeMirrorTextEditor.sel ectNextOccurrenceCommand;
201 207
202 /** 208 /**
209 * @param {boolean} shift
210 * @param {!CodeMirror} codeMirror
211 */
212 WebInspector.CodeMirrorTextEditor.moveCamelLeftCommand = function(shift, codeMir ror)
213 {
214 codeMirror._codeMirrorTextEditor._doCamelCaseMovement(-1, shift);
215 }
216 CodeMirror.commands.moveCamelLeft = WebInspector.CodeMirrorTextEditor.moveCamelL eftCommand.bind(null, false);
217 CodeMirror.commands.moveCamelLeftShift = WebInspector.CodeMirrorTextEditor.moveC amelLeftCommand.bind(null, true);
218
219 /**
220 * @param {boolean} shift
221 * @param {!CodeMirror} codeMirror
222 */
223 WebInspector.CodeMirrorTextEditor.moveCamelRightCommand = function(shift, codeMi rror)
224 {
225 codeMirror._codeMirrorTextEditor._doCamelCaseMovement(1, shift);
226 }
227 CodeMirror.commands.moveCamelRight = WebInspector.CodeMirrorTextEditor.moveCamel RightCommand.bind(null, false);
228 CodeMirror.commands.moveCamelRightShift = WebInspector.CodeMirrorTextEditor.move CamelRightCommand.bind(null, true);
229
230 /**
203 * @param {!CodeMirror} codeMirror 231 * @param {!CodeMirror} codeMirror
204 */ 232 */
205 CodeMirror.commands.smartNewlineAndIndent = function(codeMirror) 233 CodeMirror.commands.smartNewlineAndIndent = function(codeMirror)
206 { 234 {
207 codeMirror.operation(innerSmartNewlineAndIndent.bind(null, codeMirror)); 235 codeMirror.operation(innerSmartNewlineAndIndent.bind(null, codeMirror));
208 236
209 function countIndent(line) 237 function countIndent(line)
210 { 238 {
211 for (var i = 0; i < line.length; ++i) { 239 for (var i = 0; i < line.length; ++i) {
212 if (!WebInspector.TextUtils.isSpaceChar(line[i])) 240 if (!WebInspector.TextUtils.isSpaceChar(line[i]))
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 293
266 codemirror.setSelection(selection.anchor, selection.head, {scroll: false}); 294 codemirror.setSelection(selection.anchor, selection.head, {scroll: false});
267 codemirror._codeMirrorTextEditor._revealLine(selection.anchor.line); 295 codemirror._codeMirrorTextEditor._revealLine(selection.anchor.line);
268 } 296 }
269 297
270 WebInspector.CodeMirrorTextEditor.LongLineModeLineLengthThreshold = 2000; 298 WebInspector.CodeMirrorTextEditor.LongLineModeLineLengthThreshold = 2000;
271 WebInspector.CodeMirrorTextEditor.MaximumNumberOfWhitespacesPerSingleSpan = 16; 299 WebInspector.CodeMirrorTextEditor.MaximumNumberOfWhitespacesPerSingleSpan = 16;
272 WebInspector.CodeMirrorTextEditor.MaxEditableTextSize = 1024 * 1024 * 10; 300 WebInspector.CodeMirrorTextEditor.MaxEditableTextSize = 1024 * 1024 * 10;
273 301
274 WebInspector.CodeMirrorTextEditor.prototype = { 302 WebInspector.CodeMirrorTextEditor.prototype = {
303 /**
304 * @param {number} lineNumber
305 * @param {number} lineLength
306 * @param {number} charNumber
307 * @return {{lineNumber: number, columnNumber: number}}
308 */
309 _normalizePositionForOverlappingColumn: function(lineNumber, lineLength, cha rNumber)
310 {
311 var linesCount = this._codeMirror.lineCount();
312 var columnNumber = charNumber;
313 if (charNumber < 0 && lineNumber > 0) {
314 --lineNumber;
315 columnNumber = this.line(lineNumber).length;
316 } else if (charNumber >= lineLength && lineNumber < linesCount - 1) {
317 ++lineNumber;
318 columnNumber = 0;
319 } else {
320 columnNumber = Number.constrain(charNumber, 0, lineLength);
321 }
322 return {
323 lineNumber: lineNumber,
324 columnNumber: columnNumber
325 };
326 },
327
328 /**
329 * @param {number} lineNumber
330 * @param {number} columnNumber
331 * @param {number} direction
332 * @return {{lineNumber: number, columnNumber: number}}
333 */
334 _camelCaseMoveFromPosition: function(lineNumber, columnNumber, direction)
335 {
336 /**
337 * @param {number} charNumber
338 * @param {number} length
339 * @return {boolean}
340 */
341 function valid(charNumber, length)
342 {
343 return charNumber >= 0 && charNumber < length;
344 }
345
346 /**
347 * @param {string} text
348 * @param {number} charNumber
349 * @return {boolean}
350 */
351 function isWordStart(text, charNumber)
352 {
353 var position = charNumber;
354 var nextPosition = charNumber + 1;
355 return valid(position, text.length) && valid(nextPosition, text.leng th)
356 && WebInspector.TextUtils.isWordChar(text[position]) && WebInspe ctor.TextUtils.isWordChar(text[nextPosition])
357 && WebInspector.TextUtils.isUpperCase(text[position]) && WebInsp ector.TextUtils.isLowerCase(text[nextPosition]);
358 }
359
360 /**
361 * @param {string} text
362 * @param {number} charNumber
363 * @return {boolean}
364 */
365 function isWordEnd(text, charNumber)
366 {
367 var position = charNumber;
368 var prevPosition = charNumber - 1;
369 return valid(position, text.length) && valid(prevPosition, text.leng th)
370 && WebInspector.TextUtils.isWordChar(text[position]) && WebInspe ctor.TextUtils.isWordChar(text[prevPosition])
371 && WebInspector.TextUtils.isUpperCase(text[position]) && WebInsp ector.TextUtils.isLowerCase(text[prevPosition]);
372 }
373
374 /**
375 * @param {number} lineNumber
376 * @param {number} lineLength
377 * @param {number} columnNumber
378 * @return {{lineNumber: number, columnNumber: number}}
379 */
380 function constrainPosition(lineNumber, lineLength, columnNumber)
381 {
382 return {
383 lineNumber: lineNumber,
384 columnNumber: Number.constrain(columnNumber, 0, lineLength)
385 };
386 }
387
388 var text = this.line(lineNumber);
389 var length = text.length;
390
391 if ((columnNumber === length && direction === 1)
392 || (columnNumber === 0 && direction === -1))
393 return this._normalizePositionForOverlappingColumn(lineNumber, lengt h, columnNumber + direction);
394
395 var charNumber = direction === 1 ? columnNumber : columnNumber - 1;
396
397 // Move through initial spaces if any.
398 while (valid(charNumber, length) && WebInspector.TextUtils.isSpaceChar(t ext[charNumber]))
399 charNumber += direction;
400 if (!valid(charNumber, length))
401 return constrainPosition(lineNumber, length, charNumber);
402
403 if (WebInspector.TextUtils.isStopChar(text[charNumber])) {
404 while (valid(charNumber, length) && WebInspector.TextUtils.isStopCha r(text[charNumber]))
405 charNumber += direction;
406 if (!valid(charNumber, length))
407 return constrainPosition(lineNumber, length, charNumber);
408 return {
409 lineNumber: lineNumber,
410 columnNumber: direction === -1 ? charNumber + 1 : charNumber
411 };
412 }
413
414 charNumber += direction;
415 while (valid(charNumber, length) && !isWordStart(text, charNumber) && !i sWordEnd(text, charNumber) && WebInspector.TextUtils.isWordChar(text[charNumber] ))
416 charNumber += direction;
417
418 if (!valid(charNumber, length))
419 return constrainPosition(lineNumber, length, charNumber);
420 if (isWordStart(text, charNumber) || isWordEnd(text, charNumber)) {
421 return {
422 lineNumber: lineNumber,
423 columnNumber: charNumber
424 };
425 }
426
427 return {
428 lineNumber: lineNumber,
429 columnNumber: direction === -1 ? charNumber + 1 : charNumber
430 };
431 },
432
433 /**
434 * @param {number} direction
435 * @param {boolean} shift
436 */
437 _doCamelCaseMovement: function(direction, shift)
438 {
439 var selections = this.selections();
440 for (var i = 0; i < selections.length; ++i) {
441 var selection = selections[i];
442 var move = this._camelCaseMoveFromPosition(selection.endLine, select ion.endColumn, direction);
443 selection.endLine = move.lineNumber;
444 selection.endColumn = move.columnNumber;
445 if (!shift)
446 selections[i] = selection.collapseToEnd();
447 }
448 this.setSelections(selections);
449 },
450
275 dispose: function() 451 dispose: function()
276 { 452 {
277 WebInspector.settings.textEditorIndent.removeChangeListener(this._update EditorIndentation, this); 453 WebInspector.settings.textEditorIndent.removeChangeListener(this._update EditorIndentation, this);
278 WebInspector.settings.showWhitespacesInEditor.removeChangeListener(this. _updateCodeMirrorMode, this); 454 WebInspector.settings.showWhitespacesInEditor.removeChangeListener(this. _updateCodeMirrorMode, this);
279 WebInspector.settings.textEditorBracketMatching.removeChangeListener(thi s._enableBracketMatchingIfNeeded, this); 455 WebInspector.settings.textEditorBracketMatching.removeChangeListener(thi s._enableBracketMatchingIfNeeded, this);
280 }, 456 },
281 457
282 _enableBracketMatchingIfNeeded: function() 458 _enableBracketMatchingIfNeeded: function()
283 { 459 {
284 this._codeMirror.setOption("autoCloseBrackets", WebInspector.settings.te xtEditorBracketMatching.get() ? { explode: false } : false); 460 this._codeMirror.setOption("autoCloseBrackets", WebInspector.settings.te xtEditorBracketMatching.get() ? { explode: false } : false);
(...skipping 1842 matching lines...) Expand 10 before | Expand all | Expand 10 after
2127 var backgroundColorRule = backgroundColor ? ".CodeMirror .CodeMirror-selecte d { background-color: " + backgroundColor + ";}" : ""; 2303 var backgroundColorRule = backgroundColor ? ".CodeMirror .CodeMirror-selecte d { background-color: " + backgroundColor + ";}" : "";
2128 var foregroundColor = InspectorFrontendHost.getSelectionForegroundColor(); 2304 var foregroundColor = InspectorFrontendHost.getSelectionForegroundColor();
2129 var foregroundColorRule = foregroundColor ? ".CodeMirror .CodeMirror-selecte dtext:not(.CodeMirror-persist-highlight) { color: " + foregroundColor + "!import ant;}" : ""; 2305 var foregroundColorRule = foregroundColor ? ".CodeMirror .CodeMirror-selecte dtext:not(.CodeMirror-persist-highlight) { color: " + foregroundColor + "!import ant;}" : "";
2130 if (!foregroundColorRule && !backgroundColorRule) 2306 if (!foregroundColorRule && !backgroundColorRule)
2131 return; 2307 return;
2132 2308
2133 var style = document.createElement("style"); 2309 var style = document.createElement("style");
2134 style.textContent = backgroundColorRule + foregroundColorRule; 2310 style.textContent = backgroundColorRule + foregroundColorRule;
2135 document.head.appendChild(style); 2311 document.head.appendChild(style);
2136 })(); 2312 })();
OLDNEW
« no previous file with comments | « LayoutTests/inspector/editor/text-editor-word-jumps-expected.txt ('k') | Source/devtools/front_end/ui/TextUtils.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698