package edu.byu.cs.roots.opg.chart.cmds; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import java.awt.geom.AffineTransform; import java.awt.geom.NoninvertibleTransformException; import java.awt.geom.Point2D; import org.apache.fop.pdf.PDFLink; import org.apache.fop.svg.PDFDocumentGraphics2D; import org.apache.fop.svg.PDFFullPageDocumentGraphics2D; import edu.byu.cs.roots.opg.model.Individual; import edu.byu.cs.roots.opg.model.OpgPage; @SuppressWarnings("serial") public class DrawCmdPageLink extends DrawCommand{ private double width, height; Individual target; public DrawCmdPageLink(double width, double height, Individual target){ this.width = width; this.height = height; offset = new Point2D.Double(0,0); this.target = target; } @Override public Rectangle getShapeBox() { return null; } @Override public void execute(Graphics2D g, DrawState state) { if(g.getClass() == PDFFullPageDocumentGraphics2D.class){ int page = state.session.getIndexOf(state.session.getPageByRoot(target.id)); Rectangle destinationBox; if(page != -1){ OpgPage realPage = state.session.getPageByRoot(target.id); int innerPageIndex = realPage.getMakerList().indexOf(realPage.getMakerByRoot(target.id)); int chartHeight = (int)state.session.getChartHeight(realPage.getMaker(innerPageIndex), realPage.getOptions(innerPageIndex)); int chartWidth = state.xExtent; destinationBox = new Rectangle(0, 0, chartWidth, chartHeight); }else destinationBox = new Rectangle(0,0,0,0); int yReverse = 792; int translateY = (int)g.getTransform().getTranslateY(); double scaleY = g.getTransform().getScaleY(); int scaledTranslateY = (int)(translateY/scaleY); destinationBox.y = 792 - (scaledTranslateY + destinationBox.height); String destinationBoxString = destinationBox.x + " "+destinationBox.y + " "+destinationBox.width+" "+destinationBox.height; // g.drawRect(destinationBox.x, destinationBox.y, destinationBox.width, destinationBox.height); System.out.println("Box: "+destinationBox); Rectangle pdfLink = new Rectangle((int)(state.pos.x + offset.x),yReverse - scaledTranslateY - (int)(state.yExtent + offset.y - (state.pos.y - height/2.0)), ((int)(width)),(int) height); try { if(page != -1) ((PDFFullPageDocumentGraphics2D)g).addLink(pdfLink, new AffineTransform(((PDFDocumentGraphics2D)g).getTransform().createInverse()), page, destinationBoxString, PDFLink.INTERNAL); else System.out.println("Invalid link!"); } catch (NoninvertibleTransformException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } @Override public void execute(Graphics2D g, DrawState state, int width, int height, double zoom, Point multiChartOffset) { execute(g, state); } @Override public void executeAbsolute(Graphics2D g, DrawState state, int width, int height, double zoom) { execute(g,state); } }