/*******************************************************************************
* 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.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 SeamPdfDocumentTemplate extends SeamPdfAbstractTemplate {
private nsIDOMElement headElement;
private Element sourceElement;
public VpeCreationData create(VpePageContext pageContext, Node sourceNode,
nsIDOMDocument visualDocument) {
nsIDOMNode headNode = visualDocument.createElement(HTML.TAG_DIV);
headElement = queryInterface(headNode, nsIDOMElement.class);
sourceElement = (Element) sourceNode;
setMarginValues();
return new VpeCreationData(headElement);
}
private boolean setMarginValues(float... marginValues) {
if (marginValues.length != 4) {
return false;
}
headElement.removeAttribute("style"); //$NON-NLS-1$
headElement.setAttribute("style", "margin-left:" //$NON-NLS-1$//$NON-NLS-2$
+ Float.toString(marginValues[0]) + ";margin-right:" //$NON-NLS-1$
+ Float.toString(marginValues[1]) + ";margin-top:" //$NON-NLS-1$
+ Float.toString(marginValues[2]) + ";margin-bottom:" //$NON-NLS-1$
+ Float.toString(marginValues[3]) + ";"); //$NON-NLS-1$
return true;
}
private float[] parseMarginValues(String stringMarginValues)
throws NumberFormatException {
String[] parts = stringMarginValues.split("\\s"); //$NON-NLS-1$
float[] values = new float[parts.length];
for (int i = 0; i < parts.length; i++) {
values[i] = Float.valueOf(parts[i]);
}
return values;
}
private void setDefaultMargingValues() {
setMarginValues(36.0f, 36.0f, 36.0f, 36.0f);
}
private void setMarginValues() {
String marginsAttrValue = sourceElement
.getAttribute(SeamUtil.SEAM_ATTR_MARGINS);
try {
if (marginsAttrValue != null && !"".equals(marginsAttrValue)) { //$NON-NLS-1$
float[] floatMarginValues = parseMarginValues(marginsAttrValue);
if (!setMarginValues(floatMarginValues)) {
setDefaultMargingValues();
}
} else {
setDefaultMargingValues();
}
} catch (NumberFormatException e) {
setDefaultMargingValues();
}
}
@Override
public void validate(VpePageContext pageContext, Node sourceNode,
nsIDOMDocument visualDocument, VpeCreationData data) {
setFooter(pageContext, sourceNode, data);
}
private void setFooter(VpePageContext pageContext, Node sourceNode,
VpeCreationData data) {
nsIDOMNode[] footers = findFootersForVisualDoc(
queryInterface(data.getNode(), nsIDOMElement.class));
int footersLength = footers.length;
if (footersLength == 0) {
return;
}
nsIDOMNode visualFooter = footers[footersLength-1];
if (visualFooter != null) {
for (int i = 0; i < footers.length; i++) {
nsIDOMNode visualFootersRepresent = footers[i];
if (visualFootersRepresent != null
&& visualFootersRepresent != visualFooter) {
nsIDOMNode parentNode = visualFootersRepresent
.getParentNode();
parentNode.removeChild(visualFootersRepresent);
}
}
nsIDOMNode parentNode = visualFooter.getParentNode();
if (parentNode != null) {
parentNode.removeChild(visualFooter);
data.getNode().appendChild(visualFooter);
}
}
}
private nsIDOMNode[] findFootersForVisualDoc(nsIDOMElement visualElement) {
nsIDOMNodeList children = visualElement
.getElementsByTagName(HTML.TAG_DIV);
List<nsIDOMElement> childrenElements = new ArrayList<nsIDOMElement>();
for (int i = 0; i < children.getLength(); i++) {
nsIDOMElement childElement = queryInterface(children.item(i), nsIDOMElement.class);
String attrType = childElement
.getAttribute(SeamUtil.SEAM_ATTR_TYPE_ID);
if (attrType != null
&& SeamUtil.SEAM_ATTR_TYPE_ID_VALUE_PDF_FOOTER
.equalsIgnoreCase(attrType)) {
childrenElements.add(childElement);
}
}
return childrenElements.toArray(new nsIDOMElement[0]);
}
}