Bug 569658 - [Model2Doc][Docx] The docx generator should be able to generate bullet list
* create a CustomXWPFParagraph to be able to set the numIlvl value
* add numbering in the template
Signed-off-by: Pauline DEVILLE <pauline.deville@cea.fr>
Change-Id: Ifecb36deb164832a994854b49f3c24a0d1f6a4e0
diff --git a/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/internal/poi/CustomXWPFDocument.java b/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/internal/poi/CustomXWPFDocument.java
index 2e0a15c..a5a48b9 100755
--- a/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/internal/poi/CustomXWPFDocument.java
+++ b/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/internal/poi/CustomXWPFDocument.java
@@ -109,4 +109,17 @@
return table;
}
+ /**
+ * Appends a new {@link CustomXWPFParagraph} to this document
+ *
+ * @return the new customXWPFParagraph
+ */
+ @Override
+ public XWPFParagraph createParagraph() {
+ XWPFParagraph p = new CustomXWPFParagraph(getDocument().getBody().addNewP(), this);
+ bodyElements.add(p);
+ paragraphs.add(p);
+ return p;
+ }
+
}
diff --git a/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/internal/poi/CustomXWPFParagraph.java b/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/internal/poi/CustomXWPFParagraph.java
new file mode 100755
index 0000000..21ad468
--- /dev/null
+++ b/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/internal/poi/CustomXWPFParagraph.java
@@ -0,0 +1,58 @@
+/*****************************************************************************
+ * Copyright (c) 2020 CEA LIST and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Pauline DEVILLE (CEA LIST) pauline.deville@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.model2doc.docx.internal.poi;
+
+import java.math.BigInteger;
+
+import org.apache.poi.xwpf.usermodel.IBody;
+import org.apache.poi.xwpf.usermodel.XWPFParagraph;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
+
+/**
+ * This custom implementation allow to add some missing methods in the apache api
+ */
+public class CustomXWPFParagraph extends XWPFParagraph {
+
+ /**
+ * Constructor.
+ *
+ * @param prgrph
+ * @param part
+ */
+ public CustomXWPFParagraph(CTP prgrph, IBody part) {
+ super(prgrph, part);
+ }
+
+ /**
+ * set numIlvl of Paragraph
+ *
+ * @param itemLevel
+ * the new value of the numIlvl
+ */
+ public void setItemLevel(int itemLevel) {
+ if (getCTP().getPPr() == null) {
+ getCTP().addNewPPr();
+ }
+ if (getCTP().getPPr().getNumPr() == null) {
+ getCTP().getPPr().addNewNumPr();
+ }
+ if (getCTP().getPPr().getNumPr().getIlvl() == null) {
+ getCTP().getPPr().getNumPr().addNewIlvl();
+ }
+ getCTP().getPPr().getNumPr().getIlvl().setVal(BigInteger.valueOf(itemLevel));
+ }
+
+}
diff --git a/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/internal/services/StyleServiceImpl.java b/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/internal/services/StyleServiceImpl.java
index 92b6024..986fd47 100755
--- a/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/internal/services/StyleServiceImpl.java
+++ b/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/internal/services/StyleServiceImpl.java
@@ -115,6 +115,18 @@
}
/**
+ * @see org.eclipse.papyrus.model2doc.docx.services.StyleService#applyListStyle(org.apache.poi.xwpf.usermodel.XWPFParagraph)
+ *
+ * @param paragraph
+ * @return
+ */
+ @Override
+ public boolean applyListStyle(XWPFParagraph paragraph) {
+ String style = getListStyleValue();
+ return applyStyle(paragraph, style);
+ }
+
+ /**
*
* @see org.eclipse.papyrus.model2doc.docx.services.StyleService#applyStyle(org.apache.poi.xwpf.usermodel.XWPFParagraph, java.lang.String)
*
@@ -177,4 +189,14 @@
public String getCaptionStyleValue() {
return StyleConstants.CAPTION_STYLE_VALUE;
}
+
+ /**
+ * @see org.eclipse.papyrus.model2doc.docx.services.StyleService#getListStyleValue()
+ *
+ * @return
+ */
+ @Override
+ public String getListStyleValue() {
+ return StyleConstants.LIST_STYLE_VALUE;
+ }
}
diff --git a/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/internal/transcription/DocxTranscription.java b/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/internal/transcription/DocxTranscription.java
index cd2d1a2..d2a5f9a 100755
--- a/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/internal/transcription/DocxTranscription.java
+++ b/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/internal/transcription/DocxTranscription.java
@@ -21,6 +21,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
@@ -36,11 +37,15 @@
import org.eclipse.core.runtime.Assert;
import org.eclipse.osgi.util.NLS;
import org.eclipse.papyrus.model2doc.core.author.IAuthor;
+import org.eclipse.papyrus.model2doc.core.builtintypes.AbstractList;
import org.eclipse.papyrus.model2doc.core.builtintypes.AbstractTable;
+import org.eclipse.papyrus.model2doc.core.builtintypes.BasicList;
import org.eclipse.papyrus.model2doc.core.builtintypes.Cell;
import org.eclipse.papyrus.model2doc.core.builtintypes.IFileReference;
+import org.eclipse.papyrus.model2doc.core.builtintypes.ListItem;
import org.eclipse.papyrus.model2doc.core.builtintypes.Row;
import org.eclipse.papyrus.model2doc.core.builtintypes.TextCell;
+import org.eclipse.papyrus.model2doc.core.builtintypes.TextListItem;
import org.eclipse.papyrus.model2doc.core.generatorconfiguration.IDocumentGeneratorConfiguration;
import org.eclipse.papyrus.model2doc.core.generatorconfiguration.operations.GeneratorConfigurationOperations;
import org.eclipse.papyrus.model2doc.core.styles.BooleanNamedStyle;
@@ -51,6 +56,7 @@
import org.eclipse.papyrus.model2doc.docx.Activator;
import org.eclipse.papyrus.model2doc.docx.Messages;
import org.eclipse.papyrus.model2doc.docx.internal.poi.CustomXWPFDocument;
+import org.eclipse.papyrus.model2doc.docx.internal.poi.CustomXWPFParagraph;
import org.eclipse.papyrus.model2doc.docx.internal.poi.CustomXWPFTable;
import org.eclipse.papyrus.model2doc.docx.internal.services.StyleServiceImpl;
import org.eclipse.papyrus.model2doc.docx.internal.util.ImageUtils;
@@ -200,9 +206,44 @@
}
@Override
- public void writeList(org.eclipse.papyrus.model2doc.core.builtintypes.AbstractList list, boolean processRichText) {
- // TODO Auto-generated method stub
+ public void writeList(AbstractList abstractList, boolean processRichText) {
+ if (false == abstractList instanceof BasicList) {
+ Activator.log.warn(NLS.bind("The list of type {0} is not supported by {1}.", abstractList.eClass().getName(), getClass().getName())); //$NON-NLS-1$
+ return;
+ }
+ final BasicList basicList = (BasicList) abstractList;
+ final Iterator<ListItem> iter = basicList.getItems().iterator();
+ while (iter.hasNext()) {
+ writeListItem(iter.next());
+ }
+ }
+ /**
+ * Write the list for the given item
+ *
+ * @param listItem
+ * the item to write
+ */
+ private void writeListItem(ListItem listItem) {
+ final int itemLevel = listItem.getLevel();
+ if (false == listItem instanceof TextListItem) {
+ Activator.log.warn(NLS.bind("The list item of type {0} is not supported by {1}.", listItem.eClass().getName(), getClass().getName())); //$NON-NLS-1$
+ return;
+ }
+ XWPFParagraph paragraph = document.createParagraph();
+ paragraph.setNumID(BigInteger.ONE); // this correspond to the id of the abstractNum which is in the numbering file it start at 1
+ if (paragraph instanceof CustomXWPFParagraph) {
+ ((CustomXWPFParagraph) paragraph).setItemLevel(itemLevel - 1);
+ }
+ XWPFRun run = paragraph.createRun();
+ run.setText(((TextListItem) listItem).getText());
+
+ styleService.applyListStyle(paragraph);
+
+ final Iterator<ListItem> subItemIterator = listItem.getSubItems().iterator();
+ while (subItemIterator.hasNext()) {
+ writeListItem(subItemIterator.next());
+ }
}
@Override
diff --git a/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/internal/util/StyleConstants.java b/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/internal/util/StyleConstants.java
index 395ccb6..814f676 100755
--- a/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/internal/util/StyleConstants.java
+++ b/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/internal/util/StyleConstants.java
@@ -38,6 +38,8 @@
public static final String NO_HEADER_STYLE_VALUE = "TableWithoutHeader"; //$NON-NLS-1$
+ public static final String LIST_STYLE_VALUE = "Paragraphedeliste"; //$NON-NLS-1$
+
/**
* Constructor.
*
diff --git a/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/services/StyleService.java b/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/services/StyleService.java
index b1d4a49..e31d6bf 100755
--- a/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/services/StyleService.java
+++ b/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/services/StyleService.java
@@ -54,6 +54,15 @@
boolean applyTableStyle(XWPFTable xwpfTable, XWPFDocument document, AbstractTable tableDescription);
/**
+ * Apply the list style
+ *
+ * @param paragraph
+ * the paragraph on which the list style will be applied
+ * @return true if the style has been find, false otherwise
+ */
+ boolean applyListStyle(XWPFParagraph paragraph);
+
+ /**
* Apply the caption style to the paragraph
*
* @param paragraph
@@ -105,4 +114,11 @@
*/
String getCaptionStyleValue();
+ /**
+ * Get the list style name
+ *
+ * @return the list style name
+ */
+ String getListStyleValue();
+
}
\ No newline at end of file
diff --git a/plugins/docx/org.eclipse.papyrus.model2doc.docx/templates/PapyrusTemplate.dotx b/plugins/docx/org.eclipse.papyrus.model2doc.docx/templates/PapyrusTemplate.dotx
index 898eb40..ef14463 100755
--- a/plugins/docx/org.eclipse.papyrus.model2doc.docx/templates/PapyrusTemplate.dotx
+++ b/plugins/docx/org.eclipse.papyrus.model2doc.docx/templates/PapyrusTemplate.dotx
Binary files differ