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);
 }
  /**
   * @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));
        }
      }
    }
  }
 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;
  }