/* * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser General Public License * (LGPL) version 2.1 which accompanies this distribution, and is available at * http://www.gnu.org/licenses/lgpl.html * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * Contributors: * Original file from org.jboss.seam.pdf.ui.UIRectangle.java in jboss-seam-pdf * Anahide Tchertchian */ package org.nuxeo.ecm.platform.ui.web.component.seam; import java.awt.image.BufferedImage; import java.io.IOException; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jboss.seam.pdf.ITextUtils; import org.jboss.seam.ui.graphicImage.ImageTransform; import com.lowagie.text.DocumentException; import com.lowagie.text.Image; /** * Overrides default image to avoid crash when image is not found * * @since 5.4.2 */ public class UIImage extends org.jboss.seam.pdf.ui.UIRectangle { private static final Log log = LogFactory.getLog(UIImage.class); public static final String COMPONENT_TYPE = UIImage.class.getName(); Image image; Object value; float rotation; float height; float width; String alignment; String alt; Float indentationLeft; Float indentationRight; Float spacingBefore; Float spacingAfter; Float widthPercentage; Float initialRotation; String dpi; String scalePercent; Boolean wrap; Boolean underlying; java.awt.Image imageData; public void setValue(Object value) { this.value = value; } public void setRotation(float rotation) { this.rotation = rotation; } public void setHeight(float height) { this.height = height; } public void setWidth(float width) { this.width = width; } public void setAlignment(String alignment) { this.alignment = alignment; } public void setAlt(String alt) { this.alt = alt; } public void setWrap(Boolean wrap) { this.wrap = wrap; } public void setUnderlying(Boolean underlying) { this.underlying = underlying; } public void setDpi(String dpi) { this.dpi = dpi; } public void setIndentationLeft(Float indentationLeft) { this.indentationLeft = indentationLeft; } public void setIndentationRight(Float indentationRight) { this.indentationRight = indentationRight; } public void setInitialRotation(Float initialRotation) { this.initialRotation = initialRotation; } public void setSpacingAfter(Float spacingAfter) { this.spacingAfter = spacingAfter; } public void setSpacingBefore(Float spacingBefore) { this.spacingBefore = spacingBefore; } public void setWidthPercentage(Float widthPercentage) { this.widthPercentage = widthPercentage; } public void setScalePercent(String scalePercent) { this.scalePercent = scalePercent; } @Override public Object getITextObject() { return image; } @Override public void removeITextObject() { image = null; } @Override public void createITextObject(FacesContext context) throws IOException, DocumentException { value = valueBinding(context, "value", value); // instance() doesn't work here - we need a new instance org.jboss.seam.ui.graphicImage.Image seamImage = new org.jboss.seam.ui.graphicImage.Image(); try { if (value instanceof BufferedImage) { seamImage.setBufferedImage((BufferedImage) value); } else { seamImage.setInput(value); } } catch (Exception e) { log.error("Cannot resolve image for value " + value, e); return; } for (UIComponent cmp : this.getChildren()) { if (cmp instanceof ImageTransform) { ImageTransform imageTransform = (ImageTransform) cmp; imageTransform.applyTransform(seamImage); } } byte[] data = seamImage.getImage(); if (data == null) { log.error("Cannot resolve image for value " + value); return; } image = Image.getInstance(data); rotation = (Float) valueBinding(context, "rotation", rotation); if (rotation != 0) { image.setRotationDegrees(rotation); } height = (Float) valueBinding(context, "height", height); width = (Float) valueBinding(context, "width", width); if (height > 0 || width > 0) { image.scaleAbsolute(width, height); } int alignmentValue = 0; alignment = (String) valueBinding(context, "alignment", alignment); if (alignment != null) { alignmentValue = (ITextUtils.alignmentValue(alignment)); } wrap = (Boolean) valueBinding(context, "wrap", wrap); if (wrap != null && wrap.booleanValue()) { alignmentValue |= Image.TEXTWRAP; } underlying = (Boolean) valueBinding(context, "underlying", underlying); if (underlying != null && underlying.booleanValue()) { alignmentValue |= Image.UNDERLYING; } image.setAlignment(alignmentValue); alt = (String) valueBinding(context, "alt", alt); if (alt != null) { image.setAlt(alt); } indentationLeft = (Float) valueBinding(context, "indentationLeft", indentationLeft); if (indentationLeft != null) { image.setIndentationLeft(indentationLeft); } indentationRight = (Float) valueBinding(context, "indentationRight", indentationRight); if (indentationRight != null) { image.setIndentationRight(indentationRight); } spacingBefore = (Float) valueBinding(context, "spacingBefore", spacingBefore); if (spacingBefore != null) { image.setSpacingBefore(spacingBefore); } spacingAfter = (Float) valueBinding(context, "spacingAfter", spacingAfter); if (spacingAfter != null) { image.setSpacingAfter(spacingAfter); } widthPercentage = (Float) valueBinding(context, "widthPercentage", widthPercentage); if (widthPercentage != null) { image.setWidthPercentage(widthPercentage); } initialRotation = (Float) valueBinding(context, "initialRotation", initialRotation); if (initialRotation != null) { image.setInitialRotation(initialRotation); } dpi = (String) valueBinding(context, "dpi", dpi); if (dpi != null) { int[] dpiValues = ITextUtils.stringToIntArray(dpi); image.setDpi(dpiValues[0], dpiValues[1]); } applyRectangleProperties(context, image); scalePercent = (String) valueBinding(context, "scalePercent", scalePercent); if (scalePercent != null) { float[] scale = ITextUtils.stringToFloatArray(scalePercent); if (scale.length == 1) { image.scalePercent(scale[0]); } else if (scale.length == 2) { image.scalePercent(scale[0], scale[1]); } else { throw new RuntimeException( "scalePercent must contain one or two scale percentages"); } } } @Override public void handleAdd(Object o) { throw new RuntimeException("can't add " + o.getClass().getName() + " to image"); } }