package app.navigps.gui.svgComponents;
import app.navigps.gui.detailspanel.AlphaJPanel;
import app.navigps.utils.Utils;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.geom.NoninvertibleTransformException;
import java.awt.geom.Point2D;
import org.apache.batik.dom.svg.SVGOMPoint;
import org.w3c.dom.svg.SVGPoint;
/**
*
* @author Grzegorz (vara) Warywoda
*/
public abstract class SynchronizedSVGLayer extends AlphaJPanel{
protected Canvas svgCanvas;
private TransformCanvasListener txListener = new TransformCanvasListener();
/*
* Var. needUpdate seted true when only svg document transform changed
*/
protected boolean needUpdate = false;
public SynchronizedSVGLayer(Canvas can){
super(null);
this.svgCanvas = can;
setOpaque(false);
can.addTranformListener(txListener);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
AffineTransform pt = svgCanvas.getPaintingTransform();
if(pt!=null){
AffineTransform orgT = g2.getTransform();
orgT.concatenate(pt);
g2.setTransform(orgT);
}else{
if(needUpdate) updateComponent();
}
}
public SVGPoint[] getPointsRelativeToRootContainer() {
final SVGOMPoint upperLeft = new SVGOMPoint(0, 0);
final SVGOMPoint upperRight = new SVGOMPoint(this.getWidth(), 0);
final SVGOMPoint lowerLeft = new SVGOMPoint(0, this.getHeight());
return new SVGPoint[] {upperLeft, upperRight, lowerLeft};
}
public AffineTransform getTransform(){
AffineTransform derivedTransform = new AffineTransform();
SVGPoint[] docPoints = svgCanvas.getDocumentPoints();
if(docPoints != null){
final Point2D[] src = Utils.svgPointToPoint2D(docPoints);
final Point2D[] dest = Utils.svgPointToPoint2D(getPointsRelativeToRootContainer());
try {
derivedTransform = Utils.deriveTransform(src, dest);
} catch (NoninvertibleTransformException ex) {}
}
return derivedTransform;
}
public abstract void updateComponent();
public class TransformCanvasListener extends TransformAdapter{
@Override
public void setRenderingTransform(AffineTransform rt) {
needUpdate = true;
}
}
}