/*******************************************************************************
* Copyright (c) 2007-2009 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.seam.vpe.template;
/**
* @author yzhishko
*/
import static org.jboss.tools.vpe.xulrunner.util.XPCOM.queryInterface;
import java.util.ArrayList;
import java.util.List;
import org.jboss.tools.vpe.editor.context.VpePageContext;
import org.jboss.tools.vpe.editor.template.VpeChildrenInfo;
import org.jboss.tools.vpe.editor.template.VpeCreationData;
import org.jboss.tools.vpe.editor.util.HTML;
import org.mozilla.interfaces.nsIDOMDocument;
import org.mozilla.interfaces.nsIDOMElement;
import org.mozilla.interfaces.nsIDOMNode;
import org.mozilla.interfaces.nsIDOMNodeList;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
public class SeamPdfTableTemplate extends SeamPdfAbstractTemplate {
private nsIDOMElement visualElement;
private Element sourceElement;
public VpeCreationData create(VpePageContext pageContext, Node sourceNode,
nsIDOMDocument visualDocument) {
sourceElement = (Element) sourceNode;
nsIDOMNode visualNode = visualDocument.createElement(HTML.TAG_DIV);
nsIDOMNode tableNode = visualDocument.createElement(HTML.TAG_TABLE);
nsIDOMElement visualTable = queryInterface(tableNode, nsIDOMElement.class);
visualNode.appendChild(tableNode);
visualElement = queryInterface(visualNode, nsIDOMElement.class);
visualTable.setAttribute(HTML.ATTR_WIDTH, getWidthPerc(sourceElement));
visualTable.setAttribute(HTML.ATTR_ALIGN, getAlignment(sourceElement));
visualTable.setAttribute(HTML.ATTR_CELLSPACING, "0px"); //$NON-NLS-1$
VpeCreationData creationData = new VpeCreationData(visualElement);
VpeChildrenInfo childrenInfo = new VpeChildrenInfo(visualElement);
Node[] cells = SeamUtil.getChildsByName(pageContext, sourceNode,
"p:cell"); //$NON-NLS-1$
if (cells != null) {
for (int i = 0; i < cells.length; i++) {
Node parentNode = SeamUtil.getParentByName(pageContext,
cells[i], "p:table"); //$NON-NLS-1$
if (parentNode != null && parentNode == sourceNode) {
childrenInfo.addSourceChild(cells[i]);
}
}
}
creationData.addChildrenInfo(childrenInfo);
return creationData;
}
@Override
public void validate(VpePageContext pageContext, Node sourceNode,
nsIDOMDocument visualDocument, VpeCreationData data) {
setColumns(pageContext, sourceNode, visualDocument, data);
}
private int getNumberOfColumns(Node sourceTableNode) {
int columnsNumber = 1;
Element sourceTableElement = (Element) sourceTableNode;
String columnsAttrName = "columns"; //$NON-NLS-1$
if (sourceTableElement.hasAttribute(columnsAttrName)) {
try {
String columnsNumberString = sourceTableElement.getAttribute(columnsAttrName);
columnsNumber = Integer.parseInt(columnsNumberString);
if (columnsNumber < 1) {
columnsNumber = 1;
}
} catch (NumberFormatException e) {
columnsNumber = 1;
}
} else {
columnsNumber = 1;
}
return columnsNumber;
}
private void setColumns(VpePageContext pageContext, Node sourceNode,
nsIDOMDocument visualDocument, VpeCreationData data) {
int numberOfColumns = getNumberOfColumns(sourceNode);
nsIDOMNode visualTable = (queryInterface(data.getNode(), nsIDOMElement.class))
.getElementsByTagName(HTML.TAG_TABLE).item(0);
nsIDOMNode[] visualCells = getCells(data.getNode());
if (visualCells == null) {
return;
}
int cellsLength = visualCells.length;
if (cellsLength == 0) {
return;
}
nsIDOMNode trVisualNode = visualDocument.createElement(HTML.TAG_TR);
visualTable.appendChild(trVisualNode);
int posCounter = 0;
for (int i = 0; i < cellsLength; i++) {
nsIDOMNode visualCell = visualCells[i];
nsIDOMNode parentNode = null;
if (visualCell != null) {
parentNode = visualCell.getParentNode();
}
if (parentNode != null) {
parentNode.removeChild(visualCell);
trVisualNode.appendChild(visualCell);
int colspanValue = getColspanValue(visualCell);
posCounter++;
if (colspanValue > 1 && posCounter % numberOfColumns != 0) {
int posInRow = posCounter - 1;
int numEndCells = numberOfColumns - posInRow;
if (numEndCells <= colspanValue) {
colspanValue = numEndCells;
trVisualNode = visualDocument
.createElement(HTML.TAG_TR);
visualTable.appendChild(trVisualNode);
posCounter = 0;
continue;
} else {
for (int j = 0; j < numberOfColumns - (colspanValue); j++) {
i++;
visualCell = visualCells[i];
trVisualNode.appendChild(visualCell);
}
i -= numberOfColumns - (colspanValue);
posCounter += colspanValue - 1;
}
}
}
if ((posCounter % numberOfColumns == 0) && ((i + 1) != cellsLength)) {
trVisualNode = visualDocument.createElement(HTML.TAG_TR);
visualTable.appendChild(trVisualNode);
posCounter = 0;
}
}
if (trVisualNode.getChildNodes().getLength() != numberOfColumns) {
trVisualNode.getParentNode().removeChild(trVisualNode);
}
}
private String getWidthPerc(Element sourceElement) {
String width = "100%"; //$NON-NLS-1$
if (sourceElement.hasAttribute(SeamUtil.SEAM_ATTR_WIDTH_PERCENTAGE)) {
try {
width = sourceElement.getAttribute(SeamUtil.SEAM_ATTR_WIDTH_PERCENTAGE);
int intWidth = Integer.parseInt(width);
if (intWidth < 1 || intWidth > 100) {
width = "100%"; //$NON-NLS-1$
} else {
width = Integer.toString(intWidth) + "%"; //$NON-NLS-1$
}
} catch (NumberFormatException e) {
width = "100%"; //$NON-NLS-1$
}
}
return width;
}
private String getAlignment(Element sourceElement) {
if (sourceElement.hasAttribute(SeamUtil.SEAM_ATTR_HORIZONAL_ALIGNMENT)) {
String align = sourceElement
.getAttribute(SeamUtil.SEAM_ATTR_HORIZONAL_ALIGNMENT);
for (int i = 0; i < SeamUtil.POSSIBLE_ALIGNS.length; i++) {
if (SeamUtil.POSSIBLE_ALIGNS[i].equalsIgnoreCase(align)) {
if (SeamUtil.POSSIBLE_ALIGNS[i]
.equalsIgnoreCase("justifyall")) { //$NON-NLS-1$
return HTML.VALUE_ALIGN_JUSTIFY;
}
return align;
}
}
}
return HTML.VALUE_ALIGN_CENTER;
}
private int getColspanValue(nsIDOMNode visualNode) {
int colspan = 1;
nsIDOMElement visualElement = queryInterface(visualNode, nsIDOMElement.class);
if (visualElement.hasAttribute(HTML.ATTR_COLSPAN)) {
try {
String colspanString = visualElement.getAttribute(HTML.ATTR_COLSPAN);
colspan = Integer.parseInt(colspanString);
if (colspan < 1) {
colspan = 1;
}
} catch (NumberFormatException e) {
colspan = 1;
}
}
return colspan;
}
private nsIDOMNode[] getCells(nsIDOMNode visualTable) {
nsIDOMNodeList children = visualTable.getChildNodes();
if (children == null) {
return null;
}
List<nsIDOMElement> childrenList = new ArrayList<nsIDOMElement>();
for (int i = 0; i < children.getLength(); i++) {
nsIDOMNode child = children.item(i);
if (child.getNodeType() == nsIDOMNode.ELEMENT_NODE) {
if ("TD".equals(child.getNodeName())) { //$NON-NLS-1$
childrenList.add(queryInterface(child, nsIDOMElement.class));
}
}
}
return childrenList.toArray(new nsIDOMElement[0]);
}
}