blob: 045d4a36764d95b5c6826ba7c93f36e96566ea59 [file] [log] [blame]
/*****************************************************************************
* Copyright (c) 2017 Atos.
*
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Mohamed Ali Bach Tobji (Atos) mohamed-ali.bachtobji@atos.net - - Initial API and implementation
*****************************************************************************/
package org.eclipse.gendoc.services.odt;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.emf.common.util.EList;
import org.eclipse.gendoc.documents.AbstractTableService;
import org.eclipse.gendoc.documents.IDocumentService;
import org.eclipse.gendoc.services.exception.InvalidContentException;
import org.eclipse.gendoc.tags.ITag;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.eclipse.gendoc.table.Cell;
import org.eclipse.gendoc.table.Row;
import org.eclipse.gendoc.table.Table;
public class ODTTableService extends AbstractTableService {
@Override
public String manageTable(ITag tag, IDocumentService documentService, StringBuffer returnValue, Object tableModel,
Node tableNode) throws InvalidContentException {
Node mainTable = tableNode.getFirstChild();
if (documentService.isTable(mainTable.getNodeName())) {
if (tableModel instanceof Table) {
int nbCol = ((Table) tableModel).getColCount();
String colLabel = "table:table-column";
int index_col_start = returnValue.indexOf("<" + colLabel);
returnValue.insert(index_col_start + colLabel.length() + 1,
" table:number-columns-repeated=\"" + nbCol + "\"");
Node rowNode = getChildNode(documentService.getRowLabel(), mainTable);
String rowLabel = documentService.getRowLabel();
Pattern rowPattern = Pattern.compile("<" + rowLabel + "[^<>]*>.*</" + rowLabel + ">");
Matcher rowm = rowPattern.matcher(returnValue);
int index_row_start = 0;
int index_row_end = 0;
if (rowm.find()) {
index_row_start = rowm.start();
index_row_end = returnValue.lastIndexOf("</" + rowLabel + ">");
String row = returnValue.substring(index_row_start, index_row_end + rowLabel.length() + 3);
String cellLabel = documentService.getCellLabel();
int index_cell_start = row.indexOf("<" + cellLabel);
int index_cell_end = row.lastIndexOf("</" + cellLabel + ">");
Node cellNode = getChildNode(documentService.getCellLabel(), rowNode);
if (cellNode != null) {
StringBuffer colNodetxt = new StringBuffer(documentService.asText(cellNode));
String txtLabel = "text:p";
Pattern txtPattern = Pattern.compile("<" + txtLabel + "[^<>]*>.*</" + txtLabel + ">");
Matcher txtm = txtPattern.matcher(colNodetxt);
if (txtm.find()) {
String style = "";
return generateTable(returnValue, tableModel, rowLabel, index_row_start, index_row_end, row,
cellLabel, index_cell_start, index_cell_end, colNodetxt, txtm, style, txtLabel);
}
}
}
}
}
return null;
}
private Node getChildNode(String label, Node node) {
NodeList rowChildNodes = node.getChildNodes();
for (int i = 0; i < rowChildNodes.getLength(); i++) {
Node current = rowChildNodes.item(i);
if (current.getNodeName() == label) {
return current;
}
}
return null;
}
/**
* @param returnValue
* @param tableModel
* @param rowLabel
* @param index_row_start
* @param index_row_end
* @param row
* @param colLabel
* @param index_col_start
* @param index_col_end
* @param colNodetxt
* @param txtm
* @param rows
* @param style
* @param txtLabel
* @return
*/
private String generateTable(StringBuffer returnValue, Object tableModel, String rowLabel, int index_row_start,
int index_row_end, String row, String colLabel, int index_col_start, int index_col_end,
StringBuffer colNodetxt, Matcher txtm, String style, String txtLabel) {
String rows = "";
String cells = "";
// generating table header
StringBuffer newRow = new StringBuffer(row);
cells = generateCells(((Table) tableModel).getTableheader().getCells(), colNodetxt, txtm, style, txtLabel);
newRow.replace(index_col_start, index_col_end + colLabel.length() + 3, cells);
rows += newRow.toString();
// generating table body
for (Row r : ((Table) tableModel).getRows()) {
newRow = new StringBuffer(row);
cells = generateCells(r.getCells(), colNodetxt, txtm, style, txtLabel);
newRow.replace(index_col_start, index_col_end + colLabel.length() + 3, cells);
rows += newRow.toString();
}
return returnValue.replace(index_row_start, index_row_end + rowLabel.length() + 3, rows).toString();
}
/**
* @param modelCells
* @param colNodetxt
* @param txtm
* @param style
* @param txtLabel
* @param cols
* @return
*/
private String generateCells(EList<Cell> modelCells, StringBuffer colNodetxt, Matcher txtm, String style,
String txtLabel) {
String cols = "";
for (Cell cell : modelCells) {
StringBuffer newCol;
int txtindex = txtm.end() - txtLabel.length() - 3;
newCol = new StringBuffer(colNodetxt.toString());
newCol.insert(txtindex, cell.getLabel());
cols += newCol.toString();
}
return cols;
}
}