/*
* Copyright (c) 2006 Matthew Hall and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Matthew Hall - initial API and implementation
*/
package org.eclipse.nebula.paperclips.snippets;
import org.eclipse.nebula.paperclips.core.PaperClips;
import org.eclipse.nebula.paperclips.core.Print;
import org.eclipse.nebula.paperclips.core.PrintJob;
import org.eclipse.nebula.paperclips.core.grid.DefaultGridLook;
import org.eclipse.nebula.paperclips.core.grid.GridPrint;
import org.eclipse.nebula.paperclips.core.page.PageNumberPageDecoration;
import org.eclipse.nebula.paperclips.core.page.PagePrint;
import org.eclipse.nebula.paperclips.core.page.SimplePageDecoration;
import org.eclipse.nebula.paperclips.core.text.TextPrint;
import org.eclipse.nebula.paperclips.widgets.PrintPreview;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.printing.PrintDialog;
import org.eclipse.swt.printing.PrinterData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Spinner;
/**
* Demonstrate use of PrintPreview control.
*
* @author Matthew
*/
public class Snippet7 {
public static Print createPrint() {
DefaultGridLook look = new DefaultGridLook();
look.setCellSpacing(5, 2);
GridPrint grid = new GridPrint("p:g, d:g", look);
String text = "The quick brown fox jumps over the lazy dog.";
for (int i = 0; i < 500; i++)
grid.add(new TextPrint(text));
PagePrint page = new PagePrint(grid);
page.setHeader(new SimplePageDecoration(new TextPrint("Snippet7.java",
SWT.CENTER)));
page.setFooter(new PageNumberPageDecoration(SWT.CENTER));
page.setHeaderGap(5);
page.setFooterGap(5);
return page;
}
public static class UI {
final Display display;
PrintJob printJob;
Shell shell;
Button previousPage;
Label pageNumber;
Button nextPage;
ScrolledComposite scroll;
PrintPreview preview;
double[] scrollingPosition;
public UI(Display display) {
this.display = display;
}
public Shell createShell() {
printJob = new PrintJob("Snippet7.java", createPrint())
.setMargins(108); // 1.5"
shell = new Shell(display);
shell.setText("Snippet7.java");
shell.setBounds(100, 100, 800, 600);
shell.setLayout(new GridLayout(1, false));
createButtonPanel(shell).setLayoutData(
new GridData(SWT.FILL, SWT.FILL, true, false));
createScrollingPreview(shell).setLayoutData(
new GridData(SWT.FILL, SWT.FILL, true, true));
preview.setPrintJob(printJob);
updatePreviewSize();
updatePageNumber();
shell.setVisible(true);
return shell;
}
private Control createButtonPanel(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(16, false);
layout.marginWidth = layout.marginHeight = 0;
composite.setLayout(layout);
previousPage = createIconButton(composite, "previous_page.gif",
"Previous Page", new Listener() {
public void handleEvent(Event event) {
setPreviewPageIndex(preview.getPageIndex()
- preview.getHorizontalPageCount()
* preview.getVerticalPageCount());
}
});
pageNumber = new Label(composite, SWT.NONE);
nextPage = createIconButton(composite, "next_page.gif",
"Next Page", new Listener() {
public void handleEvent(Event event) {
setPreviewPageIndex(preview.getPageIndex()
+ preview.getHorizontalPageCount()
* preview.getVerticalPageCount());
}
});
createIconButton(composite, "fit_horizontal.png", "Fit Width",
new Listener() {
public void handleEvent(Event event) {
preview.setFitHorizontal(true);
preview.setFitVertical(false);
rememberScrollingPosition();
updatePreviewSize();
restoreScrollingPosition();
}
});
createIconButton(composite, "fit_vertical.png", "Fit Height",
new Listener() {
public void handleEvent(Event event) {
preview.setFitVertical(true);
preview.setFitHorizontal(false);
rememberScrollingPosition();
updatePreviewSize();
restoreScrollingPosition();
}
});
createIconButton(composite, "fit_best.png", "Fit Window",
new Listener() {
public void handleEvent(Event event) {
preview.setFitVertical(true);
preview.setFitHorizontal(true);
rememberScrollingPosition();
updatePreviewSize();
restoreScrollingPosition();
}
});
createIconButton(composite, "zoom_in.gif", "Zoom In",
new Listener() {
public void handleEvent(Event event) {
setPreviewScale(preview.getAbsoluteScale() * 1.1f);
}
});
createIconButton(composite, "zoom_out.gif", "Zoom Out",
new Listener() {
public void handleEvent(Event event) {
setPreviewScale(preview.getAbsoluteScale() / 1.1f);
}
});
createIconButton(composite, "zoom_scale.gif", "Zoom to Scale",
new Listener() {
public void handleEvent(Event event) {
setPreviewScale(1);
}
});
createTextButton(composite, "Port", "Portrait Orientation",
new Listener() {
public void handleEvent(Event event) {
printJob
.setOrientation(PaperClips.ORIENTATION_PORTRAIT);
preview.setPrintJob(printJob);
forgetScrollingPosition();
updatePreviewSize();
updatePageNumber();
}
});
createTextButton(composite, "Land", "Landscape Orientation",
new Listener() {
public void handleEvent(Event event) {
printJob
.setOrientation(PaperClips.ORIENTATION_LANDSCAPE);
preview.setPrintJob(printJob);
forgetScrollingPosition();
updatePreviewSize();
updatePageNumber();
}
});
createIconButton(composite, "print.gif", "Print", new Listener() {
public void handleEvent(Event event) {
PrintDialog dialog = new PrintDialog(shell, SWT.NONE);
PrinterData printerData = dialog.open();
if (printerData != null) {
PaperClips.print(printJob, printerData);
preview.setPrinterData(printerData);
}
}
});
createLabel(composite, "Horz Pages");
createPageCountSpinner(composite, new Listener() {
public void handleEvent(Event event) {
preview.setHorizontalPageCount(((Spinner) event.widget)
.getSelection());
forgetScrollingPosition();
updatePreviewSize();
updatePageNumber();
}
});
createLabel(composite, "Vert Pages");
createPageCountSpinner(composite, new Listener() {
public void handleEvent(Event event) {
preview.setVerticalPageCount(((Spinner) event.widget)
.getSelection());
forgetScrollingPosition();
updatePreviewSize();
updatePageNumber();
}
});
return composite;
}
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;
}
private Button createIconButton(Composite parent, String imageFilename,
String toolTipText, Listener selectionListener) {
Button button = createButton(parent, toolTipText, selectionListener);
button.setImage(createImage(imageFilename));
return button;
}
private Button createTextButton(Composite parent, String text,
String toolTipText, Listener selectionListener) {
Button button = createButton(parent, toolTipText, selectionListener);
button.setText(text);
return button;
}
private Button createButton(Composite parent, String toolTipText,
Listener selectionListener) {
Button button = new Button(parent, SWT.PUSH);
button.setToolTipText(toolTipText);
button
.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false,
false));
button.addListener(SWT.Selection, selectionListener);
return button;
}
private Spinner createPageCountSpinner(Composite parent,
Listener selectionListener) {
Spinner spinner = new Spinner(parent, SWT.BORDER);
spinner.setMinimum(1);
spinner.setMaximum(99);
spinner.addListener(SWT.Selection, selectionListener);
return spinner;
}
private void createLabel(Composite parent, String text) {
new Label(parent, SWT.NONE).setText(text);
}
private Image createImage(String filename) {
final Image image = new Image(display, getClass()
.getResourceAsStream(filename));
shell.addListener(SWT.Dispose, new Listener() {
public void handleEvent(Event event) {
image.dispose();
}
});
return image;
}
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 forgetScrollingPosition() {
scrollingPosition = null;
}
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 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 setPreviewScale(float scale) {
preview.setFitVertical(false);
preview.setFitHorizontal(false);
preview.setScale(scale);
rememberScrollingPosition();
updatePreviewSize();
restoreScrollingPosition();
}
private void setPreviewPageIndex(int pageIndex) {
preview.setPageIndex(Math.max(Math.min(pageIndex, preview
.getPageCount() - 1), 0));
updatePageNumber();
}
}
/**
* Executes the snippet.
*
* @param args
* command-line args.
*/
public static void main(String[] args) {
final Display display = Display.getDefault();
Shell shell = new UI(display).createShell();
while (!shell.isDisposed())
if (!display.readAndDispatch())
display.sleep();
display.dispose();
}
}