diff --git a/lib/ace/clipboard.js b/lib/ace/clipboard.js new file mode 100644 index 00000000..e52bba87 --- /dev/null +++ b/lib/ace/clipboard.js @@ -0,0 +1,73 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Ajax.org Code Editor (ACE). + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Harutyun Amirjanyan + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ +define(function(require, exports, module) { + +exports.history = [] + +exports.$addEntry = function() { + this.$data = {text: "", meta: null}; + this.history.push(this.$data); + if (this.history.length > 10) + this.history.unshift(); +}; + +exports.rotate = function() { + this.$data = {text: "", meta: null}; + this.history.push(this.$data); +}; + +exports.setText = function(text, metadata) { + if (text && text != this.$data.text) { + this.$addEntry(); + this.$data.text = text; + + if (!metadata) + this.$data.meta = null; + } else if (metadata) + this.$data.meta = metadata; + return text; +}; + +exports.getData = function() { + return this.$data; +}; + +exports.getText = function() { + return this.$data.text || ""; +}; + +}); diff --git a/lib/ace/clipboard_test.js b/lib/ace/clipboard_test.js new file mode 100644 index 00000000..bf3f88a5 --- /dev/null +++ b/lib/ace/clipboard_test.js @@ -0,0 +1,84 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Ajax.org Code Editor (ACE). + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Harutyun Amirjanyan + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +if (typeof process !== "undefined") { + require("amd-loader"); +} + +define(function(require, exports, module) { + +var clipboard = require('./clipboard'); +var assert = require("./test/assertions"); + +function checkClipboardData(text, metadata) { + var data = clipboard.getData(); + assert.equal(data.text, text); + assert.equal(data.meta, metadata); +} + +module.exports = { + + "test: clipboard" : function() { + assert.equal(clipboard.getText(), ""); + clipboard.setText("Hello"); + assert.equal(clipboard.getText(), "Hello"); + var metadata = {}; + clipboard.setText("Hello", metadata); + assert.equal(clipboard.getText(), "Hello"); + + checkClipboardData("Hello", metadata); + + clipboard.setText("Hello"); + checkClipboardData("Hello", metadata); + + + clipboard.setText("Bye"); + checkClipboardData("Bye", null); + }, + + "test: clipboard history" : function() { + assert.equal(clipboard.getText(), "Bye"); + + clipboard.setText("new Hello"); + } +}; + +}); + +if (typeof module !== "undefined" && module === require.main) { + require("asyncjs").test.testcase(module.exports).exec() +} \ No newline at end of file diff --git a/lib/ace/commands/default_commands.js b/lib/ace/commands/default_commands.js index 1811c34c..92dce3b5 100644 --- a/lib/ace/commands/default_commands.js +++ b/lib/ace/commands/default_commands.js @@ -42,6 +42,7 @@ define(function(require, exports, module) { "use strict"; var lang = require("../lib/lang"); +var clipboard = require("../clipboard"); function bindKey(win, mac) { return { @@ -321,6 +322,22 @@ exports.commands = [{ } }, multiSelectAction: "forEach" +}, { + name: "copy", + exec: function(editor, text) { + this._emit("copy", text); + + } +}, { + name: "paste", + exec: function(editor, text) { + + } +}, { + name: "pasteFromHistory", + exec: function(editor, text) { + + } }, { name: "removeline", bindKey: bindKey("Ctrl-D", "Command-D"), diff --git a/lib/ace/editor.js b/lib/ace/editor.js index be072a57..b248975c 100644 --- a/lib/ace/editor.js +++ b/lib/ace/editor.js @@ -654,7 +654,7 @@ var Editor = function(renderer, session) { if (!this.selection.isEmpty()) text = this.session.getTextRange(this.getSelectionRange()); - this._emit("copy", text); + return text; }; @@ -663,8 +663,9 @@ var Editor = function(renderer, session) { * * Called whenever a text "copy" happens. **/ - this.onCopy = function() { - this.commands.exec("copy", this); + this.onCopy = function(copyText) { + this._emit("copy", text); + this.commands.exec("copy", this, copyText); }; /** @@ -672,8 +673,8 @@ var Editor = function(renderer, session) { * * called whenever a text "cut" happens. **/ - this.onCut = function() { - this.commands.exec("cut", this); + this.onCut = function(copyText) { + this.commands.exec("cut", this, copyText); }; /** diff --git a/lib/ace/keyboard/textinput.js b/lib/ace/keyboard/textinput.js index c70d570a..13f6e798 100644 --- a/lib/ace/keyboard/textinput.js +++ b/lib/ace/keyboard/textinput.js @@ -143,9 +143,10 @@ var TextInput = function(parentNode, host) { var onCopy = function(e) { copied = true; var copyText = host.getCopyText(); - if(copyText) + if(copyText) { text.value = copyText; - else + host.onCopy(copyText); + } else e.preventDefault(); reset(); setTimeout(function () { @@ -158,7 +159,7 @@ var TextInput = function(parentNode, host) { var copyText = host.getCopyText(); if(copyText) { text.value = copyText; - host.onCut(); + host.onCut(copyText); } else e.preventDefault(); reset();