From 3dd051f8579f1ccaef83d9d2f98fc432e8aa8bca Mon Sep 17 00:00:00 2001 From: nightwing Date: Mon, 27 Aug 2012 23:00:51 +0400 Subject: [PATCH 1/3] small cleanup --- lib/ace/keyboard/vim/maps/aliases.js | 4 +-- lib/ace/keyboard/vim/maps/motions.js | 52 +++++++++++++--------------- 2 files changed, 26 insertions(+), 30 deletions(-) diff --git a/lib/ace/keyboard/vim/maps/aliases.js b/lib/ace/keyboard/vim/maps/aliases.js index 6708a5c3..556250a6 100644 --- a/lib/ace/keyboard/vim/maps/aliases.js +++ b/lib/ace/keyboard/vim/maps/aliases.js @@ -35,9 +35,9 @@ * * ***** END LICENSE BLOCK ***** */ -"use strict" - define(function(require, exports, module) { +"use strict"; + module.exports = { "x": { operator: { diff --git a/lib/ace/keyboard/vim/maps/motions.js b/lib/ace/keyboard/vim/maps/motions.js index 3f0830c3..db59dd22 100644 --- a/lib/ace/keyboard/vim/maps/motions.js +++ b/lib/ace/keyboard/vim/maps/motions.js @@ -36,9 +36,9 @@ * * ***** END LICENSE BLOCK ***** */ -"use strict" define(function(require, exports, module) { +"use strict"; var util = require("./util"); @@ -56,36 +56,26 @@ function Motion(getRange, type){ else var reverse = type; - this.nav = function(editor) { - var r = getRange(editor); - if (!r) + this.nav = function(editor, range, count, param) { + range = getRange(editor, range, count, param); + if (!range) return; - if (!r.end) - var a = r; - else if (reverse) - var a = r.start; - else - var a = r.end; + var pos = range.end ? range : range[reverse ? "start" : "end"]; editor.clearSelection(); - editor.moveCursorTo(a.row, a.column); - } - this.sel = function(editor){ - var r = getRange(editor); - if (!r) + editor.moveCursorTo(pos.row, pos.column); + }; + this.sel = function(editor, range, count, param){ + range = getRange(editor, range, count, param); + if (!range) return; if (extend) - return editor.selection.setSelectionRange(r); + return editor.selection.setSelectionRange(range); - if (!r.end) - var a = r; - else if (reverse) - var a = r.start; - else - var a = r.end; + var pos = range.end ? range : range[reverse ? "start" : "end"]; - editor.selection.selectTo(a.row, a.column); - } + editor.selection.selectTo(pos.row, pos.column); + }; } var nonWordRe = /[\s.\/\\()\"'-:,.;<>~!@#$%^&*|+=\[\]{}`~?]/; @@ -98,8 +88,8 @@ var StringStream = function(editor, cursor) { this.row = cursor.row; this.col = cursor.column; var line = editor.session.getLine(this.row); - var maxRow = editor.session.getLength() - this.ch = line[this.col] || '\n' + var maxRow = editor.session.getLength(); + this.ch = line[this.col] || '\n'; this.skippedLines = 0; this.next = function() { @@ -187,7 +177,7 @@ module.exports = { else str.next(); - return {column: str.col, row: str.row} + return {column: str.col, row: str.row}; }), "b": new Motion(function(editor) { var str = new StringStream(editor); @@ -505,6 +495,9 @@ module.exports = { editor.gotoLine(count || 0); case "U": editor.gotoLine(count || 0); + case "$": + editor.navigateLineEnd(); + break; } }, sel: function(editor, range, count, param) { @@ -517,6 +510,9 @@ module.exports = { break; case "g": editor.selection.selectTo(count || 0, 0); + case "$": + editor.selection.selectLineEnd(); + break; } } }, @@ -528,7 +524,7 @@ module.exports = { content += "\n"; if (content.length) { - editor.navigateLineEnd() + editor.navigateLineEnd(); editor.insert(content); util.insertMode(editor); } From 6ef0ef3b62b5f7acbaf78d66d4f372a57c4e7fb7 Mon Sep 17 00:00:00 2001 From: nightwing Date: Thu, 30 Aug 2012 00:56:40 +0400 Subject: [PATCH 2/3] add clipboard --- lib/ace/clipboard.js | 73 ++++++++++++++++++++++++ lib/ace/clipboard_test.js | 84 ++++++++++++++++++++++++++++ lib/ace/commands/default_commands.js | 17 ++++++ lib/ace/editor.js | 11 ++-- lib/ace/keyboard/textinput.js | 7 ++- 5 files changed, 184 insertions(+), 8 deletions(-) create mode 100644 lib/ace/clipboard.js create mode 100644 lib/ace/clipboard_test.js 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(); From 4c3519de29b92bc202f8adcbd598c6c2a5939788 Mon Sep 17 00:00:00 2001 From: nightwing Date: Fri, 31 Aug 2012 12:44:00 +0400 Subject: [PATCH 3/3] fix undoManager wip --- lib/ace/edit_session.js | 13 +++++-------- lib/ace/editor.js | 13 +++++++++---- lib/ace/keyboard/textinput.js | 4 ++-- lib/ace/mouse/mouse_handler.js | 2 +- lib/ace/undomanager.js | 2 ++ 5 files changed, 19 insertions(+), 15 deletions(-) diff --git a/lib/ace/edit_session.js b/lib/ace/edit_session.js index 21d908b5..f70d75f4 100644 --- a/lib/ace/edit_session.js +++ b/lib/ace/edit_session.js @@ -246,7 +246,6 @@ var EditSession = function(text, mode) { this.selection.clearSelection(); this.$resetRowCache(0); - this.$deltas = []; this.$deltasDoc = []; this.$deltasFold = []; this.getUndoManager().reset(); @@ -343,7 +342,6 @@ var EditSession = function(text, mode) { **/ this.setUndoManager = function(undoManager) { this.$undoManager = undoManager; - this.$deltas = []; this.$deltasDoc = []; this.$deltasFold = []; @@ -358,10 +356,9 @@ var EditSession = function(text, mode) { * **/ this.$syncInformUndoManager = function() { - self.$informUndoManager.cancel(); - + var $deltas = []; if (self.$deltasFold.length) { - self.$deltas.push({ + $deltas.push({ group: "fold", deltas: self.$deltasFold }); @@ -369,17 +366,17 @@ var EditSession = function(text, mode) { } if (self.$deltasDoc.length) { - self.$deltas.push({ + $deltas.push({ group: "doc", deltas: self.$deltasDoc }); self.$deltasDoc = []; } - if (self.$deltas.length > 0) { + if ($deltas.length > 0) { undoManager.execute({ action: "aceupdate", - args: [self.$deltas, self] + args: [$deltas, self] }); } diff --git a/lib/ace/editor.js b/lib/ace/editor.js index b248975c..86057a31 100644 --- a/lib/ace/editor.js +++ b/lib/ace/editor.js @@ -84,12 +84,13 @@ var Editor = function(renderer, session) { this.keyBinding = new KeyBinding(this); // TODO detect touch event support - if (useragent.isIPad) { + /* if (useragent.isIPad) { //this.$mouseHandler = new TouchHandler(this); } else { - this.$mouseHandler = new MouseHandler(this); - new FoldHandler(this); - } + + } */ + this.$mouseHandler = new MouseHandler(this); + new FoldHandler(this); this.$blockScrolling = 0; this.$search = new Search().set({ @@ -689,6 +690,10 @@ var Editor = function(renderer, session) { this._emit("paste", text); this.insert(text); }; + + this.execCommand = function(cmd, args) { + return this.commands.exec(cmd, this, args); + }; /** * Editor.insert(text) diff --git a/lib/ace/keyboard/textinput.js b/lib/ace/keyboard/textinput.js index 13f6e798..4b31c191 100644 --- a/lib/ace/keyboard/textinput.js +++ b/lib/ace/keyboard/textinput.js @@ -145,7 +145,7 @@ var TextInput = function(parentNode, host) { var copyText = host.getCopyText(); if(copyText) { text.value = copyText; - host.onCopy(copyText); + host.execCommand("copy", copyText); } else e.preventDefault(); reset(); @@ -159,7 +159,7 @@ var TextInput = function(parentNode, host) { var copyText = host.getCopyText(); if(copyText) { text.value = copyText; - host.onCut(copyText); + host.execCommand("cut", copyText); } else e.preventDefault(); reset(); diff --git a/lib/ace/mouse/mouse_handler.js b/lib/ace/mouse/mouse_handler.js index bf708ee2..1a749917 100644 --- a/lib/ace/mouse/mouse_handler.js +++ b/lib/ace/mouse/mouse_handler.js @@ -62,7 +62,7 @@ var MouseHandler = function(editor) { var mouseTarget = editor.renderer.getMouseEventTarget(); event.addListener(mouseTarget, "click", this.onMouseEvent.bind(this, "click")); event.addListener(mouseTarget, "mousemove", this.onMouseMove.bind(this, "mousemove")); - event.addMultiMouseDownListener(mouseTarget, [300, 300, 250], this, "onMouseEvent"); + event.addMultiMouseDownListener(mouseTarget, [350, 300, 250], this, "onMouseEvent"); event.addMouseWheelListener(editor.container, this.onMouseWheel.bind(this, "mousewheel")); var gutterEl = editor.renderer.$gutter; diff --git a/lib/ace/undomanager.js b/lib/ace/undomanager.js index 67c30f38..1b92eb2b 100644 --- a/lib/ace/undomanager.js +++ b/lib/ace/undomanager.js @@ -82,6 +82,7 @@ var UndoManager = function() { * [Perform an undo operation on the document, reverting the last change. Returns the range of the undo.]{: #UndoManager.undo} **/ this.undo = function(dontSelect) { + this.$doc.$syncInformUndoManager(); var deltas = this.$undoStack.pop(); var undoSelectionRange = null; if (deltas) { @@ -99,6 +100,7 @@ var UndoManager = function() { * [Perform a redo operation on the document, reimplementing the last change.]{: #UndoManager.redo} **/ this.redo = function(dontSelect) { + this.$doc.$syncInformUndoManager(); var deltas = this.$redoStack.pop(); var redoSelectionRange = null; if (deltas) {