package org.archstudio.bna.ui.swt; import java.awt.image.BufferedImage; import org.archstudio.bna.IBNAView; import org.archstudio.bna.ui.utils.AbstractSWTUI; import org.archstudio.bna.utils.BNAUtils; import org.archstudio.swtutils.SWTWidgetUtils; import org.archstudio.sysutils.Finally; import org.eclipse.swt.SWT; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Composite; public class SWTBNAUI extends AbstractSWTUI implements PaintListener { Composite parent; Canvas canvas; SWTResources resources; public SWTBNAUI(IBNAView view) { super(view); } @Override public void init(Composite parent, int style) { this.parent = parent; canvas = new Canvas(parent, style | SWT.NO_BACKGROUND | SWT.DOUBLE_BUFFERED); super.init(canvas, true); view.setBNAUI(this); canvas.addPaintListener(this); } @Override public void dispose() { if (!canvas.isDisposed()) { canvas.dispose(); } if (resources != null) { resources.dispose(); } super.dispose(); } @Override public Composite getComposite() { return canvas; } @Override public void forceFocus() { canvas.forceFocus(); } private volatile boolean needsRepaint = false; @Override public void paint() { if (!needsRepaint) { needsRepaint = true; SWTWidgetUtils.async(canvas, new Runnable() { @Override public void run() { needsRepaint = false; canvas.redraw(); } }); } } @Override public void paintControl(PaintEvent e) { try (Finally lock = BNAUtils.lock()) { if (resources == null) { resources = new SWTResources(); } resources.setGc(e.gc); loadPreferences(resources, parent); resources.renderTopLevelThings(view, new Rectangle(e.x, e.y, e.width, e.height)); resources.invalidate(); } } @Override public BufferedImage render(final Rectangle localBounds) { final BufferedImage[] image = new BufferedImage[1]; SWTWidgetUtils.sync(canvas, new Runnable() { @Override public void run() { image[0] = resources.renderToImage(view, localBounds); } }); return image[0]; } }