package standalone; import org.eclipse.draw2d.Figure; import org.eclipse.draw2d.FigureCanvas; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.RoundedRectangle; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.swt.SWT; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; public class FigureCanvasTransparency { private static int xStart = -1; private static int yStart = -1; private static int xEnd = -1; private static int yEnd = -1; private static boolean mouseDown = false; private static FigureCanvas canvas; private static FigureCanvasTransparency instance; public static void main(String[] args) { instance = new FigureCanvasTransparency(); final Display display = new Display(); final Shell figurecanvasTransparencyTestShell = new Shell(); figurecanvasTransparencyTestShell.setLayout(new FillLayout()); figurecanvasTransparencyTestShell.setText("FigureCanvas Transparency Test"); canvas = new FigureCanvas(figurecanvasTransparencyTestShell, SWT.NONE); IFigure root = new Figure(); root.setOpaque(false); root.setBounds(new Rectangle(0, 0, 575, 350)); RoundedRectangle rect1 = new RoundedRectangle(); rect1.setBackgroundColor(Display.getCurrent().getSystemColor(SWT.COLOR_YELLOW)); rect1.setFill(true); rect1.setBounds(new Rectangle(100, 100, 200, 150)); rect1.setOpaque(false); root.add(rect1); RoundedRectangle rect2 = new RoundedRectangle(); rect2.setBackgroundColor(Display.getCurrent().getSystemColor(SWT.COLOR_TITLE_BACKGROUND_GRADIENT)); rect2.setFill(true); rect2.setBounds(new Rectangle(250, 150, 200, 150)); rect2.setOpaque(false); root.add(rect2); canvas.setContents(root); instance.createGesturePaintListener(); instance.createGestureOnMouseMove(); instance.createZoomGestureOnMouseClick(); figurecanvasTransparencyTestShell.setSize(600, 400); figurecanvasTransparencyTestShell.open(); figurecanvasTransparencyTestShell.layout(); while (!figurecanvasTransparencyTestShell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } } private void createZoomGestureOnMouseClick() { canvas.addMouseListener(new org.eclipse.swt.events.MouseAdapter() { public void mouseDown(org.eclipse.swt.events.MouseEvent event) { doGestureOnMouseDown(event); } public void mouseUp(org.eclipse.swt.events.MouseEvent event) { doGestureOnMouseUp(event); } }); } private void doGestureOnMouseDown(org.eclipse.swt.events.MouseEvent event) { final org.eclipse.swt.events.MouseEvent e = event; if (e.widget instanceof FigureCanvas) { mouseDown = true; xStart = e.x; yStart = e.y; } } /** * @param event */ private void doGestureOnMouseUp(org.eclipse.swt.events.MouseEvent event) { final org.eclipse.swt.events.MouseEvent e = event; mouseDown = false; xEnd = e.x; yEnd = e.y; } private void createGestureOnMouseMove() { canvas.addMouseMoveListener(new org.eclipse.swt.events.MouseMoveListener() { public void mouseMove(org.eclipse.swt.events.MouseEvent e) { if (!mouseDown) { return; } xEnd = e.x; yEnd = e.y; canvas.redraw(); } }); } /** * */ private void createGesturePaintListener() { canvas.addPaintListener(new PaintListener() { public void paintControl(PaintEvent event) { if (mouseDown) { drawGesture(event.gc); } } }); } private void drawGesture(GC gc) { org.eclipse.swt.graphics.Rectangle mouseRect = new org.eclipse.swt.graphics.Rectangle( Math.min(xEnd, xStart), Math.min(yEnd, yStart), Math.abs(xEnd - xStart), Math.abs(yEnd - yStart)); // draw gesture rectangle gc.setAlpha(192); gc.setBackground(new Color(canvas.getDisplay(), 240, 240, 240)); gc.setForeground(new Color(canvas.getDisplay(), 64, 64, 64)); gc.fillRectangle(mouseRect); gc.drawRectangle(mouseRect); } }