org.nuxeo.ecm.platform.ui.web.component.seam.UIImage.java Source code

Java tutorial

Introduction

Here is the source code for org.nuxeo.ecm.platform.ui.web.component.seam.UIImage.java

Source

/*
 * 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");
    }

}