CopyVisitor is a INodeVisitorWithResult

Signed-off-by: Florian Thienel <florian@thienel.org>
diff --git a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/dom/CopyVisitorTest.java b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/dom/CopyVisitorTest.java
index 85f0bfd..7237f9d 100644
--- a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/dom/CopyVisitorTest.java
+++ b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/dom/CopyVisitorTest.java
@@ -50,9 +50,7 @@
 		element.declareNamespace("ns1", "additionalNamespaceUri1");

 		element.declareNamespace("ns2", "additionalNamespaceUri2");

 

-		final CopyVisitor copyVisitor = new CopyVisitor();

-		element.accept(copyVisitor);

-		final Element copy = copyVisitor.getCopy();

+		final Element copy = (Element) element.accept(new CopyVisitor());

 

 		assertEquals(new QualifiedName(null, "element"), copy.getQualifiedName());

 		assertEquals(2, copy.getAttributes().size());

@@ -69,8 +67,7 @@
 		final Text text = new Text(null, new GapContent(1), new Range(0, 0));

 

 		final CopyVisitor copyVisitor = new CopyVisitor();

-		text.accept(copyVisitor);

 

-		assertNull(copyVisitor.getCopy());

+		assertNull(text.accept(copyVisitor));

 	}

 }

diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/CopyVisitor.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/CopyVisitor.java
index 3ab90bf..1d56b35 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/CopyVisitor.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/CopyVisitor.java
@@ -16,19 +16,17 @@
  * 

  * @author Florian Thienel

  */

-public class CopyVisitor implements INodeVisitor {

+public class CopyVisitor implements INodeVisitorWithResult<Node> {

 

-	private Node copy;

-

-	public void visit(final Document document) {

+	public Document visit(final Document document) {

 		throw new UnsupportedOperationException("Document cannot be copied");

 	}

 

-	public void visit(final DocumentFragment fragment) {

+	public DocumentFragment visit(final DocumentFragment fragment) {

 		throw new UnsupportedOperationException("DocumentFragment cannot be copied");

 	}

 

-	public void visit(final Element element) {

+	public Element visit(final Element element) {

 		final Element copyElement = new Element(element.getQualifiedName());

 

 		for (final Attribute attribute : element.getAttributes()) {

@@ -41,24 +39,16 @@
 			copyElement.declareNamespace(prefix, element.getNamespaceURI(prefix));

 		}

 

-		copy = copyElement;

+		return copyElement;

 	}

 

-	public void visit(final Text text) {

+	public Text visit(final Text text) {

 		// ignore Text nodes because they are created dynamically in Element.getChildNodes()

-		copy = null;

+		return null;

 	}

 

-	public void visit(final Comment comment) {

-		copy = new Comment();

-	}

-

-	/**

-	 * @return the copy of the visited node

-	 */

-	@SuppressWarnings("unchecked")

-	public <T extends Node> T getCopy() {

-		return (T) copy;

+	public Comment visit(final Comment comment) {

+		return new Comment();

 	}

 

 }

diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/DeepCopyVisitor.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/DeepCopyVisitor.java
index 2d6fe73..c11d7c7 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/DeepCopyVisitor.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/dom/DeepCopyVisitor.java
@@ -60,9 +60,9 @@
 		associate(comment, copy);

 	}

 

+	@SuppressWarnings("unchecked")

 	private <T extends Node> T copy(final T node) {

-		node.accept(copyVisitor);

-		return copyVisitor.<T> getCopy();

+		return (T) node.accept(copyVisitor);

 	}

 

 	private void addToParent(final Node node) {

diff --git a/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/handlers/AbstractAddColumnHandler.java b/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/handlers/AbstractAddColumnHandler.java
index de6d6ea..78bc626 100644
--- a/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/handlers/AbstractAddColumnHandler.java
+++ b/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/handlers/AbstractAddColumnHandler.java
@@ -68,8 +68,7 @@
 				finalOffset = element.getStartOffset() + 1;
 			}
 			widget.moveTo(addBefore() ? element.getStartOffset() : element.getEndOffset() + 1);
-			element.accept(copyVisitor);
-			widget.insertElement(copyVisitor.<Element> getCopy());
+			widget.insertElement((Element) element.accept(copyVisitor));
 		}
 
 		if (finalOffset != -1) {
diff --git a/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/handlers/AbstractAddRowHandler.java b/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/handlers/AbstractAddRowHandler.java
index 8cd2ed1..b37dd2b 100644
--- a/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/handlers/AbstractAddRowHandler.java
+++ b/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/handlers/AbstractAddRowHandler.java
@@ -93,15 +93,13 @@
 		final CopyVisitor copyVisitor = new CopyVisitor();
 		for (final RowCells rowCells : rowCellsToInsert) {
 			if (rowCells.row instanceof Element) {
-				((Element) rowCells.row).accept(copyVisitor);
-				widget.insertElement(copyVisitor.<Element> getCopy());
+				widget.insertElement((Element) ((Element) rowCells.row).accept(copyVisitor));
 			}
 
 			//cells that are to be inserted.
 			for (final Object cell : rowCells.cells) {
 				if (cell instanceof Element) {
-					((Element) cell).accept(copyVisitor);
-					widget.insertElement(copyVisitor.<Element> getCopy());
+					widget.insertElement((Element) ((Element) cell).accept(copyVisitor));
 					widget.moveBy(+1);
 				} else {
 					widget.insertText(" ");
diff --git a/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/handlers/SplitBlockElementHandler.java b/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/handlers/SplitBlockElementHandler.java
index 5e9f435..07e5cb0 100644
--- a/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/handlers/SplitBlockElementHandler.java
+++ b/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/handlers/SplitBlockElementHandler.java
@@ -101,8 +101,7 @@
 					for (int i = children.size() - 1; i >= 0; i--) {
 						child = children.get(i);
 						final DocumentFragment frag = frags.get(i);
-						child.accept(copyVisitor);
-						vexWidget.insertElement(copyVisitor.<Element> getCopy());
+						vexWidget.insertElement((Element) child.accept(copyVisitor));
 						final int offset = vexWidget.getCaretOffset();
 						if (frag != null) {
 							vexWidget.insertFragment(frag);
diff --git a/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/handlers/VexHandlerUtil.java b/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/handlers/VexHandlerUtil.java
index 4dd53e4..fb24915 100644
--- a/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/handlers/VexHandlerUtil.java
+++ b/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/handlers/VexHandlerUtil.java
@@ -117,8 +117,7 @@
 							firstCellIsAnonymous = true;
 						}
 					} else {
-						cells[i].getNode().accept(copyVisitor);
-						vexWidget.insertElement(copyVisitor.<Element> getCopy());
+						vexWidget.insertElement((Element) cells[i].getNode().accept(copyVisitor));
 						vexWidget.moveBy(+1);
 					}
 				}
@@ -151,8 +150,7 @@
 				if (!tr.isAnonymous()) {
 					vexWidget.moveBy(+1); // Move past sentinel in current row
 					final CopyVisitor copyVisitor = new CopyVisitor();
-					tr.getNode().accept(copyVisitor);
-					vexWidget.insertElement(copyVisitor.<Element> getCopy());
+					vexWidget.insertElement((Element) tr.getNode().accept(copyVisitor));
 				}
 
 				cloneTableCells(vexWidget, tr, true);