private void setPreviewScale(float scale) {
   preview.setFitVertical(false);
   preview.setFitHorizontal(false);
   preview.setScale(scale);
   rememberScrollingPosition();
   updatePreviewSize();
   restoreScrollingPosition();
 }
  /**
   * Executes the GridPrint example.
   *
   * @param args the command line arguments.
   */
  public static void main(String[] args) {
    final Display display = new Display();

    Shell shell = new Shell(display, SWT.SHELL_TRIM);
    shell.setText("GridPrintVerticalAlignmentExample.java");
    shell.setLayout(new GridLayout());
    shell.setSize(600, 800);

    final PrintJob job = new PrintJob("GridPrintVerticalAlignmentExample.java", createPrint());

    Composite buttonPanel = new Composite(shell, SWT.NONE);
    buttonPanel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
    buttonPanel.setLayout(new RowLayout(SWT.HORIZONTAL));

    final PrintPreview preview = new PrintPreview(shell, SWT.BORDER);

    Button prev = new Button(buttonPanel, SWT.PUSH);
    prev.setText("<< Prev");
    prev.addListener(
        SWT.Selection,
        new Listener() {
          public void handleEvent(Event event) {
            preview.setPageIndex(Math.max(preview.getPageIndex() - 1, 0));
          }
        });

    Button next = new Button(buttonPanel, SWT.PUSH);
    next.setText("Next >>");
    next.addListener(
        SWT.Selection,
        new Listener() {
          public void handleEvent(Event event) {
            preview.setPageIndex(Math.min(preview.getPageIndex() + 1, preview.getPageCount() - 1));
          }
        });

    Button print = new Button(buttonPanel, SWT.PUSH);
    print.setText("Print");
    print.addListener(
        SWT.Selection,
        new Listener() {
          public void handleEvent(Event event) {
            PaperClips.print(job, new PrinterData());
          }
        });

    preview.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
    preview.setFitHorizontal(true);
    preview.setFitVertical(true);
    preview.setPrintJob(job);

    shell.open();

    while (!shell.isDisposed()) if (!display.readAndDispatch()) display.sleep();

    display.dispose();
  }
  public Control createControl(Composite parent) {
    Composite shell = new Composite(parent, SWT.None);

    final PrintJob job = new PrintJob("GridPrintVerticalAlignmentExample.java", createPrint());
    shell.setLayout(new org.eclipse.swt.layout.GridLayout());

    Composite buttonPanel = new Composite(shell, SWT.NONE);
    buttonPanel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
    buttonPanel.setLayout(new RowLayout(SWT.HORIZONTAL));

    final PrintPreview preview = new PrintPreview(shell, SWT.BORDER);

    Button prev = new Button(buttonPanel, SWT.PUSH);
    prev.setText("<< Prev");
    prev.addListener(
        SWT.Selection,
        new Listener() {
          public void handleEvent(Event event) {
            preview.setPageIndex(Math.max(preview.getPageIndex() - 1, 0));
          }
        });

    Button next = new Button(buttonPanel, SWT.PUSH);
    next.setText("Next >>");
    next.addListener(
        SWT.Selection,
        new Listener() {
          public void handleEvent(Event event) {
            preview.setPageIndex(Math.min(preview.getPageIndex() + 1, preview.getPageCount() - 1));
          }
        });

    Button print = new Button(buttonPanel, SWT.PUSH);
    print.setText("Print");
    print.addListener(
        SWT.Selection,
        new Listener() {
          public void handleEvent(Event event) {
            PaperClips.print(job, new PrinterData());
          }
        });

    preview.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
    preview.setFitHorizontal(true);
    preview.setFitVertical(true);
    preview.setPrintJob(job);
    return shell;
  }
 protected void updateJob() {
   printJob = new PrintJob("Default Print job", print.createPrinter());
   preview.setPrintJob(printJob);
   forgetScrollingPosition();
   updatePreviewSize();
   updatePageNumber();
 }
 private void restoreScrollingPosition() {
   if (scrollingPosition != null) {
     Point size = preview.getSize();
     scroll.setOrigin(
         (int) Math.round(scrollingPosition[0] * size.x),
         (int) Math.round(scrollingPosition[1] * size.y));
   }
 }
 private void updatePageNumber() {
   int pageIndex = preview.getPageIndex();
   int pageCount = preview.getPageCount();
   int visiblePageCount = preview.getHorizontalPageCount() * preview.getVerticalPageCount();
   String text =
       (visiblePageCount > 1
               ? "Pages "
                   + (pageIndex + 1)
                   + "-"
                   + Math.min(pageCount, pageIndex + visiblePageCount)
               : "Page " + (pageIndex + 1))
           + " of "
           + pageCount;
   pageNumber.setText(text);
   previousPage.setEnabled(pageIndex > 0);
   nextPage.setEnabled(pageIndex < pageCount - visiblePageCount);
   shell.layout(new Control[] {pageNumber});
 }
 private void rememberScrollingPosition() {
   Point size = preview.getSize();
   if (size.x == 0 || size.y == 0) {
     forgetScrollingPosition();
   } else if (scrollingPosition == null) {
     Point origin = scroll.getOrigin();
     scrollingPosition =
         new double[] {(double) origin.x / (double) size.x, (double) origin.y / (double) size.y};
   }
 }
 private void updatePreviewSize() {
   Point minSize;
   Rectangle bounds = scroll.getClientArea();
   if (preview.isFitHorizontal()) {
     if (preview.isFitVertical()) minSize = new Point(0, 0); // Best fit
     else minSize = new Point(0, preview.computeSize(bounds.width, SWT.DEFAULT).y); // Fit to width
   } else {
     if (preview.isFitVertical())
       minSize = new Point(preview.computeSize(SWT.DEFAULT, bounds.height).x, 0); // Fit to height
     else minSize = preview.computeSize(SWT.DEFAULT, SWT.DEFAULT); // Custom
     // scale
   }
   scroll.setMinSize(minSize);
 }
 private void setPreviewPageIndex(int pageIndex) {
   preview.setPageIndex(Math.max(Math.min(pageIndex, preview.getPageCount() - 1), 0));
   updatePageNumber();
 }
  private Control createScrollingPreview(Composite parent) {
    scroll = new ScrolledComposite(parent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
    scroll.setExpandHorizontal(true);
    scroll.setExpandVertical(true);

    preview = new PrintPreview(scroll, SWT.NONE);
    scroll.setContent(preview);

    scroll.addListener(
        SWT.Resize,
        new Listener() {
          public void handleEvent(Event event) {
            Rectangle bounds = scroll.getClientArea();

            scroll.getHorizontalBar().setPageIncrement(bounds.width * 2 / 3);
            scroll.getVerticalBar().setPageIncrement(bounds.height * 2 / 3);

            if (preview.isFitHorizontal() ^ preview.isFitVertical()) {
              rememberScrollingPosition();
              updatePreviewSize();
              restoreScrollingPosition();
            }
          }
        });

    preview.setFitVertical(true);
    preview.setFitHorizontal(true);

    Listener dragListener =
        new Listener() {
          private final Point dpi = display.getDPI();
          private boolean scrollable = false;

          private boolean dragging = false;
          private Point dragStartScrollOrigin = null;
          private Point dragStartMouseAnchor = null;

          public void handleEvent(Event event) {
            switch (event.type) {
              case SWT.Resize:
                forgetScrollingPosition();
                Rectangle bounds = scroll.getClientArea();
                Point size = preview.getSize();
                scrollable = size.x > bounds.width || size.y > bounds.height;
                if (!scrollable && dragging) endDragging();
                break;
              case SWT.MouseDown:
                forgetScrollingPosition();
                if (scrollable && event.button == 1) beginDragging(event);
                break;
              case SWT.MouseMove:
                if (dragging) {
                  forgetScrollingPosition();
                  Point point = preview.toDisplay(event.x, event.y);
                  scroll.setOrigin(
                      dragStartScrollOrigin.x + dragStartMouseAnchor.x - point.x,
                      dragStartScrollOrigin.y + dragStartMouseAnchor.y - point.y);
                }
                break;
              case SWT.MouseUp:
                forgetScrollingPosition();
                if (dragging) endDragging();
                break;
              case SWT.MouseEnter:
                display.addFilter(SWT.MouseWheel, this);
                break;
              case SWT.MouseWheel:
                if (event.count != 0) {
                  if (scrollable
                      && !dragging
                      && (event.stateMask == SWT.NONE || event.stateMask == SWT.SHIFT)) {
                    forgetScrollingPosition();
                    bounds = scroll.getClientArea();
                    size = preview.getSize();
                    Point origin = scroll.getOrigin();
                    int direction = event.count > 0 ? -1 : 1;
                    // Prefer vertical scrolling unless user is
                    // pressing Shift
                    if (size.y > bounds.height && event.stateMask == SWT.NONE)
                      origin.y += direction * Math.min(dpi.y, bounds.height / 4);
                    else if (size.x > bounds.width)
                      origin.x += direction * Math.min(dpi.x, bounds.width / 4);
                    scroll.setOrigin(origin);
                    event.doit = false;
                  } else if (event.stateMask == SWT.CTRL) { // Ctrl+MouseWheel
                    // ->
                    // zoom
                    float scale = preview.getAbsoluteScale();
                    setPreviewScale(event.count > 0 ? scale / 1.1f : scale * 1.1f);
                  }
                }
                break;
              case SWT.MouseExit:
                display.removeFilter(SWT.MouseWheel, this);
                break;
            }
          }

          private void beginDragging(Event event) {
            dragStartScrollOrigin = scroll.getOrigin();
            dragStartMouseAnchor = preview.toDisplay(event.x, event.y);
            dragging = true;
          }

          private void endDragging() {
            dragging = false;
            dragStartMouseAnchor = null;
            dragStartScrollOrigin = null;
          }
        };

    scroll.addListener(SWT.Resize, dragListener);
    preview.addListener(SWT.MouseDown, dragListener);
    preview.addListener(SWT.MouseMove, dragListener);
    preview.addListener(SWT.MouseUp, dragListener);

    // These are for mouse wheel handling
    preview.addListener(SWT.MouseEnter, dragListener);
    preview.addListener(SWT.MouseExit, dragListener);

    return scroll;
  }