diff --git a/.gitignore b/.gitignore index 354d9ca3..82e61eed 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .DS_Store .settings.xml -.settings.xml.old \ No newline at end of file +.settings.xml.old +.*.gz \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index 0927bff1..acb1dc52 100644 --- a/.gitmodules +++ b/.gitmodules @@ -21,4 +21,4 @@ url = git://github.com/tautologistics/node-htmlparser.git [submodule "support/cockpit"] path = support/cockpit - url = git://github.com/joewalker/cockpit.git + url = git://github.com/ajaxorg/cockpit.git diff --git a/lib/ace/commands/default_commands.js b/lib/ace/commands/default_commands.js index 4e7d66b1..7ff66bf9 100644 --- a/lib/ace/commands/default_commands.js +++ b/lib/ace/commands/default_commands.js @@ -41,7 +41,7 @@ var canon = require("pilot/canon"); canon.addCommand({ name: "selectall", - exec: function(env, args, request) { env.selection.selectAll(); } + exec: function(env, args, request) { env.editor.getSelection().selectAll(); } }); canon.addCommand({ name: "removeline", @@ -101,7 +101,7 @@ canon.addCommand({ }); canon.addCommand({ name: "selecttostart", - exec: function(env, args, request) { env.selection.selectFileStart(); } + exec: function(env, args, request) { env.editor.getSelection().selectFileStart(); } }); canon.addCommand({ name: "gotostart", @@ -109,7 +109,7 @@ canon.addCommand({ }); canon.addCommand({ name: "selectup", - exec: function(env, args, request) { env.selection.selectUp(); } + exec: function(env, args, request) { env.editor.getSelection().selectUp(); } }); canon.addCommand({ name: "golineup", @@ -125,7 +125,7 @@ canon.addCommand({ }); canon.addCommand({ name: "selecttoend", - exec: function(env, args, request) { env.selection.selectFileEnd(); } + exec: function(env, args, request) { env.editor.getSelection().selectFileEnd(); } }); canon.addCommand({ name: "gotoend", @@ -133,7 +133,7 @@ canon.addCommand({ }); canon.addCommand({ name: "selectdown", - exec: function(env, args, request) { env.selection.selectDown(); } + exec: function(env, args, request) { env.editor.getSelection().selectDown(); } }); canon.addCommand({ name: "godown", @@ -141,7 +141,7 @@ canon.addCommand({ }); canon.addCommand({ name: "selectwordleft", - exec: function(env, args, request) { env.selection.selectWordLeft(); } + exec: function(env, args, request) { env.editor.getSelection().selectWordLeft(); } }); canon.addCommand({ name: "gotowordleft", @@ -149,7 +149,7 @@ canon.addCommand({ }); canon.addCommand({ name: "selecttolinestart", - exec: function(env, args, request) { env.selection.selectLineStart(); } + exec: function(env, args, request) { env.editor.getSelection().selectLineStart(); } }); canon.addCommand({ name: "gotolinestart", @@ -157,7 +157,7 @@ canon.addCommand({ }); canon.addCommand({ name: "selectleft", - exec: function(env, args, request) { env.selection.selectLeft(); } + exec: function(env, args, request) { env.editor.getSelection().selectLeft(); } }); canon.addCommand({ name: "gotoleft", @@ -165,7 +165,7 @@ canon.addCommand({ }); canon.addCommand({ name: "selectwordright", - exec: function(env, args, request) { env.selection.selectWordRight(); } + exec: function(env, args, request) { env.editor.getSelection().selectWordRight(); } }); canon.addCommand({ name: "gotowordright", @@ -173,7 +173,7 @@ canon.addCommand({ }); canon.addCommand({ name: "selecttolineend", - exec: function(env, args, request) { env.selection.selectLineEnd(); } + exec: function(env, args, request) { env.editor.getSelection().selectLineEnd(); } }); canon.addCommand({ name: "gotolineend", @@ -181,7 +181,7 @@ canon.addCommand({ }); canon.addCommand({ name: "selectright", - exec: function(env, args, request) { env.selection.selectRight(); } + exec: function(env, args, request) { env.editor.getSelection().selectRight(); } }); canon.addCommand({ name: "gotoright", @@ -213,7 +213,7 @@ canon.addCommand({ }); canon.addCommand({ name: "selectlinestart", - exec: function(env, args, request) { env.selection.selectLineStart(); } + exec: function(env, args, request) { env.editor.getSelection().selectLineStart(); } }); canon.addCommand({ name: "gotolinestart", @@ -221,7 +221,7 @@ canon.addCommand({ }); canon.addCommand({ name: "selectlineend", - exec: function(env, args, request) { env.selection.selectLineEnd(); } + exec: function(env, args, request) { env.editor.getSelection().selectLineEnd(); } }); canon.addCommand({ name: "gotolineend", diff --git a/lib/ace/document.js b/lib/ace/document.js index dc2389fb..e60dbbd7 100644 --- a/lib/ace/document.js +++ b/lib/ace/document.js @@ -107,7 +107,6 @@ var Document = function(text, mode) { } if (undoManager) { - //undoManager.setDocument(this); var self = this; this.$informUndoManager = lang.deferredCall(function() { if (self.$deltas.length > 0) @@ -456,6 +455,45 @@ var Document = function(text, mode) { : undefined); return end; }; + + /** + * @param rows Array[Integer] sorted list of rows + */ + this.multiRowInsert = function(rows, column, text) { + var lines = this.lines; + + for (var i=rows.length-1; i>=0; i--) { + var row = rows[i]; + if (row >= lines.length) + continue; + + var diff = column - lines[row].length; + if ( diff > 0) { + var padded = lang.stringRepeat(" ", diff) + text; + var offset = -diff; + } + else { + padded = text; + offset = 0; + } + + var end = this.$insert({row: row, column: column+offset}, padded, false); + } + + if (end) { + this.fireChangeEvent(rows[0], rows[rows.length-1] + end.row - rows[0]); + return { + rows: end.row - rows[0], + columns: end.column - column + } + } + else { + return { + rows: 0, + columns: 0 + } + } + }; this.$insertLines = function(row, lines, fromUndo) { if (lines.length == 0) @@ -552,6 +590,27 @@ var Document = function(text, mode) { return range.start; }; + this.multiRowRemove = function(rows, range) { + if (range.start.row !== rows[0]) + throw new TypeError("range must start in the first row!"); + + var height = range.end.row - rows[0]; + for (var i=rows.length-1; i>=0; i--) { + var row = rows[i]; + if (row >= this.lines.length) + continue; + + var end = this.$remove(new Range(row, range.start.column, row+height, range.end.column), false); + } + + if (end) { + if (height < 0) + this.fireChangeEvent(rows[0]+height, undefined); + else + this.fireChangeEvent(rows[0], height == 0 ? rows[rows.length-1] : undefined); + } + }; + this.$remove = function(range, fromUndo) { if (range.isEmpty()) return; diff --git a/lib/ace/test/assertions.js b/lib/ace/test/assertions.js index 1bccf3da..e4bf10ee 100644 --- a/lib/ace/test/assertions.js +++ b/lib/ace/test/assertions.js @@ -49,11 +49,7 @@ assert.range = function(range, startRow, startColumn, endRow, endColumn) { assert.position(range.end, endRow, endColumn); }; -assert.true = function(value) { - assert.equal(value, true); -} - -assert.false = function(value) { +assert["false"] = function(value) { assert.equal(value, false); } diff --git a/lib/ace/test/change_document_test.js b/lib/ace/test/change_document_test.js index 88a9591d..15484cd7 100644 --- a/lib/ace/test/change_document_test.js +++ b/lib/ace/test/change_document_test.js @@ -74,7 +74,7 @@ var Test = { assert.false(called); this.doc2.duplicateLines(0, 0); - assert.true(called); + assert.ok(called); }, "test: should use cursor of new document" : function() { @@ -104,7 +104,7 @@ var Test = { this.doc2.getSelection().moveCursorTo(1, 1); assert.position(this.editor.getCursorPosition(), 1, 1); - assert.true(called); + assert.ok(called); }, "test: should use selection of new document" : function() { @@ -134,7 +134,7 @@ var Test = { this.doc2.getSelection().selectTo(1, 1); assert.position(this.editor.getSelection().getSelectionLead(), 1, 1); - assert.true(called); + assert.ok(called); }, "test: should use mode of new document" : function() { @@ -149,7 +149,7 @@ var Test = { assert.false(called); this.doc2.setMode(new JavaScriptMode()); - assert.true(called); + assert.ok(called); } }; diff --git a/lib/ace/test/document_test.js b/lib/ace/test/document_test.js index 253ecbb8..c3bc3958 100644 --- a/lib/ace/test/document_test.js +++ b/lib/ace/test/document_test.js @@ -217,6 +217,72 @@ var Test = { assert.equal(doc.screenToDocumentColumn(0, 9), 6); assert.equal(doc.screenToDocumentColumn(0, 15), 12); assert.equal(doc.screenToDocumentColumn(0, 19), 13); + }, + + "test: insert text in multiple rows": function() { + var doc = new Document(["12", "", "abcd"]); + + var inserted = doc.multiRowInsert([0, 1, 2], 2, "juhu 1"); + assert.equal(inserted.rows, 0); + assert.equal(inserted.columns, 6); + + assert.equal(doc.toString(), ["12juhu 1", " juhu 1", "abjuhu 1cd"].join("\n")); + }, + + "test: undo insert text in multiple rows": function() { + var doc = new Document(["12", "", "abcd"]); + + var undoManager = new UndoManager(); + doc.setUndoManager(undoManager); + + doc.multiRowInsert([0, 1, 2], 2, "juhu 1"); + doc.$informUndoManager.call(); + assert.equal(doc.toString(), ["12juhu 1", " juhu 1", "abjuhu 1cd"].join("\n")); + + undoManager.undo(); + assert.equal(doc.toString(), ["12", "", "abcd"].join("\n")); + + undoManager.redo(); + assert.equal(doc.toString(), ["12juhu 1", " juhu 1", "abjuhu 1cd"].join("\n")); + }, + + "test: insert new line in multiple rows": function() { + var doc = new Document(["12", "", "abcd"]); + + var inserted = doc.multiRowInsert([0, 1, 2], 2, "\n"); + assert.equal(inserted.rows, 1); + assert.equal(doc.toString(), ["12\n", " \n", "ab\ncd"].join("\n")); + }, + + "test: insert multi line text in multiple rows": function() { + var doc = new Document(["12", "", "abcd"]); + + var inserted = doc.multiRowInsert([0, 1, 2], 2, "juhu\n12"); + assert.equal(inserted.rows, 1); + assert.equal(doc.toString(), ["12juhu\n12", " juhu\n12", "abjuhu\n12cd"].join("\n")); + }, + + "test: remove right in multiple rows" : function() { + var doc = new Document(["12", "", "abcd"]); + + doc.multiRowRemove([0, 1, 2], new Range(0, 2, 0, 3)); + assert.equal(doc.toString(), ["12", "", "abd"].join("\n")); + }, + + "test: undo remove right in multiple rows" : function() { + var doc = new Document(["12", "", "abcd"]); + var undoManager = new UndoManager(); + doc.setUndoManager(undoManager); + + doc.multiRowRemove([0, 1, 2], new Range(0, 1, 0, 3)); + doc.$informUndoManager.call(); + assert.equal(doc.toString(), ["1", "", "ad"].join("\n")); + + undoManager.undo(); + assert.equal(doc.toString(), ["12", "", "abcd"].join("\n")); + + undoManager.redo(); + assert.equal(doc.toString(), ["1", "", "ad"].join("\n")); } }; diff --git a/lib/ace/test/event_emitter_test.js b/lib/ace/test/event_emitter_test.js index c414e0b3..8d245c38 100644 --- a/lib/ace/test/event_emitter_test.js +++ b/lib/ace/test/event_emitter_test.js @@ -56,7 +56,7 @@ var Test = { }); emitter._dispatchEvent("juhu"); - assert.true(called); + assert.ok(called); } }; diff --git a/lib/ace/test/navigation_test.js b/lib/ace/test/navigation_test.js index ae69119e..84a6f1dd 100644 --- a/lib/ace/test/navigation_test.js +++ b/lib/ace/test/navigation_test.js @@ -58,8 +58,8 @@ var Test = { editor.navigateFileEnd(); var cursor = editor.getCursorPosition(); - assert.true(editor.getFirstVisibleRow() <= cursor.row); - assert.true(editor.getLastVisibleRow() >= cursor.row); + assert.ok(editor.getFirstVisibleRow() <= cursor.row); + assert.ok(editor.getLastVisibleRow() >= cursor.row); }, "test: navigate to start of file should scroll the first row into view" : function() { diff --git a/lib/ace/test/range_test.js b/lib/ace/test/range_test.js index f09d6112..3f8beab4 100644 --- a/lib/ace/test/range_test.js +++ b/lib/ace/test/range_test.js @@ -66,13 +66,13 @@ var Test = { var range = new Range(0, 20, 3, 10); var range = range.clipRows(10, 30); - assert.true(range.isEmpty()); + assert.ok(range.isEmpty()); assert.range(range, 10, 0, 10, 0); }, "test: isEmpty": function() { var range = new Range(1, 2, 1, 2); - assert.true(range.isEmpty()); + assert.ok(range.isEmpty()); var range = new Range(1, 2, 1, 6); assert.false(range.isEmpty()); @@ -83,7 +83,7 @@ var Test = { assert.false(range.isMultiLine()); var range = new Range(1, 2, 2, 6); - assert.true(range.isMultiLine()); + assert.ok(range.isMultiLine()); }, "test: clone": function() { @@ -103,11 +103,11 @@ var Test = { "test: contains for multi line ranges": function() { var range = new Range(1, 10, 5, 20); - assert.true(range.contains(1, 10)); - assert.true(range.contains(2, 0)); - assert.true(range.contains(3, 100)); - assert.true(range.contains(5, 19)); - assert.true(range.contains(5, 20)); + assert.ok(range.contains(1, 10)); + assert.ok(range.contains(2, 0)); + assert.ok(range.contains(3, 100)); + assert.ok(range.contains(5, 19)); + assert.ok(range.contains(5, 20)); assert.false(range.contains(1, 9)); assert.false(range.contains(0, 0)); @@ -117,9 +117,9 @@ var Test = { "test: contains for single line ranges": function() { var range = new Range(1, 10, 1, 20); - assert.true(range.contains(1, 10)); - assert.true(range.contains(1, 15)); - assert.true(range.contains(1, 20)); + assert.ok(range.contains(1, 10)); + assert.ok(range.contains(1, 15)); + assert.ok(range.contains(1, 20)); assert.false(range.contains(0, 9)); assert.false(range.contains(2, 9)); diff --git a/lib/ace/test/selection_test.js b/lib/ace/test/selection_test.js index 96544443..4151d519 100644 --- a/lib/ace/test/selection_test.js +++ b/lib/ace/test/selection_test.js @@ -271,7 +271,7 @@ var Test = { }); selection.moveCursorTo(0, 6); - assert.true(called); + assert.ok(called); }, "test: calling setCursor with the same position should not fire an event": function() { diff --git a/support/cockpit b/support/cockpit index 47df3c34..6024eafb 160000 --- a/support/cockpit +++ b/support/cockpit @@ -1 +1 @@ -Subproject commit 47df3c340244b15c272ed87b17cd87659f4bcd0c +Subproject commit 6024eafb2559208e8f439d6f25a609d8c020d214