+package vtk.rendering.swt;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+
+import com.jogamp.opengl.GLAutoDrawable;
+import com.jogamp.opengl.GLCapabilities;
+import com.jogamp.opengl.GLProfile;
+import com.jogamp.opengl.GLRunnable;
+import com.jogamp.opengl.swt.GLCanvas;
+
+import vtk.vtkObject;
+
+/**
+ * @author Joachim Pouderoux - joachim.pouderoux@kitware.com, Kitware SAS 2012
+ * @copyright This work was supported by CEA/CESTA
+ * Commissariat a l'Energie Atomique et aux Energies Alternatives,
+ * 15 avenue des Sablieres, CS 60001, 33116 Le Barp, France.
+ */
+public class vtkInternalSwtComponent extends GLCanvas implements Listener {
+
+ private vtkSwtComponent parent;
+
+ public static GLCapabilities GetGLCapabilities() {
+ GLCapabilities caps;
+ caps = new GLCapabilities(GLProfile.get(GLProfile.GL2GL3));
+ caps.setDoubleBuffered(true);
+ caps.setHardwareAccelerated(true);
+ caps.setSampleBuffers(false);
+ caps.setNumSamples(4);
+
+ caps.setAlphaBits(8);
+
+ return caps;
+ }
+
+ public vtkInternalSwtComponent(vtkSwtComponent parent, Composite parentComposite) {
+
+ super(parentComposite, SWT.NO_BACKGROUND, GetGLCapabilities(), null);
+ this.parent = parent;
+
+ vtkSwtInteractorForwarderDecorator forwarder = (vtkSwtInteractorForwarderDecorator) this.parent
+ .getInteractorForwarder();
+
+ this.addMouseListener(forwarder);
+ this.addKeyListener(forwarder);
+ this.addMouseMoveListener(forwarder);
+ this.addMouseTrackListener(forwarder);
+ this.addMouseWheelListener(forwarder);
+
+ this.addListener(SWT.Paint, this);
+ this.addListener(SWT.Close, this);
+ this.addListener(SWT.Dispose, this);
+ this.addListener(SWT.Resize, this);
+
+ this.IntializeRenderWindow();
+ }
+
+ protected void IntializeRenderWindow() {
+
+ // setCurrent(); // need to be done so SetWindowIdFromCurrentContext can
+ // get the current context!
+ // Context is not created until the first draw call. The renderer isn't
+ // initialized until the context is
+ // present.
+ invoke(false, new GLRunnable() {
+
+ @Override
+ public boolean run(GLAutoDrawable arg0) {
+ // This makes this thread (should be the main thread) current
+ getContext().makeCurrent();
+ parent.getRenderWindow().InitializeFromCurrentContext();
+ // Swapping buffers is handled by the vtkSwtComponent
+ parent.getRenderWindow().SwapBuffersOff();
+ return false;
+ }
+ });
+
+ // Swap buffers to trigger context creation
+ swapBuffers();
+ setAutoSwapBufferMode(false);
+ }
+
+ @Override
+ public void update() {
+ super.update();
+ if (isRealized()) {
+ parent.Render();
+ }
+ }
+
+ @Override
+ public void dispose() {
+ this.removeListener(SWT.Paint, this);
+ this.removeListener(SWT.Close, this);
+ this.removeListener(SWT.Dispose, this);
+ this.removeListener(SWT.Resize, this);
+
+ if (getContext().isCurrent()) {
+ getContext().release();
+ }
+ super.dispose();
+ }
+
+ @Override
+ public void handleEvent(Event event) {
+ switch (event.type) {
+ case SWT.Paint:
+ if (isRealized()) {
+ parent.Render();
+ }
+ break;
+ case SWT.Dispose:
+ parent.Delete();
+ vtkObject.JAVA_OBJECT_MANAGER.gc(false);
+ break;
+ case SWT.Close:
+ // System.out.println("closing");
+ break;
+ case SWT.Resize:
+ parent.setSize(getClientArea().width, getClientArea().height);
+ break;
+ }
+ }
+}