From 9fb01298e16c5f98a84f7672044e57088f2c9134 Mon Sep 17 00:00:00 2001 From: Mihai Sucan Date: Mon, 20 Feb 2012 19:13:19 +0200 Subject: [PATCH] Bug 712982 - can't select line by clicking the line number in scratchpad; r=rcampbell --- .../sourceeditor/source-editor-orion.jsm | 55 ++++++++++++++ .../devtools/sourceeditor/test/Makefile.in | 1 + .../browser_bug712982_line_ruler_click.js | 74 +++++++++++++++++++ 3 files changed, 130 insertions(+) create mode 100644 browser/devtools/sourceeditor/test/browser_bug712982_line_ruler_click.js diff --git a/browser/devtools/sourceeditor/source-editor-orion.jsm b/browser/devtools/sourceeditor/source-editor-orion.jsm index 85d42ba2984..f986ec8bd16 100644 --- a/browser/devtools/sourceeditor/source-editor-orion.jsm +++ b/browser/devtools/sourceeditor/source-editor-orion.jsm @@ -307,6 +307,8 @@ SourceEditor.prototype = { {styleClass: rulerClass}, {styleClass: "rulerLines odd"}, {styleClass: "rulerLines even"}); + this._linesRuler.onClick = this._linesRulerClick.bind(this); + this._linesRuler.onDblClick = this._linesRulerDblClick.bind(this); this._view.addRuler(this._linesRuler); } @@ -619,6 +621,59 @@ SourceEditor.prototype = { [this._currentLineAnnotation]); }, + /** + * The click event handler for the lines gutter. This function allows the user + * to jump to a line or to perform line selection while holding the Shift key + * down. + * + * @private + * @param number aLineIndex + * The line index where the click event occurred. + * @param object aEvent + * The DOM click event object. + */ + _linesRulerClick: function SE__linesRulerClick(aLineIndex, aEvent) + { + if (aLineIndex === undefined) { + return; + } + + if (aEvent.shiftKey) { + let model = this._model; + let selection = this.getSelection(); + let selectionLineStart = model.getLineAtOffset(selection.start); + let selectionLineEnd = model.getLineAtOffset(selection.end); + let newStart = aLineIndex <= selectionLineStart ? + model.getLineStart(aLineIndex) : selection.start; + let newEnd = aLineIndex <= selectionLineStart ? + selection.end : model.getLineEnd(aLineIndex); + this.setSelection(newStart, newEnd); + } else { + this.setCaretPosition(aLineIndex); + } + }, + + /** + * The dblclick event handler for the lines gutter. This function selects the + * whole line where the event occurred. + * + * @private + * @param number aLineIndex + * The line index where the double click event occurred. + * @param object aEvent + * The DOM dblclick event object. + */ + _linesRulerDblClick: function SE__linesRulerDblClick(aLineIndex) + { + if (aLineIndex === undefined) { + return; + } + + let newStart = this._model.getLineStart(aLineIndex); + let newEnd = this._model.getLineEnd(aLineIndex); + this.setSelection(newStart, newEnd); + }, + /** * Highlight the Orion annotations. This updates the annotation styler as * needed. diff --git a/browser/devtools/sourceeditor/test/Makefile.in b/browser/devtools/sourceeditor/test/Makefile.in index 9b72cee7974..65b20166b7a 100644 --- a/browser/devtools/sourceeditor/test/Makefile.in +++ b/browser/devtools/sourceeditor/test/Makefile.in @@ -57,6 +57,7 @@ _BROWSER_TEST_FILES = \ browser_bug703692_focus_blur.js \ browser_bug725388_mouse_events.js \ browser_bug707987_debugger_breakpoints.js \ + browser_bug712982_line_ruler_click.js \ head.js \ libs:: $(_BROWSER_TEST_FILES) diff --git a/browser/devtools/sourceeditor/test/browser_bug712982_line_ruler_click.js b/browser/devtools/sourceeditor/test/browser_bug712982_line_ruler_click.js new file mode 100644 index 00000000000..61397fbcf7f --- /dev/null +++ b/browser/devtools/sourceeditor/test/browser_bug712982_line_ruler_click.js @@ -0,0 +1,74 @@ +/* vim: set ts=2 et sw=2 tw=80: */ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +function test() { + + let temp = {}; + Cu.import("resource:///modules/source-editor.jsm", temp); + let SourceEditor = temp.SourceEditor; + + let component = Services.prefs.getCharPref(SourceEditor.PREFS.COMPONENT); + if (component == "textarea") { + ok(true, "skip test for bug 712982: only applicable for non-textarea components"); + return; + } + + waitForExplicitFinish(); + + let editor; + + const windowUrl = "data:text/xml," + + ""; + const windowFeatures = "chrome,titlebar,toolbar,centerscreen,resizable,dialog=no"; + + let testWin = Services.ww.openWindow(null, windowUrl, "_blank", windowFeatures, null); + testWin.addEventListener("load", function onWindowLoad() { + testWin.removeEventListener("load", onWindowLoad, false); + waitForFocus(initEditor, testWin); + }, false); + + function initEditor() + { + let hbox = testWin.document.querySelector("hbox"); + editor = new SourceEditor(); + editor.init(hbox, {showLineNumbers: true}, editorLoaded); + } + + function editorLoaded() + { + editor.focus(); + + editor.setText("line1\nline2\nline3\nline4"); + + editor.setCaretPosition(3); + let pos = editor.getCaretPosition(); + ok(pos.line == 3 && pos.col == 0, "initial caret location is correct"); + + EventUtils.synthesizeMouse(editor.editorElement, 10, 10, {}, testWin); + + is(editor.getCaretOffset(), 0, "click on line 0 worked"); + + editor.setCaretPosition(2); + EventUtils.synthesizeMouse(editor.editorElement, 11, 11, + {shiftKey: true}, testWin); + is(editor.getSelectedText().trim(), "line1\nline2", "shift+click works"); + + editor.setCaretOffset(0); + + EventUtils.synthesizeMouse(editor.editorElement, 10, 10, + {clickCount: 2}, testWin); + + is(editor.getSelectedText().trim(), "line1", "double click works"); + + editor.destroy(); + + testWin.close(); + testWin = editor = null; + + waitForFocus(finish, window); + } +}