1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
|
package vtk.rendering.swt;
import org.eclipse.swt.opengl.GLCanvas;
import org.eclipse.swt.widgets.Composite;
import vtk.vtkRenderWindow;
import vtk.rendering.vtkAbstractComponent;
/**
* Provide SWT based vtk rendering component
*
* @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 vtkSwtComponent extends vtkAbstractComponent<GLCanvas> {
protected vtkInternalSwtComponent uiComponent;
protected boolean isWindowCreated;
public vtkSwtComponent(Composite parentComposite) {
this(new vtkRenderWindow(), parentComposite);
}
public vtkSwtComponent(vtkRenderWindow renderWindowToUse, Composite parentComposite) {
super(renderWindowToUse);
this.eventForwarder = new vtkSwtInteractorForwarderDecorator(this, this.eventForwarder);
this.isWindowCreated = true;
this.uiComponent = new vtkInternalSwtComponent(this, parentComposite);
}
/**
* Set the size of the VTK component
* @param x width
* @param y height
*/
public void setSize(int x, int y) {
x = x < 1 ? 1 : x;
y = y < 1 ? 1 : y;
super.setSize(x, y);
this.uiComponent.setSize(x, y);
this.uiComponent.redraw();
this.uiComponent.update();
}
/**
* Render the VTK component. Should not be called externally.
* Call update() to refresh the window content.
*/
public void Render() {
// Make sure we can render
if (inRenderCall || renderer == null || renderWindow == null) {
return;
}
// Try to render
try {
lock.lockInterruptibly();
inRenderCall = true;
// Trigger the real render
renderWindow.Render();
} catch (InterruptedException e) {
// Nothing that we can do except skipping execution
} finally {
lock.unlock();
inRenderCall = false;
}
}
/**
* Redraw the VTK component
*/
public void update() {
this.uiComponent.redraw();
this.uiComponent.update();
}
/**
* @return the encapsulated SWT component (a GLCanvas instance)
* @see vtk.rendering.vtkAbstractComponent#getComponent()
*/
public GLCanvas getComponent() {
return this.uiComponent;
}
public void Delete() {
this.lock.lock();
// We prevent any further rendering
this.inRenderCall = true;
this.renderWindow = null;
super.Delete();
this.lock.unlock();
}
/**
* @return true if the graphical component has been properly set and
* operation can be performed on it.
*/
public boolean isWindowSet() {
return this.isWindowCreated;
}
/**
* Just allow class in same package to affect inRenderCall boolean
*
* @param value
*/
protected void updateInRenderCall(boolean value) {
this.inRenderCall = value;
}
}
|