--- /dev/null
+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