]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/utils/vtkPanelUtil.java
3D framework (Simca 2012)
[simantics/3d.git] / org.simantics.g3d.vtk / src / org / simantics / g3d / vtk / utils / vtkPanelUtil.java
diff --git a/org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/utils/vtkPanelUtil.java b/org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/utils/vtkPanelUtil.java
new file mode 100644 (file)
index 0000000..eb0e727
--- /dev/null
@@ -0,0 +1,79 @@
+package org.simantics.g3d.vtk.utils;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.simantics.g3d.vtk.Activator;\r
+import org.simantics.g3d.vtk.preferences.CloseMethod;\r
+import org.simantics.g3d.vtk.preferences.PreferenceConstants;\r
+import org.simantics.utils.threads.AWTThread;\r
+\r
+import vtk.vtkCamera;\r
+import vtk.vtkObject;\r
+import vtk.vtkPanel;\r
+import vtk.vtkReferenceInformation;\r
+import vtk.vtkRenderWindow;\r
+import vtk.vtkRenderer;\r
+\r
+public class vtkPanelUtil {\r
+       \r
+       private static List<vtkPanel> activePanels = new ArrayList<vtkPanel>();\r
+       private static List<vtkPanel> waitingToDeletePanels = new ArrayList<vtkPanel>();\r
+       \r
+       public static void registerPanel(vtkPanel panel) {\r
+               activePanels.add(panel);\r
+       }\r
+       \r
+       public static void unregisterPanel(vtkPanel panel) {\r
+               assert (Thread.currentThread() == AWTThread.getThreadAccess().getThread());\r
+               if (!activePanels.remove(panel))\r
+                       return;\r
+               CloseMethod method = getCloseMethod();\r
+               if (method == CloseMethod.ON_LAST_CLOSE) {\r
+                       waitingToDeletePanels.add(panel);\r
+               \r
+                       if (activePanels.size() == 0) {\r
+                               cleanup();\r
+                       }\r
+               } else if (method == CloseMethod.ON_CLOSE) {\r
+                       dPanel(panel);\r
+                       vtkGC();\r
+               } else if (method == CloseMethod.NO_CLOSE) {\r
+                       waitingToDeletePanels.add(panel);                       \r
+               }\r
+       }\r
+       \r
+       public static CloseMethod getCloseMethod() {\r
+               return CloseMethod.valueOf(Activator.getDefault().getPreferenceStore().getString(PreferenceConstants.CLOSE_METHOD));\r
+       }\r
+       \r
+       private static void cleanup() {\r
+               \r
+               for (vtkPanel p : waitingToDeletePanels) {\r
+                       dPanel(p);\r
+               }\r
+               waitingToDeletePanels.clear();\r
+               vtkGC();\r
+       }\r
+       \r
+       private static void vtkGC() {\r
+               vtkReferenceInformation info = vtkObject.JAVA_OBJECT_MANAGER.gc(true);\r
+               System.out.println("Referenced objects when closing editor: " + info.getTotalNumberOfObjects() + "\n");\r
+               System.out.println(info.listRemovedReferenceToString());\r
+               System.out.println(info.listKeptReferenceToString());\r
+       }\r
+\r
+       \r
+       private static void dPanel(vtkPanel panel) {\r
+               panel.lock();\r
+               vtkCamera camera = panel.GetRenderer().GetActiveCamera();\r
+               vtkRenderer ren = panel.GetRenderer();\r
+               vtkRenderWindow win = panel.GetRenderWindow();\r
+               win.SetForceMakeCurrent();\r
+               panel.Delete();\r
+               panel = null;\r
+               camera.Delete();\r
+               ren.Delete();\r
+               win.Delete();\r
+       }\r
+}\r