summaryrefslogtreecommitdiffstats
path: root/devtools/client
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client')
-rw-r--r--devtools/client/scratchpad/scratchpad.js3
-rw-r--r--devtools/client/sourceeditor/editor-commands-controller.js97
-rw-r--r--devtools/client/sourceeditor/editor.js10
-rw-r--r--devtools/client/sourceeditor/moz.build1
-rw-r--r--devtools/client/styleeditor/StyleSheetEditor.jsm3
5 files changed, 114 insertions, 0 deletions
diff --git a/devtools/client/scratchpad/scratchpad.js b/devtools/client/scratchpad/scratchpad.js
index b210e3906..60221f39d 100644
--- a/devtools/client/scratchpad/scratchpad.js
+++ b/devtools/client/scratchpad/scratchpad.js
@@ -1744,6 +1744,9 @@ var Scratchpad = {
this.editor.focus();
this.editor.setCursor({ line: lines.length, ch: lines.pop().length });
+ // Add the commands controller for the source-editor.
+ this.editor.insertCommandsController();
+
if (state)
this.dirty = !state.saved;
diff --git a/devtools/client/sourceeditor/editor-commands-controller.js b/devtools/client/sourceeditor/editor-commands-controller.js
new file mode 100644
index 000000000..2587f9a1f
--- /dev/null
+++ b/devtools/client/sourceeditor/editor-commands-controller.js
@@ -0,0 +1,97 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+/**
+ * The source editor exposes XUL commands that can be used when embedded in a XUL
+ * document. This controller drives the availability and behavior of the commands. When
+ * the editor input field is focused, this controller will update the matching menu item
+ * entries found in application menus or context menus.
+ */
+
+/**
+ * Returns a controller object that can be used for editor-specific commands:
+ * - find
+ * - find again
+ * - go to line
+ * - undo
+ * - redo
+ * - delete
+ * - select all
+ */
+function createController(ed) {
+ return {
+ supportsCommand: function (cmd) {
+ switch (cmd) {
+ case "cmd_find":
+ case "cmd_findAgain":
+ case "cmd_gotoLine":
+ case "cmd_undo":
+ case "cmd_redo":
+ case "cmd_delete":
+ case "cmd_selectAll":
+ return true;
+ }
+
+ return false;
+ },
+
+ isCommandEnabled: function (cmd) {
+ let cm = ed.codeMirror;
+
+ switch (cmd) {
+ case "cmd_find":
+ case "cmd_gotoLine":
+ case "cmd_selectAll":
+ return true;
+ case "cmd_findAgain":
+ return cm.state.search != null && cm.state.search.query != null;
+ case "cmd_undo":
+ return ed.canUndo();
+ case "cmd_redo":
+ return ed.canRedo();
+ case "cmd_delete":
+ return ed.somethingSelected();
+ }
+
+ return false;
+ },
+
+ doCommand: function (cmd) {
+ let cm = ed.codeMirror;
+
+ let map = {
+ "cmd_selectAll": "selectAll",
+ "cmd_find": "find",
+ "cmd_undo": "undo",
+ "cmd_redo": "redo",
+ "cmd_delete": "delCharAfter",
+ "cmd_findAgain": "findNext"
+ };
+
+ if (map[cmd]) {
+ cm.execCommand(map[cmd]);
+ return;
+ }
+
+ if (cmd == "cmd_gotoLine") {
+ ed.jumpToLine();
+ }
+ },
+
+ onEvent: function () {}
+ };
+}
+
+/**
+ * Create and insert a commands controller for the provided SourceEditor instance.
+ */
+function insertCommandsController(sourceEditor) {
+ let input = sourceEditor.codeMirror.getInputField();
+ let controller = createController(sourceEditor);
+ input.controllers.insertControllerAt(0, controller);
+}
+
+module.exports = { insertCommandsController };
diff --git a/devtools/client/sourceeditor/editor.js b/devtools/client/sourceeditor/editor.js
index ce2136afc..1b3c1d31a 100644
--- a/devtools/client/sourceeditor/editor.js
+++ b/devtools/client/sourceeditor/editor.js
@@ -489,6 +489,16 @@ Editor.prototype = {
},
/**
+ * The source editor can expose several commands linked from system and context menus.
+ * Kept for backward compatibility with scratchpad and styleeditor.
+ */
+ insertCommandsController: function () {
+ const { insertCommandsController } =
+ require("devtools/client/sourceeditor/editor-commands-controller");
+ insertCommandsController(this);
+ },
+
+ /**
* Returns text from the text area. If line argument is provided
* the method returns only that line.
*/
diff --git a/devtools/client/sourceeditor/moz.build b/devtools/client/sourceeditor/moz.build
index 5081325c5..765accb14 100644
--- a/devtools/client/sourceeditor/moz.build
+++ b/devtools/client/sourceeditor/moz.build
@@ -12,6 +12,7 @@ DevToolsModules(
'autocomplete.js',
'css-autocompleter.js',
'debugger.js',
+ 'editor-commands-controller.js',
'editor.js'
)
diff --git a/devtools/client/styleeditor/StyleSheetEditor.jsm b/devtools/client/styleeditor/StyleSheetEditor.jsm
index 980e51974..832fcacde 100644
--- a/devtools/client/styleeditor/StyleSheetEditor.jsm
+++ b/devtools/client/styleeditor/StyleSheetEditor.jsm
@@ -468,6 +468,9 @@ StyleSheetEditor.prototype = {
sourceEditor.container.addEventListener("mousemove", this._onMouseMove);
}
+ // Add the commands controller for the source-editor.
+ sourceEditor.insertCommandsController();
+
this.emit("source-editor-load");
});
},