/*******************************************************************************
* 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
*
* Contributor:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.seam.vpe.template;
import java.util.List;
import org.jboss.tools.jsf.vpe.jsf.template.ComponentUtil;
import org.jboss.tools.vpe.editor.context.VpePageContext;
import org.jboss.tools.vpe.editor.template.VpeAbstractTemplate;
import org.jboss.tools.vpe.editor.template.VpeCreationData;
import org.jboss.tools.vpe.editor.util.HTML;
import org.jboss.tools.vpe.editor.util.VpeStyleUtil;
import org.mozilla.interfaces.nsIDOMDocument;
import org.mozilla.interfaces.nsIDOMElement;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
/**
* Class for s:graphicImage template.
*
* @author dmaliarevich
*/
public class SeamGraphicImageTemplate extends VpeAbstractTemplate {
/*
* s:transformImageSize tag name.
*/
private final String TRANSFORM_IMAGE_SIZE_NAME = ":transformImageSize"; //$NON-NLS-1$
public SeamGraphicImageTemplate() {
super();
}
public VpeCreationData create(VpePageContext pageContext, Node sourceNode,
nsIDOMDocument visualDocument) {
Element sourceElement = (Element) sourceNode;
nsIDOMElement img = visualDocument.createElement(HTML.TAG_IMG);
/*
* Indicates that source node has width or height attributes.
*/
boolean hasWidth = false;
boolean hasHeight = false;
/*
* Reading source attributes and setting them to the visual node.
*/
if (sourceElement.hasAttribute(HTML.ATTR_ALT)) {
img.setAttribute(HTML.ATTR_ALT, sourceElement.getAttribute(HTML.ATTR_ALT));
}
if (sourceElement.hasAttribute(HTML.ATTR_DIR)) {
img.setAttribute(HTML.ATTR_DIR, sourceElement.getAttribute(HTML.ATTR_DIR));
}
if (sourceElement.hasAttribute(HTML.ATTR_WIDTH)) {
img.setAttribute(HTML.ATTR_WIDTH, sourceElement.getAttribute(HTML.ATTR_WIDTH));
hasWidth = true;
}
if (sourceElement.hasAttribute(HTML.ATTR_HEIGHT)) {
img.setAttribute(HTML.ATTR_HEIGHT, sourceElement.getAttribute(HTML.ATTR_HEIGHT));
hasHeight = true;
}
if (sourceElement.hasAttribute(HTML.ATTR_STYLE)) {
img.setAttribute(HTML.ATTR_STYLE, sourceElement.getAttribute(HTML.ATTR_STYLE));
}
if (sourceElement.hasAttribute(SeamUtil.ATTR_STYLE_CLASS)) {
img.setAttribute(HTML.ATTR_CLASS, sourceElement.getAttribute(SeamUtil.ATTR_STYLE_CLASS));
}
if (sourceElement.hasAttribute(HTML.ATTR_VALUE)) {
img.setAttribute(HTML.ATTR_SRC, VpeStyleUtil.addFullPathToImgSrc(
sourceElement.getAttribute(HTML.ATTR_VALUE), pageContext,
true));
} else if (sourceElement.hasAttribute(SeamUtil.ATTR_URL)) {
img.setAttribute(HTML.ATTR_SRC, VpeStyleUtil.addFullPathToImgSrc(
sourceElement.getAttribute(SeamUtil.ATTR_URL), pageContext,
true));
}
/*
* Looking for any seam transformation tag to apply the transformation to the image.
*/
List<Node> children = ComponentUtil.getChildren(sourceElement);
/*
* If s:graphicImage has width and height attributes
* skip any size transformation.
*/
if (!(hasHeight || hasWidth)) {
for (Node node : children) {
if (node.getNodeName().endsWith(TRANSFORM_IMAGE_SIZE_NAME)) {
Element transform = (Element) node;
if (transform.hasAttribute(HTML.ATTR_WIDTH)) {
img.setAttribute(HTML.ATTR_WIDTH, transform
.getAttribute(HTML.ATTR_WIDTH));
}
if (transform.hasAttribute(HTML.ATTR_HEIGHT)) {
img.setAttribute(HTML.ATTR_HEIGHT, transform
.getAttribute(HTML.ATTR_HEIGHT));
}
/*
* Apply only the first transform element.
*/
break;
}
}
}
return new VpeCreationData(img);
}
}