package com.scrivenvar.preview;
import com.scrivenvar.Services;
import com.scrivenvar.service.events.Notifier;
import org.apache.commons.io.FilenameUtils;
import org.w3c.dom.Element;
import org.xhtmlrenderer.extend.ReplacedElement;
import org.xhtmlrenderer.extend.ReplacedElementFactory;
import org.xhtmlrenderer.extend.UserAgentCallback;
import org.xhtmlrenderer.layout.LayoutContext;
import org.xhtmlrenderer.render.BlockBox;
import org.xhtmlrenderer.simple.extend.FormSubmissionListener;
import org.xhtmlrenderer.swing.ImageReplacedElement;
import java.awt.*;
public class SVGReplacedElementFactory
implements ReplacedElementFactory {
private final static Notifier sNotifier = Services.load( Notifier.class );
private static final String SVG_FILE = "svg";
private static final String HTML_IMAGE = "img";
private static final String HTML_IMAGE_SRC = "src";
public ReplacedElement createReplacedElement(
final LayoutContext c, final BlockBox box, final UserAgentCallback uac,
final int cssWidth, final int cssHeight ) {
final Element e = box.getElement();
if( e == null ) {
return null;
}
final String nodeName = e.getNodeName();
ReplacedElement result = null;
if( HTML_IMAGE.equals( nodeName ) ) {
final String src = e.getAttribute( HTML_IMAGE_SRC );
final String ext = FilenameUtils.getExtension( src );
if( SVG_FILE.equalsIgnoreCase( ext ) ) {
try {
final int width = box.getContentWidth();
final Image image = SVGRasterizer.rasterize( src, width );
final int w = image.getWidth( null );
final int h = image.getHeight( null );
result = new ImageReplacedElement( image, w, h );
} catch( final Exception ex ) {
getNotifier().notify( ex );
}
}
}
return result;
}
@Override
public void reset() {
}
@Override
public void remove( Element e ) {
}
@Override
public void setFormSubmissionListener( FormSubmissionListener listener ) {
}
private Notifier getNotifier() {
return sNotifier;
}
}