package ch.hsr.ifs.pasta; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.events.DragDetectEvent; import org.eclipse.swt.events.DragDetectListener; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseMoveListener; import org.eclipse.swt.graphics.Cursor; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Canvas; import org.eclipse.ui.plugin.AbstractUIPlugin; public class ASTScrolledCanvas extends Canvas { private static final int CURSOR_SIZE = 38; private Point dragSource = null; private boolean dragFlag = false; private final ImageData grabImage = AbstractUIPlugin .imageDescriptorFromPlugin(PastaPlugin.PLUGIN_ID, "/icons/closedhand.gif").getImageData(); private final Cursor grabCursor = new Cursor(getDisplay(), grabImage.scaledTo(CURSOR_SIZE, CURSOR_SIZE), CURSOR_SIZE / 2, CURSOR_SIZE / 4); private final ImageData openImage = AbstractUIPlugin .imageDescriptorFromPlugin(PastaPlugin.PLUGIN_ID, "/icons/openhand.gif") .getImageData(); private final Cursor openCursor = new Cursor(getDisplay(), openImage.scaledTo(CURSOR_SIZE, CURSOR_SIZE), CURSOR_SIZE / 2, CURSOR_SIZE / 4); ASTScrolledCanvas(final ScrolledComposite parent, final int style) { super(parent, style); setCursor(openCursor); addDragFunctionality(); } @Override public ScrolledComposite getParent() { return (ScrolledComposite) super.getParent(); } private void addDragFunctionality() { addMouseListener(new MouseAdapter() { @Override public void mouseDown(final MouseEvent e) { dragSource = new Point(e.x, e.y); setCursor(grabCursor); } @Override public void mouseUp(final MouseEvent e) { dragFlag = false; dragSource = null; setCursor(openCursor); } }); addMouseMoveListener(new MouseMoveListener() { @Override public void mouseMove(final MouseEvent e) { if (dragFlag) { ASTScrolledCanvas.this.getParent().setOrigin( ASTScrolledCanvas.this.getParent().getOrigin().x + (dragSource.x - e.x), ASTScrolledCanvas.this.getParent().getOrigin().y + (dragSource.y - e.y)); } } }); addDragDetectListener(new DragDetectListener() { @Override public void dragDetected(final DragDetectEvent e) { dragFlag = true; } }); } }