/*******************************************************************************
* 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;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.jboss.tools.jst.web.tld.TaglibData;
import org.jboss.tools.seam.vpe.SeamTemplatesActivator;
import org.jboss.tools.vpe.editor.context.VpePageContext;
import org.jboss.tools.vpe.editor.template.VpeTemplateManager;
import org.jboss.tools.vpe.editor.util.HTML;
import org.jboss.tools.vpe.editor.util.XmlUtil;
import org.mozilla.interfaces.nsIDOMElement;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* Class contains Seam tags, general attributes and static methods usually used
* in Seam template classes.
*
* @author dmaliarevich
*
*/
public class SeamUtil {
public static final String ATTR_TEMPLATE = "template"; //$NON-NLS-1$
public static final String ATTR_STYLE_CLASS = "styleClass"; //$NON-NLS-1$
public static final String ATTR_URL = "url"; //$NON-NLS-1$
public final static String SEAM_ATTR_MARGINS = "margins"; //$NON-NLS-1$
public final static String[] POSSIBLE_ALIGNS = new String[] { "left", //$NON-NLS-1$
"right", "center", "justify", "justifyall" }; //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$//$NON-NLS-4$
public final static String SEAM_ATTR_ALIGNMENT = "alignment"; //$NON-NLS-1$
public final static String SEAM_DIV_BASIC_STYLE_VALUE = "line-height: 142.0pt; font-family: unknown;"; //$NON-NLS-1$
public final static String SEAM_SPAN_BASIC_STYLE_VALUE = "font-family: unknown;"; //$NON-NLS-1$
public final static String SEAM_ATTR_HORIZONAL_ALIGNMENT = "horizontalAlignment"; //$NON-NLS-1$
public final static String SEAM_ATTR_VERTICAL_ALIGNMENT = "verticalAlignment"; //$NON-NLS-1$
public final static String SEAM_ATTR_WIDTH_PERCENTAGE = "widthPercentage"; //$NON-NLS-1$
public final static String SEAM_ATTR_TYPE_ID_VALUE_PDF_TITLE = "pdf-title"; //$NON-NLS-1$
public final static String SEAM_ATTR_TYPE_ID = "TYPEID"; //$NON-NLS-1$
public final static String SEAM_ATTR_TYPE_ID_VALUE_PDF_FOOTER = "pdf-footer"; //$NON-NLS-1$
public static Node getParentByName(VpePageContext pageContext,
Node sourceNode, String parentName) {
Node parentNode = sourceNode.getParentNode();
VpeTemplateManager templateManager = VpeTemplateManager.getInstance();
while (parentNode != null) {
if (parentName.equals(
templateManager.getTemplateName(pageContext, parentNode))) {
return parentNode;
}
parentNode = parentNode.getParentNode();
}
return null;
}
public static void setAlignment(Element sourceElement,
nsIDOMElement visualElement) {
if (sourceElement.hasAttribute(SeamUtil.SEAM_ATTR_ALIGNMENT)) {
String align = sourceElement.getAttribute(SeamUtil.SEAM_ATTR_ALIGNMENT);
visualElement.setAttribute(HTML.ATTR_ALIGN, HTML.VALUE_ALIGN_LEFT);
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$
visualElement.setAttribute(HTML.ATTR_ALIGN,
HTML.VALUE_ALIGN_JUSTIFY);
return;
}
visualElement.setAttribute(HTML.ATTR_ALIGN,
SeamUtil.POSSIBLE_ALIGNS[i]);
return;
}
}
}
}
public static void getChildsByName(VpePageContext pageContext,
Node sourceNode, String childName, List<Node> childNodes) {
NodeList children = sourceNode.getChildNodes();
if (children != null) {
for (int i = 0; i < children.getLength(); i++) {
Node childNode = children.item(i);
String childSourcePrefix = childNode.getPrefix();
if (childSourcePrefix == null) {
childSourcePrefix = ""; //$NON-NLS-1$
}
List<TaglibData> taglibs = XmlUtil.getTaglibsForNode(childNode,
pageContext);
TaglibData sourceNodeTaglib = XmlUtil.getTaglibForPrefix(
childSourcePrefix, taglibs);
String childNodeName = childNode.getNodeName();
if (sourceNodeTaglib != null) {
String sourceNodeUri = sourceNodeTaglib.getUri();
String templateTaglibPrefix = VpeTemplateManager
.getInstance().getTemplateTaglibPrefix(
sourceNodeUri);
if (templateTaglibPrefix != null) {
childNodeName = templateTaglibPrefix
+ ":" + childNode.getLocalName(); //$NON-NLS-1$
}
}
if (childNodeName.equals(childName)) {
childNodes.add(childNode);
}
getChildsByName(pageContext, childNode, childName, childNodes);
}
}
}
public static Node[] getChildsByName(VpePageContext pageContext,
Node sourceNode, String childName) {
List<Node> footerNodes = new ArrayList<Node>(0);
getChildsByName(pageContext, sourceNode, childName, footerNodes);
return footerNodes.toArray(new Node[0]);
}
public static String getStyleAttr(Node sourceFontNode) {
if (sourceFontNode == null
|| !sourceFontNode.getNodeName().endsWith("font")) { //$NON-NLS-1$
return null;
}
String styleAttrValue = getFontFamily(sourceFontNode)
+ getSize(sourceFontNode) + parseFontStyleValue(sourceFontNode);
return styleAttrValue;
}
private static String parseFontStyleValue(Node sourceFontNode) {
StringBuilder styleAttrValue = new StringBuilder(); //$NON-NLS-1$
Element sourceFontElement = (Element) sourceFontNode;
if (sourceFontElement.hasAttribute(HTML.ATTR_STYLE)) {
String stringValueToParse = sourceFontElement.getAttribute(HTML.ATTR_STYLE);
int boldPos = stringValueToParse.indexOf("bold"); //$NON-NLS-1$
if (boldPos != -1) {
styleAttrValue.append(" font-weight : bold;"); //$NON-NLS-1$
}
int italicPos = stringValueToParse.indexOf("italic"); //$NON-NLS-1$
if (italicPos != -1) {
styleAttrValue.append(" font-style : italic;"); //$NON-NLS-1$
}
int underLinePos = stringValueToParse.indexOf("underline"); //$NON-NLS-1$
if (underLinePos != -1) {
styleAttrValue.append(" text-decoration : underline;"); //$NON-NLS-1$
}
int lineThroughPos = stringValueToParse.indexOf("line-through"); //$NON-NLS-1$
if (lineThroughPos != -1) {
styleAttrValue.append(" text-decoration : line-through;"); //$NON-NLS-1$
}
}
return styleAttrValue.toString();
}
private static String getFontFamily(Node sourceFontNode) {
String fontFamily = "unknown"; //$NON-NLS-1$
Element sourceFontElement = (Element) sourceFontNode;
if (sourceFontElement.hasAttribute(HTML.ATTR_NAME)) {
String stringName = sourceFontElement.getAttribute(HTML.ATTR_NAME);
fontFamily = stringName;
}
return " font-family : " + fontFamily + ";"; //$NON-NLS-1$ //$NON-NLS-2$
}
private static String getSize(Node sourceFontNode) {
Element sourceFontElement = (Element) sourceFontNode;
if (sourceFontElement.hasAttribute(HTML.ATTR_SIZE)) {
try {
String stringSizeAttr = sourceFontElement.getAttribute(HTML.ATTR_SIZE);
int intSize = Integer.parseInt(stringSizeAttr);
if (intSize < 0) {
return ""; //$NON-NLS-1$
}
return " font-size : " + stringSizeAttr + "pt;"; //$NON-NLS-1$ //$NON-NLS-2$
} catch (NumberFormatException e) {
return ""; //$NON-NLS-1$
}
} else {
return ""; //$NON-NLS-1$
}
}
public static String getAbsoluteResourcePath(String resourcePathInPlugin) {
String pluginPath = SeamTemplatesActivator.getPluginResourcePath();
IPath pluginFile = new Path(pluginPath);
File file = pluginFile.append(resourcePathInPlugin).toFile();
if (file.exists()) {
return file.getAbsolutePath();
} else {
throw new IllegalArgumentException("Can't get path for " //$NON-NLS-1$
+ resourcePathInPlugin);
}
}
public static void setImg(nsIDOMElement img, String fileImageName) {
img.setAttribute(HTML.ATTR_SRC, "file://" //$NON-NLS-1$
+ getAbsoluteResourcePath(fileImageName).replace('\\', '/'));
}
}