blob: 6769c227dfb92a7035b3582bc9d5bc01928a9e8a [file] [log] [blame]
/**
*
* Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
*
* All rights reserved. This program and the accompanying materials
* are 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:
* Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
*/
package org.eclipse.osbp.xtext.reportdsl.common.item;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import javax.imageio.ImageIO;
import javax.inject.Inject;
import org.eclipse.birt.report.model.api.Expression;
import org.eclipse.birt.report.model.api.ExpressionHandle;
import org.eclipse.birt.report.model.api.ExpressionType;
import org.eclipse.birt.report.model.api.ImageHandle;
import org.eclipse.birt.report.model.api.ReportItemHandle;
import org.eclipse.birt.report.model.api.StructureFactory;
import org.eclipse.birt.report.model.api.activity.SemanticException;
import org.eclipse.birt.report.model.api.elements.DesignChoiceConstants;
import org.eclipse.birt.report.model.api.elements.structures.EmbeddedImage;
import org.eclipse.birt.report.model.api.util.StringUtil;
import org.eclipse.birt.report.model.core.Module;
import org.eclipse.birt.report.model.elements.interfaces.IImageItemModel;
import org.eclipse.birt.report.model.i18n.ThreadResources;
import org.eclipse.osbp.ui.api.themes.IThemeResourceService;
import org.eclipse.osbp.ui.api.themes.IThemeResourceService.ThemeResourceType;
import org.eclipse.osbp.xtext.reportdsl.DatamartTableAttribute;
import org.eclipse.osbp.xtext.reportdsl.TableValueElement;
import org.eclipse.osbp.xtext.reportdsl.UnitEnum;
import org.eclipse.osbp.xtext.reportdsl.jvmmodel.ReportGeneratorWorkSet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ibm.icu.util.ULocale;
public class ImageItem implements BaseItem {
private static final Logger LOGGER = LoggerFactory.getLogger(ImageItem.class);
private final ImageHandle fItem;
@Inject
private IThemeResourceService themeResourceService;
public ImageItem(ReportGeneratorWorkSet workset, DatamartTableAttribute tableAttribute) {
this(workset, DataUtils.getAttributeName(tableAttribute), DesignChoiceConstants.IMAGE_SIZE_SIZE_TO_IMAGE, -1.0d, -1.0d, null, -1.0d, null, DesignChoiceConstants.IMAGE_REF_TYPE_EXPR, null);
}
public ImageItem(
ReportGeneratorWorkSet workset,
String name,
String size,
double scale,
double height,
UnitEnum heightUnit,
double width,
UnitEnum widthUnit,
String source,
String filename) {
fItem = workset.getFactory().newImage(name);
try {
fItem.setSize(size);
if (scale <= 0.0) {
fItem.setScale(1.0);
} else {
fItem.setScale(scale);
fItem.setProportionalScale(true);
}
Module module = fItem.getModule();
ULocale locale = module == null ? ThreadResources.getLocale( ) : module
.getLocale( );
if (height > 0.0) {
fItem.setHeight(workset.getLocalizedDoubleValue(fItem, height, heightUnit));
}
if (width > 0.0) {
fItem.setWidth(workset.getLocalizedDoubleValue(fItem, width, widthUnit));
}
fItem.setSource(source);
switch (source) {
case DesignChoiceConstants.IMAGE_REF_TYPE_URL:
fItem.setURL(filename);
ExpressionHandle eh1 = fItem.getExpressionProperty(IImageItemModel.URI_PROP);
eh1.setType(ExpressionType.CONSTANT);
break;
case DesignChoiceConstants.IMAGE_REF_TYPE_FILE:
fItem.setFile(filename);
ExpressionHandle eh2 = fItem.getExpressionProperty(IImageItemModel.URI_PROP);
eh2.setType(ExpressionType.CONSTANT);
break;
case DesignChoiceConstants.IMAGE_REF_TYPE_EMBED:
String imageId = DesignChoiceConstants.IMAGE_REF_TYPE_EMBED + "." + filename.replaceAll("\\W", "");
EmbeddedImage ei = workset.getEmbeddedImage(imageId);
if (ei == null) {
ei = createEmbeddedImage(workset, filename, imageId);
}
workset.getDesign().addImage(ei);
fItem.setImageName(imageId);
break;
case DesignChoiceConstants.IMAGE_REF_TYPE_EXPR:
Expression expr = new Expression("row[\"" + name + "\"]", null);
fItem.setExpressionProperty("valueExpr", expr);
break;
default:
break;
}
}
catch (Exception e) {
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String exceptionDetails = sw.toString();
LOGGER.error("{}", exceptionDetails);
}
}
private EmbeddedImage createEmbeddedImage(ReportGeneratorWorkSet workset, String filename, String imageId) {
EmbeddedImage ei = null;
try {
String[] tokens = null;
InputStream stream = null;
if (themeResourceService != null) {
String uri = themeResourceService.getThemeURI(filename, ThemeResourceType.ICON);
stream = themeResourceService.getThemeResourceInputStream(uri);
tokens = uri.split("\\.");
} else {
File file = new File(filename);
tokens = filename.split("\\.");
stream = new FileInputStream(file);
}
String fileextension = tokens[tokens.length-1];
BufferedImage originalImage = ImageIO.read(stream);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(originalImage, fileextension, baos);
baos.flush();
byte[] imageInByte = baos.toByteArray();
baos.close();
ei = StructureFactory.createEmbeddedImage();
ei.setType(getImageType(fileextension));
ei.setData(imageInByte);
ei.setName(imageId);
workset.putEmbeddedImage(imageId, ei);
}
catch (Exception e) {
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String exceptionDetails = sw.toString();
LOGGER.error("{}", exceptionDetails);
}
return ei;
}
@Override
public ReportItemHandle getHandle() {
return fItem;
}
private String getImageType(String fileextension) {
switch (fileextension.toLowerCase()) {
case "bmp": return DesignChoiceConstants.IMAGE_TYPE_IMAGE_BMP;
case "gif": return DesignChoiceConstants.IMAGE_TYPE_IMAGE_GIF;
case "png": return DesignChoiceConstants.IMAGE_TYPE_IMAGE_PNG;
case "jpg":
case "jpeg": return DesignChoiceConstants.IMAGE_TYPE_IMAGE_JPEG;
case "ico": return DesignChoiceConstants.IMAGE_TYPE_IMAGE_ICO;
case "tiff": return DesignChoiceConstants.IMAGE_TYPE_IMAGE_TIFF;
case "svg": return DesignChoiceConstants.IMAGE_TYPE_IMAGE_SVG;
default: return null;
}
}
}