private void removePagePanel(PagePanel pagePanel) { pagePanel.removePagePanelListener(this); remove(pagePanel); pagePanel.dispose(); pagePanel.raisePagePanelEvent( PagePanelEvent.createPageHidden(pagePanel, pagePanel.getPage())); }
/** * @param x x coordinate in PDF units * @param y y coordinate in PDF units * @param centre if true, centre this location in the viewport, otherwise cause it to be displayed * at the top left of the viewport. */ private void ensureVisible(PDFPage page, double x, double y, boolean centre) { PDFPage oldPage = view.getPage(); Collection<PagePanel> oldPagePanels = view.getPagePanels(); view.setPage(page, false); Rectangle pageRect = view.getPageRectangle(page); if (pageRect != null) { Rectangle2D crop = PagePanel.getFullPageView(page); int xoffset = pageRect.x, yoffset = pageRect.y; if (x > crop.getMinX()) { // Also confirms !NaN xoffset += pointsToPixels((float) (Math.min(crop.getMaxX(), x) - crop.getMinX())); } if (y < crop.getMaxY()) { // Also confirms !NaN yoffset += pointsToPixels((float) (crop.getHeight() - Math.max(0, y - crop.getMinY()))); } JScrollBar hsb = scrollPane.getHorizontalScrollBar(); JScrollBar vsb = scrollPane.getVerticalScrollBar(); if (centre) { xoffset -= hsb.getVisibleAmount() / 2; yoffset -= vsb.getVisibleAmount() / 2; } if (getPagePanel() != null && getPagePanel().getClip() != null) { hsb.setValue(xoffset); // Don't want to smooth scroll if we're clipping vsb.setValue(yoffset); // the page rectangles. } else { smoothScroll(xoffset, yoffset, hsb, vsb); } } if (page != oldPage) { DocumentPanel docpanel = getDocumentPanel(); if (docpanel != null) { DocumentPanelEvent dpe = DocumentPanelEvent.createPageChanged(docpanel); dpe.setPreviousPage(oldPage); docpanel.raiseDocumentPanelEvent(dpe); } Collection<PagePanel> newPagePanels = view.getPagePanels(); for (Iterator<PagePanel> i = oldPagePanels.iterator(); i.hasNext(); ) { PagePanel oldPagePanel = i.next(); if (!newPagePanels.contains(oldPagePanel)) { oldPagePanel.raisePagePanelEvent(PagePanelEvent.createPageHidden(oldPagePanel, oldPage)); } } for (Iterator<PagePanel> i = newPagePanels.iterator(); i.hasNext(); ) { PagePanel newPagePanel = i.next(); if (!oldPagePanels.contains(newPagePanel)) { newPagePanel.raisePagePanelEvent(PagePanelEvent.createPageVisible(newPagePanel, page)); } } } }
public void setPage(PDFPage page, double x, double y, double zoom) { if (page.getPDF() != pdf) { throw new IllegalArgumentException("Page is from a different PDF"); } setZoom((float) zoom); Rectangle2D crop = PagePanel.getFullPageView(page); ensureVisible(page, crop.getMinX() + x, crop.getMaxY() - y, false); }
/** @page the page to display */ private PagePanel addPagePanel(PDFPage page) { PagePanel pagePanel = new PagePanel(); pagePanel.setViewport(DualPageDocumentViewport.this); pagePanel.setParser(getDocumentPanel().getParser()); if (hints != null) { pagePanel.setRenderingHints(hints); } pagePanel.addPagePanelListener(this); pagePanel.addPagePanelInteractionListener(this); pagePanel.addMouseListener(this); pagePanel.addMouseMotionListener(this); add(pagePanel); pagePanel.raisePagePanelEvent(PagePanelEvent.createPageVisible(pagePanel, page)); return pagePanel; }
public void doLayout() { Dimension size = getSize(); if (size.width == 0 || size.height == 0) { return; } Dimension viewport = getPreferredSize(); int cx = Math.max(size.width / 2, 0); int cy = Math.max(size.height / 2, 0); float dpi = (float) zoom * Util.getScreenResolution(this); if (leftPage != null) { leftPageRect.x = cx - (viewport.width / 2) + margin; leftPageRect.y = cy - (leftPageRect.height / 2); leftPagePanel.setBounds(leftPageRect); leftPagePanel.setPage(leftPage, leftFullPageRect, dpi, null); } if (rightPage != null) { rightPageRect.x = cx + (viewport.width / 2) - rightPageRect.width - margin; rightPageRect.y = cy - (rightPageRect.height / 2); rightPagePanel.setBounds(rightPageRect); rightPagePanel.setPage(rightPage, rightFullPageRect, dpi, null); } }
void setRightPage(PDFPage page) { if (rightPagePanel != null) { removePagePanel(rightPagePanel); } rightPage = page; if (page == null) { rightPagePanel = null; rightPageRect = null; rightFullPageRect = null; } else { rightFullPageRect = (Rectangle2D.Float) PagePanel.getFullPageView(page); rightPageRect = new Rectangle(); rightPagePanel = addPagePanel(page); } }
void setLeftPage(PDFPage page) { if (leftPagePanel != null) { removePagePanel(leftPagePanel); } leftPage = page; if (page == null) { leftPagePanel = null; leftPageRect = null; leftFullPageRect = null; } else { leftFullPageRect = (Rectangle2D.Float) PagePanel.getFullPageView(page); leftPageRect = new Rectangle(); leftPagePanel = addPagePanel(page); } }
public float getTargetZoom(int zoommode, PDFPage page) { float outzoom = zoom; if (page != null) { int pagenumber = page.getPageNumber() - 1; int pagecount = pdf.getNumberOfPages(); boolean isOdd = (pagenumber % 2) == 0; // even pages have odd numbers :) boolean onRight = handedness == ODD_PAGES_ON_RIGHT ? isOdd : !isOdd; PDFPage leftPage, rightPage; Rectangle2D.Float leftPageRect = null, rightPageRect = null; if (onRight) { leftPage = (pagenumber > 0) ? pdf.getPage(pagenumber - 1) : null; rightPage = page; } else { leftPage = page; rightPage = (pagenumber < (pagecount - 1)) ? pdf.getPage(pagenumber + 1) : null; } if (leftPage != null) { leftPageRect = (Rectangle2D.Float) PagePanel.getFullPageView(leftPage); } if (rightPage != null) { rightPageRect = (Rectangle2D.Float) PagePanel.getFullPageView(rightPage); } if (leftPageRect == null) { leftPageRect = (Rectangle2D.Float) rightPageRect.clone(); } if (rightPageRect == null) { rightPageRect = (Rectangle2D.Float) leftPageRect.clone(); } JScrollBar hsb = scrollPane.getHorizontalScrollBar(); JScrollBar vsb = scrollPane.getVerticalScrollBar(); float prw = leftPageRect.width + rightPageRect.width; float prh = Math.max(leftPageRect.height, rightPageRect.height); Dimension size = getSize(); float w = (float) Math.ceil(prw * Util.getScreenResolution(this) / 72) + (margin * 4) + interpagemargin + vsb.getWidth(); float h = (float) Math.ceil(prh * Util.getScreenResolution(this) / 72) + (margin * 2) + hsb.getHeight(); switch (zoommode) { case ZOOM_FITWIDTH: outzoom = (float) size.width / w; break; case ZOOM_FITHEIGHT: outzoom = (float) size.height / h; break; case ZOOM_FIT: float zw = (float) size.width / w; float zh = (float) size.height / h; outzoom = zw < zh ? zw : zh; break; default: outzoom = zoom == 0 ? 1 : zoom; } } return outzoom; }