X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=org.simantics.g3d.vtk%2Fsrc%2Forg%2Fsimantics%2Fg3d%2Fvtk%2Futils%2FvtkPanelUtil.java;fp=org.simantics.g3d.vtk%2Fsrc%2Forg%2Fsimantics%2Fg3d%2Fvtk%2Futils%2FvtkPanelUtil.java;h=eb0e727ed334f3338aed8d174f3a0daf72492fa1;hb=87b3241ec277ba3d8e414b26186a032c9cdcaeed;hp=0000000000000000000000000000000000000000;hpb=1f0bcd66274375f2278d2e6c486cb28257a5f7b2;p=simantics%2F3d.git 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 index 00000000..eb0e727e --- /dev/null +++ b/org.simantics.g3d.vtk/src/org/simantics/g3d/vtk/utils/vtkPanelUtil.java @@ -0,0 +1,79 @@ +package org.simantics.g3d.vtk.utils; + +import java.util.ArrayList; +import java.util.List; + +import org.simantics.g3d.vtk.Activator; +import org.simantics.g3d.vtk.preferences.CloseMethod; +import org.simantics.g3d.vtk.preferences.PreferenceConstants; +import org.simantics.utils.threads.AWTThread; + +import vtk.vtkCamera; +import vtk.vtkObject; +import vtk.vtkPanel; +import vtk.vtkReferenceInformation; +import vtk.vtkRenderWindow; +import vtk.vtkRenderer; + +public class vtkPanelUtil { + + private static List activePanels = new ArrayList(); + private static List waitingToDeletePanels = new ArrayList(); + + public static void registerPanel(vtkPanel panel) { + activePanels.add(panel); + } + + public static void unregisterPanel(vtkPanel panel) { + assert (Thread.currentThread() == AWTThread.getThreadAccess().getThread()); + if (!activePanels.remove(panel)) + return; + CloseMethod method = getCloseMethod(); + if (method == CloseMethod.ON_LAST_CLOSE) { + waitingToDeletePanels.add(panel); + + if (activePanels.size() == 0) { + cleanup(); + } + } else if (method == CloseMethod.ON_CLOSE) { + dPanel(panel); + vtkGC(); + } else if (method == CloseMethod.NO_CLOSE) { + waitingToDeletePanels.add(panel); + } + } + + public static CloseMethod getCloseMethod() { + return CloseMethod.valueOf(Activator.getDefault().getPreferenceStore().getString(PreferenceConstants.CLOSE_METHOD)); + } + + private static void cleanup() { + + for (vtkPanel p : waitingToDeletePanels) { + dPanel(p); + } + waitingToDeletePanels.clear(); + vtkGC(); + } + + private static void vtkGC() { + vtkReferenceInformation info = vtkObject.JAVA_OBJECT_MANAGER.gc(true); + System.out.println("Referenced objects when closing editor: " + info.getTotalNumberOfObjects() + "\n"); + System.out.println(info.listRemovedReferenceToString()); + System.out.println(info.listKeptReferenceToString()); + } + + + private static void dPanel(vtkPanel panel) { + panel.lock(); + vtkCamera camera = panel.GetRenderer().GetActiveCamera(); + vtkRenderer ren = panel.GetRenderer(); + vtkRenderWindow win = panel.GetRenderWindow(); + win.SetForceMakeCurrent(); + panel.Delete(); + panel = null; + camera.Delete(); + ren.Delete(); + win.Delete(); + } +}