From d5ae56ea8e576d7feb952b80fd655916ef832b3e Mon Sep 17 00:00:00 2001 From: Jeff Schiller Date: Sat, 13 Nov 2010 09:58:51 +0000 Subject: [PATCH] Add tests for MoveElementCommand, InsertElementCommand and RemoveElementCommand git-svn-id: http://svg-edit.googlecode.com/svn/trunk@1867 eee81c28-f429-11dd-99c0-75d572ba1ddd --- editor/history.js | 140 +++++++++++++++++++-------- editor/svgcanvas.js | 39 +++++--- test/history_test.html | 161 +++++++++++++++++++++++++++++++- test/math_test.html | 2 +- test/svgtransformlist_test.html | 2 +- test/svgutils_test.html | 2 +- 6 files changed, 288 insertions(+), 58 deletions(-) diff --git a/editor/history.js b/editor/history.js index 5ef55ed2..6a7ee367 100644 --- a/editor/history.js +++ b/editor/history.js @@ -74,14 +74,30 @@ svgedit.history.MoveElementCommand.prototype.getText = function() { // Function: svgedit.history.MoveElementCommand.apply // Re-positions the element -svgedit.history.MoveElementCommand.prototype.apply = function() { +svgedit.history.MoveElementCommand.prototype.apply = function(handler) { + if (handler) { + handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_APPLY, this); + } + this.elem = this.newParent.insertBefore(this.elem, this.newNextSibling); + + if (handler) { + handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_APPLY, this); + } }; // Function: svgedit.history.MoveElementCommand.unapply // Positions the element back to its original location -svgedit.history.MoveElementCommand.prototype.unapply = function() { +svgedit.history.MoveElementCommand.prototype.unapply = function(handler) { + if (handler) { + handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_UNAPPLY, this); + } + this.elem = this.oldParent.insertBefore(this.elem, this.oldNextSibling); + + if (handler) { + handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_UNAPPLY, this); + } }; // Function: svgedit.history.MoveElementCommand.elements @@ -102,6 +118,7 @@ svgedit.history.InsertElementCommand = function(elem, text) { this.elem = elem; this.text = text || ("Create " + elem.tagName); this.parent = elem.parentNode; + this.nextSibling = this.elem.nextSibling; }; svgedit.history.InsertElementCommand.type = function() { return 'svgedit.history.InsertElementCommand'; } svgedit.history.InsertElementCommand.prototype.type = svgedit.history.InsertElementCommand.type; @@ -113,15 +130,31 @@ svgedit.history.InsertElementCommand.prototype.getText = function() { // Function: svgedit.history.InsertElementCommand.apply // Re-Inserts the new element -svgedit.history.InsertElementCommand.prototype.apply = function() { - this.elem = this.parent.insertBefore(this.elem, this.elem.nextSibling); +svgedit.history.InsertElementCommand.prototype.apply = function(handler) { + if (handler) { + handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_APPLY, this); + } + + this.elem = this.parent.insertBefore(this.elem, this.nextSibling); + + if (handler) { + handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_APPLY, this); + } }; // Function: svgedit.history.InsertElementCommand.unapply // Removes the element -svgedit.history.InsertElementCommand.prototype.unapply = function() { +svgedit.history.InsertElementCommand.prototype.unapply = function(handler) { + if (handler) { + handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_UNAPPLY, this); + } + this.parent = this.elem.parentNode; this.elem = this.elem.parentNode.removeChild(this.elem); + + if (handler) { + handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_UNAPPLY, this); + } }; // Function: svgedit.history.InsertElementCommand.elements @@ -137,12 +170,14 @@ svgedit.history.InsertElementCommand.prototype.elements = function() { // // Parameters: // elem - The removed DOM element -// parent - The DOM element's parent +// oldNextSibling - the DOM element's nextSibling when it was in the DOM +// oldParent - The DOM element's parent // text - An optional string visible to user related to this change -svgedit.history.RemoveElementCommand = function(elem, parent, text) { +svgedit.history.RemoveElementCommand = function(elem, oldNextSibling, oldParent, text) { this.elem = elem; this.text = text || ("Delete " + elem.tagName); - this.parent = parent; + this.nextSibling = oldNextSibling; + this.parent = oldParent; // special hack for webkit: remove this element's entry in the svgTransformLists map svgedit.transformlist.removeElementFromListMap(elem); @@ -157,19 +192,33 @@ svgedit.history.RemoveElementCommand.prototype.getText = function() { // Function: RemoveElementCommand.apply // Re-removes the new element -svgedit.history.RemoveElementCommand.prototype.apply = function() { - svgedit.transformlist.removeElementFromListMap(this.elem); +svgedit.history.RemoveElementCommand.prototype.apply = function(handler) { + if (handler) { + handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_APPLY, this); + } + svgedit.transformlist.removeElementFromListMap(this.elem); this.parent = this.elem.parentNode; this.elem = this.parent.removeChild(this.elem); + + if (handler) { + handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_APPLY, this); + } }; // Function: RemoveElementCommand.unapply // Re-adds the new element -svgedit.history.RemoveElementCommand.prototype.unapply = function() { - svgedit.transformlist.removeElementFromListMap(this.elem); +svgedit.history.RemoveElementCommand.prototype.unapply = function(handler) { + if (handler) { + handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_UNAPPLY, this); + } - this.parent.insertBefore(this.elem, this.elem.nextSibling); + svgedit.transformlist.removeElementFromListMap(this.elem); + this.parent.insertBefore(this.elem, this.nextSibling); + + if (handler) { + handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_UNAPPLY, this); + } }; // Function: RemoveElementCommand.elements @@ -209,7 +258,11 @@ svgedit.history.ChangeElementCommand.prototype.getText = function() { // Function: svgedit.history.ChangeElementCommand.apply // Performs the stored change action -svgedit.history.ChangeElementCommand.prototype.apply = function() { +svgedit.history.ChangeElementCommand.prototype.apply = function(handler) { + if (handler) { + handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_APPLY, this); + } + var bChangedTransform = false; for(var attr in this.newValues ) { if (this.newValues[attr]) { @@ -241,12 +294,21 @@ svgedit.history.ChangeElementCommand.prototype.apply = function() { } } } + + if (handler) { + handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_APPLY, this); + } + return true; }; // Function: svgedit.history.ChangeElementCommand.unapply // Reverses the stored change action -svgedit.history.ChangeElementCommand.prototype.unapply = function() { +svgedit.history.ChangeElementCommand.prototype.unapply = function(handler) { + if (handler) { + handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_UNAPPLY, this); + } + var bChangedTransform = false; for(var attr in this.oldValues ) { if (this.oldValues[attr]) { @@ -277,6 +339,10 @@ svgedit.history.ChangeElementCommand.prototype.unapply = function() { // Remove transformlist to prevent confusion that causes bugs like 575. svgedit.transformlist.removeElementFromListMap(this.elem); + if (handler) { + handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_UNAPPLY, this); + } + return true; }; @@ -312,18 +378,34 @@ svgedit.history.BatchCommand.prototype.getText = function() { // Function: svgedit.history.BatchCommand.apply // Runs "apply" on all subcommands -svgedit.history.BatchCommand.prototype.apply = function() { +svgedit.history.BatchCommand.prototype.apply = function(handler) { + if (handler) { + handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_APPLY, this); + } + var len = this.stack.length; for (var i = 0; i < len; ++i) { this.stack[i].apply(); } + + if (handler) { + handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_APPLY, this); + } }; // Function: svgedit.history.BatchCommand.unapply // Runs "unapply" on all subcommands -svgedit.history.BatchCommand.prototype.unapply = function() { +svgedit.history.BatchCommand.prototype.unapply = function(handler) { + if (handler) { + handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_UNAPPLY, this); + } + for (var i = this.stack.length-1; i >= 0; i--) { - this.stack[i].unapply(); + this.stack[i].unapply(handler); + } + + if (handler) { + handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_UNAPPLY, this); } }; @@ -425,16 +507,7 @@ svgedit.history.UndoManager.prototype.getNextRedoCommandText = function() { svgedit.history.UndoManager.prototype.undo = function() { if (this.undoStackPointer > 0) { var cmd = this.undoStack[--this.undoStackPointer]; - - if (this.handler_ != null) { - this.handler_.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_UNAPPLY, cmd); - } - - cmd.unapply(); - - if (this.handler_ != null) { - this.handler_.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_UNAPPLY, cmd); - } + cmd.unapply(this.handler_); } }; @@ -443,16 +516,7 @@ svgedit.history.UndoManager.prototype.undo = function() { svgedit.history.UndoManager.prototype.redo = function() { if (this.undoStackPointer < this.undoStack.length && this.undoStack.length > 0) { var cmd = this.undoStack[this.undoStackPointer++]; - - if (this.handler_ != null) { - this.handler_.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_APPLY, cmd); - } - - cmd.apply(); - - if (this.handler_ != null) { - this.handler_.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_APPLY, cmd); - } + cmd.apply(this.handler_); } }; diff --git a/editor/svgcanvas.js b/editor/svgcanvas.js index 22180f12..e3388d74 100644 --- a/editor/svgcanvas.js +++ b/editor/svgcanvas.js @@ -6950,7 +6950,7 @@ var convertToGroup = this.convertToGroup = function(elem) { var prev = $elem.prev(); // Remove element - batchCmd.addSubCommand(new RemoveElementCommand($elem[0], $elem[0].parentNode)); + batchCmd.addSubCommand(new RemoveElementCommand($elem[0], $elem[0].nextSibling, $elem[0].parentNode)); $elem.remove(); // See if other elements reference this symbol @@ -6980,8 +6980,9 @@ var convertToGroup = this.convertToGroup = function(elem) { if(parent) { if(!has_more) { // remove symbol/svg element + var nextSibling = elem.nextSibling; parent.removeChild(elem); - batchCmd.addSubCommand(new RemoveElementCommand(elem, parent)); + batchCmd.addSubCommand(new RemoveElementCommand(elem, nextSibling, parent)); } batchCmd.addSubCommand(new InsertElementCommand(g)); } @@ -7027,8 +7028,9 @@ this.setSvgString = function(xmlString) { var batchCmd = new BatchCommand("Change Source"); // remove old svg document + var nextSibling = svgcontent.nextSibling; var oldzoom = svgroot.removeChild(svgcontent); - batchCmd.addSubCommand(new RemoveElementCommand(oldzoom, svgroot)); + batchCmd.addSubCommand(new RemoveElementCommand(oldzoom, nextSibling, svgroot)); // set new svg document svgcontent = svgroot.appendChild(svgdoc.importNode(newDoc.documentElement, true)); @@ -7407,7 +7409,8 @@ this.deleteCurrentLayer = function() { var batchCmd = new BatchCommand("Delete Layer"); // actually delete from the DOM and store in our Undo History var parent = current_layer.parentNode; - batchCmd.addSubCommand(new RemoveElementCommand(current_layer, parent)); + var nextSibling = current_layer.nextSibling; + batchCmd.addSubCommand(new RemoveElementCommand(current_layer, nextSibling, parent)); parent.removeChild(current_layer); addCommandToHistory(batchCmd); clearSelection(); @@ -7685,12 +7688,14 @@ this.mergeLayer = function(skipHistory) { if(!prev) return; var childs = current_layer.childNodes; var len = childs.length; - batchCmd.addSubCommand(new RemoveElementCommand(current_layer, svgcontent)); + var layerNextSibling = current_layer.nextSibling; + batchCmd.addSubCommand(new RemoveElementCommand(current_layer, layerNextSibling, svgcontent)); while(current_layer.firstChild) { var ch = current_layer.firstChild; if(ch.localName == 'title') { - batchCmd.addSubCommand(new RemoveElementCommand(ch, current_layer)); + var chNextSibling = ch.nextSibling; + batchCmd.addSubCommand(new RemoveElementCommand(ch, chNextSibling, current_layer)); current_layer.removeChild(ch); continue; } @@ -7942,7 +7947,8 @@ this.setGroupTitle = function(val) { if(!val.length) { // Remove title element - batchCmd.addSubCommand(new RemoveElementCommand(ts[0], elem)); + var tsNextSibling = ts.nextSibling; + batchCmd.addSubCommand(new RemoveElementCommand(ts[0], tsNextSibling, elem)); ts.remove(); } else if(ts.length) { // Change title contents @@ -9016,7 +9022,8 @@ this.convertToPath = function(elem, getBBox) { } } - batchCmd.addSubCommand(new RemoveElementCommand(elem, parent)); + var nextSibling = elem.nextSibling; + batchCmd.addSubCommand(new RemoveElementCommand(elem, nextSibling, parent)); batchCmd.addSubCommand(new InsertElementCommand(path)); clearSelection(); @@ -9197,10 +9204,11 @@ this.deleteSelectedElements = function() { var t = selected; // this will unselect the element and remove the selectedOutline selectorManager.releaseSelector(t); + var nextSibling = t.nextSibling; var elem = parent.removeChild(t); - selectedCopy.push(selected) //for the copy + selectedCopy.push(selected); //for the copy selectedElements[i] = null; - batchCmd.addSubCommand(new RemoveElementCommand(elem, parent)); + batchCmd.addSubCommand(new RemoveElementCommand(elem, nextSibling, parent)); } if (!batchCmd.isEmpty()) addCommandToHistory(batchCmd); call("changed", selectedCopy); @@ -9224,10 +9232,11 @@ this.cutSelectedElements = function() { var t = selected; // this will unselect the element and remove the selectedOutline selectorManager.releaseSelector(t); + var nextSibling = t.nextSibling; var elem = parent.removeChild(t); - selectedCopy.push(selected) //for the copy + selectedCopy.push(selected); //for the copy selectedElements[i] = null; - batchCmd.addSubCommand(new RemoveElementCommand(elem, parent)); + batchCmd.addSubCommand(new RemoveElementCommand(elem, nextSibling, parent)); } if (!batchCmd.isEmpty()) addCommandToHistory(batchCmd); call("changed", selectedCopy); @@ -9534,7 +9543,8 @@ this.ungroupSelectedElement = function() { // Remove child title elements if(elem.tagName === 'title') { - batchCmd.addSubCommand(new RemoveElementCommand(elem, oldParent)); + var nextSibling = elem.nextSibling; + batchCmd.addSubCommand(new RemoveElementCommand(elem, nextSibling, oldParent)); oldParent.removeChild(elem); continue; } @@ -9547,8 +9557,9 @@ this.ungroupSelectedElement = function() { clearSelection(); // delete the group element (but make undo-able) + var gNextSibling = g.nextSibling; g = parent.removeChild(g); - batchCmd.addSubCommand(new RemoveElementCommand(g, parent)); + batchCmd.addSubCommand(new RemoveElementCommand(g, gNextSibling, parent)); if (!batchCmd.isEmpty()) addCommandToHistory(batchCmd); diff --git a/test/history_test.html b/test/history_test.html index 9e35611f..c446c2a1 100644 --- a/test/history_test.html +++ b/test/history_test.html @@ -3,12 +3,16 @@ - - + @@ -306,5 +453,13 @@

+ + diff --git a/test/math_test.html b/test/math_test.html index 1d71b6cc..cefa92d2 100644 --- a/test/math_test.html +++ b/test/math_test.html @@ -17,7 +17,7 @@ var svgns = 'http://www.w3.org/2000/svg'; var svg = document.createElementNS(svgns, 'svg'); - module('svgedit.math Module'); + module('svgedit.math'); test('Test svgedit.math package', function() { expect(7); diff --git a/test/svgtransformlist_test.html b/test/svgtransformlist_test.html index 85e7ae89..59276e99 100644 --- a/test/svgtransformlist_test.html +++ b/test/svgtransformlist_test.html @@ -58,7 +58,7 @@ } } - module('svgedit.svgtransformlist Module'); + module('svgedit.svgtransformlist'); test('Test svgedit.transformlist package', function() { expect(2); diff --git a/test/svgutils_test.html b/test/svgutils_test.html index 925565a2..ef0af673 100644 --- a/test/svgutils_test.html +++ b/test/svgutils_test.html @@ -20,7 +20,7 @@ var svgns = 'http://www.w3.org/2000/svg'; var svg = document.createElementNS(svgns, 'svg'); - module('svgedit.utilities Module'); + module('svgedit.utilities'); test('Test svgedit.utilities package', function() { expect(3);