]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/utils/vtkPanelUtil.java
eb0e727ed334f3338aed8d174f3a0daf72492fa1
[simantics/3d.git] / org.simantics.g3d.vtk / src / org / simantics / g3d / vtk / utils / vtkPanelUtil.java
1 package org.simantics.g3d.vtk.utils;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.List;\r
5 \r
6 import org.simantics.g3d.vtk.Activator;\r
7 import org.simantics.g3d.vtk.preferences.CloseMethod;\r
8 import org.simantics.g3d.vtk.preferences.PreferenceConstants;\r
9 import org.simantics.utils.threads.AWTThread;\r
10 \r
11 import vtk.vtkCamera;\r
12 import vtk.vtkObject;\r
13 import vtk.vtkPanel;\r
14 import vtk.vtkReferenceInformation;\r
15 import vtk.vtkRenderWindow;\r
16 import vtk.vtkRenderer;\r
17 \r
18 public class vtkPanelUtil {\r
19         \r
20         private static List<vtkPanel> activePanels = new ArrayList<vtkPanel>();\r
21         private static List<vtkPanel> waitingToDeletePanels = new ArrayList<vtkPanel>();\r
22         \r
23         public static void registerPanel(vtkPanel panel) {\r
24                 activePanels.add(panel);\r
25         }\r
26         \r
27         public static void unregisterPanel(vtkPanel panel) {\r
28                 assert (Thread.currentThread() == AWTThread.getThreadAccess().getThread());\r
29                 if (!activePanels.remove(panel))\r
30                         return;\r
31                 CloseMethod method = getCloseMethod();\r
32                 if (method == CloseMethod.ON_LAST_CLOSE) {\r
33                         waitingToDeletePanels.add(panel);\r
34                 \r
35                         if (activePanels.size() == 0) {\r
36                                 cleanup();\r
37                         }\r
38                 } else if (method == CloseMethod.ON_CLOSE) {\r
39                         dPanel(panel);\r
40                         vtkGC();\r
41                 } else if (method == CloseMethod.NO_CLOSE) {\r
42                         waitingToDeletePanels.add(panel);                       \r
43                 }\r
44         }\r
45         \r
46         public static CloseMethod getCloseMethod() {\r
47                 return CloseMethod.valueOf(Activator.getDefault().getPreferenceStore().getString(PreferenceConstants.CLOSE_METHOD));\r
48         }\r
49         \r
50         private static void cleanup() {\r
51                 \r
52                 for (vtkPanel p : waitingToDeletePanels) {\r
53                         dPanel(p);\r
54                 }\r
55                 waitingToDeletePanels.clear();\r
56                 vtkGC();\r
57         }\r
58         \r
59         private static void vtkGC() {\r
60                 vtkReferenceInformation info = vtkObject.JAVA_OBJECT_MANAGER.gc(true);\r
61                 System.out.println("Referenced objects when closing editor: " + info.getTotalNumberOfObjects() + "\n");\r
62                 System.out.println(info.listRemovedReferenceToString());\r
63                 System.out.println(info.listKeptReferenceToString());\r
64         }\r
65 \r
66         \r
67         private static void dPanel(vtkPanel panel) {\r
68                 panel.lock();\r
69                 vtkCamera camera = panel.GetRenderer().GetActiveCamera();\r
70                 vtkRenderer ren = panel.GetRenderer();\r
71                 vtkRenderWindow win = panel.GetRenderWindow();\r
72                 win.SetForceMakeCurrent();\r
73                 panel.Delete();\r
74                 panel = null;\r
75                 camera.Delete();\r
76                 ren.Delete();\r
77                 win.Delete();\r
78         }\r
79 }\r