blob: d4f5c70b3a006c58454c947284977573c86ed59e [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 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Florian Pirchner - Initial implementation
*
*/
package org.eclipse.osbp.ecview.extension.grid.presentation.renderer;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.lang.StringEscapeUtils;
import org.eclipse.osbp.ecview.core.common.context.IViewContext;
import org.eclipse.osbp.ecview.extension.grid.editparts.renderer.IGridRendererEditpart;
import org.eclipse.osbp.ecview.extension.grid.editparts.renderer.IGridRendererFactory;
import org.eclipse.osbp.ecview.extension.grid.renderer.CxGridBlobImageRenderer;
import org.eclipse.osbp.ecview.extension.grid.renderer.CxGridBooleanRenderer;
import org.eclipse.osbp.ecview.extension.grid.renderer.CxGridButtonRenderer;
import org.eclipse.osbp.ecview.extension.grid.renderer.CxGridDateRenderer;
import org.eclipse.osbp.ecview.extension.grid.renderer.CxGridHtmlRenderer;
import org.eclipse.osbp.ecview.extension.grid.renderer.CxGridImageRenderer;
import org.eclipse.osbp.ecview.extension.grid.renderer.CxGridIndicatorRenderer;
import org.eclipse.osbp.ecview.extension.grid.renderer.CxGridNumberRenderer;
import org.eclipse.osbp.ecview.extension.grid.renderer.CxGridPriceRenderer;
import org.eclipse.osbp.ecview.extension.grid.renderer.CxGridProgressBarRenderer;
import org.eclipse.osbp.ecview.extension.grid.renderer.CxGridQuantityRenderer;
import org.eclipse.osbp.ecview.extension.grid.renderer.CxGridRenderer;
import org.eclipse.osbp.ecview.extension.grid.renderer.CxGridRendererClickEvent;
import org.eclipse.osbp.ecview.extension.grid.renderer.CxGridRendererFactory;
import org.eclipse.osbp.ecview.extension.grid.renderer.CxGridTextRenderer;
import org.eclipse.osbp.runtime.web.ecview.presentation.vaadin.VaadinRenderer;
import org.osgi.service.component.annotations.Component;
import org.vaadin.grid.cellrenderers.view.BlobImageRenderer;
import org.vaadin.gridutil.renderer.BooleanRenderer;
import org.vaadin.gridutil.renderer.IndicatorRenderer;
import com.vaadin.data.util.converter.Converter.ConversionException;
import com.vaadin.ui.renderers.ButtonRenderer;
import com.vaadin.ui.renderers.DateRenderer;
import com.vaadin.ui.renderers.HtmlRenderer;
import com.vaadin.ui.renderers.ImageRenderer;
import com.vaadin.ui.renderers.NumberRenderer;
import com.vaadin.ui.renderers.ProgressBarRenderer;
import com.vaadin.ui.renderers.TextRenderer;
import elemental.json.JsonValue;
/**
* A factory for creating Renderer objects.
*/
@Component(immediate = true)
public class RendererFactory implements IGridRendererFactory {
/*
* (non-Javadoc)
*
* @see org.eclipse.osbp.ecview.extension.grid.editparts.renderer.
* IGridRendererFactory
* #isFor(org.eclipse.osbp.ecview.core.common.context.IViewContext,
* org.eclipse
* .osbp.ecview.extension.grid.editparts.renderer.IGridRendererEditpart)
*/
@Override
public boolean isFor(IViewContext uiContext, IGridRendererEditpart editpart) {
String presentationURI = uiContext.getPresentationURI();
return presentationURI != null
&& presentationURI.equals(VaadinRenderer.UI_KIT_URI);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.osbp.ecview.extension.grid.editparts.renderer.
* IGridRendererFactory
* #createRenderer(org.eclipse.osbp.ecview.core.common.context.IViewContext,
* org
* .eclipse.osbp.ecview.extension.grid.editparts.renderer.IGridRendererEditpart
* )
*/
@SuppressWarnings("serial")
@Override
public Object createRenderer(IViewContext uiContext,
IGridRendererEditpart editpart) throws IllegalArgumentException {
CxGridRenderer cxRenderer = (CxGridRenderer) editpart.getModel();
if (cxRenderer instanceof CxGridDateRenderer) {
CxGridDateRenderer cxCasted = (CxGridDateRenderer) cxRenderer;
String dateFormat = cxCasted.getDateFormat();
if (dateFormat != null && !dateFormat.equals("")) {
return new DateRenderer(new SimpleDateFormat(dateFormat,
uiContext.getLocale()));
} else {
return new DateRenderer(uiContext.getLocale());
}
} else if (cxRenderer instanceof CxGridNumberRenderer) {
CxGridNumberRenderer cxCasted = (CxGridNumberRenderer) cxRenderer;
String numberFormat = cxCasted.getNumberFormat();
if (numberFormat != null && !numberFormat.equals("")) {
try {
return new NumberRenderer(new DecimalFormat(
StringEscapeUtils.unescapeHtml(numberFormat),
DecimalFormatSymbols.getInstance(uiContext
.getLocale())),
cxCasted.getNullRepresentation());
} catch (IllegalArgumentException e) {
String msg = String.format(
"formatter %s is invalid for decimal numbers: %s",
numberFormat, e.getLocalizedMessage());
throw new ConversionException(msg);
}
} else {
return new NumberRenderer(uiContext.getLocale());
}
} else if (cxRenderer instanceof CxGridTextRenderer) {
CxGridTextRenderer cxCasted = (CxGridTextRenderer) cxRenderer;
return new TextRenderer(cxCasted.getNullRepresentation());
} else if (cxRenderer instanceof CxGridImageRenderer) {
CxGridImageRenderer cxCasted = (CxGridImageRenderer) cxRenderer;
ImageRenderer renderer = new ImageRenderer();
renderer.addClickListener(e -> {
CxGridRendererClickEvent cxEvent = CxGridRendererFactory.eINSTANCE
.createCxGridRendererClickEvent();
cxEvent.setRenderer(cxRenderer);
cxEvent.setLastClickTime(new Date().getTime());
cxCasted.setLastClickEvent(cxEvent);
});
return renderer;
} else if (cxRenderer instanceof CxGridBlobImageRenderer) {
// CxGridImageRenderer cxCasted = (CxGridImageRenderer) cxRenderer;
BlobImageRenderer renderer = new BlobImageRenderer();
// renderer.addClickListener(e -> {
// CxGridRendererClickEvent cxEvent = CxGridRendererFactory.eINSTANCE
// .createCxGridRendererClickEvent();
// cxEvent.setRenderer(cxRenderer);
// cxEvent.setLastClickTime(new Date().getTime());
// cxCasted.setLastClickEvent(cxEvent);
// });
return renderer;
} else if (cxRenderer instanceof CxGridButtonRenderer) {
CxGridButtonRenderer cxCasted = (CxGridButtonRenderer) cxRenderer;
ButtonRenderer renderer = new ButtonRenderer(
cxCasted.getNullRepresentation());
renderer.addClickListener(e -> {
CxGridRendererClickEvent cxEvent = CxGridRendererFactory.eINSTANCE
.createCxGridRendererClickEvent();
cxEvent.setRenderer(cxRenderer);
cxEvent.setLastClickTime(new Date().getTime());
cxCasted.setLastClickEvent(cxEvent);
});
return renderer;
} else if (cxRenderer instanceof CxGridHtmlRenderer) {
CxGridHtmlRenderer cxCasted = (CxGridHtmlRenderer) cxRenderer;
return new HtmlRenderer(cxCasted.getNullRepresentation());
} else if (cxRenderer instanceof CxGridProgressBarRenderer) {
final CxGridProgressBarRenderer cxCasted = (CxGridProgressBarRenderer) cxRenderer;
return new ProgressBarRenderer() {
@Override
public JsonValue encode(Double value) {
if (value != null) {
value = value / cxCasted.getMaxValue();
}
return super.encode(value);
}
};
} else if (cxRenderer instanceof CxGridBooleanRenderer) {
return new BooleanRenderer();
} else if (cxRenderer instanceof CxGridQuantityRenderer) {
return new QuantityRenderer((CxGridQuantityRenderer) cxRenderer,
uiContext.getLocale());
} else if (cxRenderer instanceof CxGridPriceRenderer) {
return new PriceRenderer((CxGridPriceRenderer) cxRenderer,
uiContext.getLocale());
} else if (cxRenderer instanceof CxGridIndicatorRenderer) {
CxGridIndicatorRenderer temp = (CxGridIndicatorRenderer) cxRenderer;
return new IndicatorRenderer(temp.getGreenStarts(),
temp.getRedEnds());
}
return null;
}
}