Bug 478883 - gendrop drop in table is causing generated file to be in
error

Change-Id: If489f630dcd02da2fe89ea815b17414e7e88f0d7
Signed-off-by: Antonio Campesino <antonio.campesino.robles@ericsson.com>
diff --git a/plugins/org.eclipse.gendoc.documents/src/org/eclipse/gendoc/documents/IDocumentService.java b/plugins/org.eclipse.gendoc.documents/src/org/eclipse/gendoc/documents/IDocumentService.java
index 5ff814e..070544b 100644
--- a/plugins/org.eclipse.gendoc.documents/src/org/eclipse/gendoc/documents/IDocumentService.java
+++ b/plugins/org.eclipse.gendoc.documents/src/org/eclipse/gendoc/documents/IDocumentService.java
@@ -9,7 +9,8 @@
  *
  * Contributors:
  *  Caroline Bourdeu d'Aguerre (Atos Origin) caroline.bourdeudaguerre@atosorigin.com - Initial API and implementation
- *
+ *  Antonio Campesino Robles (Ericsson) - Bug 478883
+ * 
  *****************************************************************************/
 package org.eclipse.gendoc.documents;
 
@@ -92,6 +93,8 @@
     
     boolean isRow(String label);
     
+    boolean isCell(String label);
+
     String getListLabel();
     
     String getListId(Node n);
diff --git a/plugins/org.eclipse.gendoc.services.docx/src/org/eclipse/gendoc/services/docx/DOCXDocumentService.java b/plugins/org.eclipse.gendoc.services.docx/src/org/eclipse/gendoc/services/docx/DOCXDocumentService.java
index 0893b13..6251310 100644
--- a/plugins/org.eclipse.gendoc.services.docx/src/org/eclipse/gendoc/services/docx/DOCXDocumentService.java
+++ b/plugins/org.eclipse.gendoc.services.docx/src/org/eclipse/gendoc/services/docx/DOCXDocumentService.java
@@ -9,6 +9,7 @@
  *
  * Contributors:
  *  Anne Haugommard (Atos Origin) anne.haugommard@atosorigin.com - Initial API and implementation
+ *  Antonio Campesino Robles (Ericsson) - Bug 478883
  *
  *****************************************************************************/
 package org.eclipse.gendoc.services.docx;
@@ -108,6 +109,11 @@
         return "w:tr".equals(label);
     }
 
+    public boolean isCell(String label)
+    {
+        return "w:tc".equals(label);
+    }
+
     public String getTextStyle()
     {
         return "w:t";
diff --git a/plugins/org.eclipse.gendoc.services.odt/src/org/eclipse/gendoc/services/odt/ODTDocumentService.java b/plugins/org.eclipse.gendoc.services.odt/src/org/eclipse/gendoc/services/odt/ODTDocumentService.java
index 06c8ed2..6579ec3 100644
--- a/plugins/org.eclipse.gendoc.services.odt/src/org/eclipse/gendoc/services/odt/ODTDocumentService.java
+++ b/plugins/org.eclipse.gendoc.services.odt/src/org/eclipse/gendoc/services/odt/ODTDocumentService.java
@@ -9,7 +9,8 @@
  *
  * Contributors:
  *  Anne Haugommard (Atos Origin) anne.haugommard@atosorigin.com - Initial API and implementation
- *
+ *  Antonio Campesino Robles (Ericsson) - Bug 478883
+ * 
  *****************************************************************************/
 package org.eclipse.gendoc.services.odt;
 
@@ -101,6 +102,11 @@
         return "table:table-row".equals(label);
     }
 
+    public boolean isCell(String label)
+    {
+        return "table:table-cell".equals(label);
+    }
+
     public String getTextStyle()
     {
         return "(text:p|text:h|text:span)";
diff --git a/plugins/org.eclipse.gendoc.services.pptx/src/org/eclipse/gendoc/services/pptx/PPTXDocumentService.java b/plugins/org.eclipse.gendoc.services.pptx/src/org/eclipse/gendoc/services/pptx/PPTXDocumentService.java
index e7b1541..35e8e44 100644
--- a/plugins/org.eclipse.gendoc.services.pptx/src/org/eclipse/gendoc/services/pptx/PPTXDocumentService.java
+++ b/plugins/org.eclipse.gendoc.services.pptx/src/org/eclipse/gendoc/services/pptx/PPTXDocumentService.java
@@ -8,7 +8,8 @@
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
- *  Antonio Campesino (Ericsson) antonio.campesino.robles@ericsson.com - Initial API and implementation
+ *  Antonio Campesino (Ericsson) antonio.campesino.robles@ericsson.com - Initial API and implementation,
+ *  	 Bug 478883
  *
  *****************************************************************************/
 package org.eclipse.gendoc.services.pptx;
@@ -184,6 +185,10 @@
 		return false;
 	}
 
+	@Override
+	public boolean isCell(String label) {
+		return false;
+	}
 	
 	// TODO: The nobr tag can not use pattern matching as the pptx format use <t> tags with 
 	// xml:space="preserve" or by default preserve blanks.
diff --git a/plugins/org.eclipse.gendoc.services.xlsx/src/org/eclipse/gendoc/services/xlsx/XLSXDocumentService.java b/plugins/org.eclipse.gendoc.services.xlsx/src/org/eclipse/gendoc/services/xlsx/XLSXDocumentService.java
index a197ba4..a1bc9a6 100644
--- a/plugins/org.eclipse.gendoc.services.xlsx/src/org/eclipse/gendoc/services/xlsx/XLSXDocumentService.java
+++ b/plugins/org.eclipse.gendoc.services.xlsx/src/org/eclipse/gendoc/services/xlsx/XLSXDocumentService.java
@@ -8,7 +8,8 @@
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
- *  Antonio Campesino (Ericsson) antonio.campesino.robles@ericsson.com - Initial API and implementation
+ *  Antonio Campesino (Ericsson) antonio.campesino.robles@ericsson.com - Initial API and implementation,
+ *  	 Bug 478883
  *
  *****************************************************************************/
 package org.eclipse.gendoc.services.xlsx;
@@ -192,6 +193,10 @@
 		return false;
 	}
 
+	@Override
+	public boolean isCell(String label) {
+		return false;
+	}
 	
 	// TODO: The nobr tag can not use pattern matching as the xlsx format use <t> tags with 
 	// xml:space="preserve" or by default preserve blanks.
diff --git a/plugins/org.eclipse.gendoc.tags.handlers/src/org/eclipse/gendoc/tags/handlers/impl/post/DropTagProcess.java b/plugins/org.eclipse.gendoc.tags.handlers/src/org/eclipse/gendoc/tags/handlers/impl/post/DropTagProcess.java
index 29f69a8..518d0aa 100644
--- a/plugins/org.eclipse.gendoc.tags.handlers/src/org/eclipse/gendoc/tags/handlers/impl/post/DropTagProcess.java
+++ b/plugins/org.eclipse.gendoc.tags.handlers/src/org/eclipse/gendoc/tags/handlers/impl/post/DropTagProcess.java
@@ -9,6 +9,7 @@
  * 
  * Contributors:
  * Kris Robertson (Atos Origin) kris.robertson@atosorigin.com - Initial API and implementation
+ * Antonio Campesino Robles (Ericsson) - Bug 478883
  * 
  *****************************************************************************/
 package org.eclipse.gendoc.tags.handlers.impl.post;
@@ -18,6 +19,7 @@
 
 import org.eclipse.gendoc.document.parser.documents.Document;
 import org.eclipse.gendoc.document.parser.documents.Document.PROPERTY;
+import org.eclipse.gendoc.document.parser.documents.helper.XMLHelper;
 import org.eclipse.gendoc.documents.IDocumentService;
 import org.eclipse.gendoc.process.AbstractStepProcess;
 import org.eclipse.gendoc.services.GendocServices;
@@ -54,9 +56,52 @@
 		if (documentService.isPara(currentNode.getNodeName())) {
 			String text = (String)document.get(PROPERTY.text);
 			if (text != null && DROP_TAG_PATTERN.matcher(text).find()) {
+				Node parent = currentNode.getParentNode();
+				if (parent != null && documentService.isCell(parent.getNodeName()) && !hasSiblingParas(currentNode)) {
+					// Avoid remove the only paragraph inside the cell. We just clean it up. 
+					cleanTextNodes(document, currentNode);
+					document.getXMLParser().setCurrentNode(currentNode);
+					return;
+				}
 				nodesToRemove.add(currentNode);
 			}
 		}
 	}
+	
+	private boolean hasSiblingParas(Node n) {
+		Node sib = n.getPreviousSibling();
+		while (sib != null) {
+			if (documentService.isPara(sib.getNodeName()))
+				return true;
+			sib = sib.getPreviousSibling();
+		}
+		
+		sib = n.getNextSibling();
+		while (sib != null) {
+			if (documentService.isPara(sib.getNodeName()))
+				return true;
+			sib = sib.getNextSibling();
+		}
+		return false;
+	}
 
+	private void cleanTextNodes(Document doc, Node para) {
+		String text = (String)doc.get(PROPERTY.text);
+		if (!doc.next())
+			return;
+		Node n = doc.getXMLParser().getCurrentNode();
+ 
+		while (XMLHelper.isAncestor(n, para)) {
+			String value = n.getNodeValue();
+			if (value != null && text.startsWith(value)) {
+				text = text.substring(value.length());
+				n.setNodeValue("");
+			}
+			if (!doc.next())
+				return;
+			n = doc.getXMLParser().getCurrentNode();
+		}
+		
+	}
+	
 }