From cfaf5b5362c22e0c29ff3d46250c2a331b694af1 Mon Sep 17 00:00:00 2001 From: Shaverdova Elena Date: Wed, 16 Nov 2011 15:43:15 +0400 Subject: [PATCH] WD, Recursive compare: added soft references to cached content; removed memory leaks on linked Local/Remote DiffItems from model --- .../intellij/openapi/diff/DirDiffManager.java | 4 +-- .../diff/impl/dir/DirDiffManagerImpl.java | 31 ++++++++++++++----- .../diff/impl/dir/DirDiffTableModel.java | 4 +++ 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/platform/platform-api/src/com/intellij/openapi/diff/DirDiffManager.java b/platform/platform-api/src/com/intellij/openapi/diff/DirDiffManager.java index 24212e36eb29..b7a233b187be 100644 --- a/platform/platform-api/src/com/intellij/openapi/diff/DirDiffManager.java +++ b/platform/platform-api/src/com/intellij/openapi/diff/DirDiffManager.java @@ -31,8 +31,8 @@ public abstract class DirDiffManager { public static DirDiffManager getInstance(@NotNull Project project) { return ServiceManager.getService(project, DirDiffManager.class); } - - public abstract void showDiff(@NotNull DiffElement dir1, @NotNull DiffElement dir2, DirDiffSettings settings, @Nullable WindowListener windowListener); + + public abstract void showDiff(@NotNull DiffElement dir1, @NotNull DiffElement dir2, DirDiffSettings settings, Runnable onWindowClose); public abstract void showDiff(@NotNull DiffElement dir1, @NotNull DiffElement dir2, DirDiffSettings settings); diff --git a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffManagerImpl.java b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffManagerImpl.java index 75aca288ce16..a882ae689a06 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffManagerImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffManagerImpl.java @@ -26,7 +26,10 @@ import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.awt.event.WindowListener; +import javax.swing.*; +import java.awt.*; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; /** * @author Konstantin Bulenkov @@ -42,21 +45,35 @@ public class DirDiffManagerImpl extends DirDiffManager { public void showDiff(@NotNull final DiffElement dir1, @NotNull final DiffElement dir2, final DirDiffSettings settings, - @Nullable WindowListener windowListener) { + @Nullable final Runnable onWindowClose) { final DirDiffTableModel model = new DirDiffTableModel(myProject, dir1, dir2, settings); if (settings.showInFrame) { DirDiffFrame frame = new DirDiffFrame(myProject, model); - if (windowListener != null) { - frame.getFrame().addWindowListener(windowListener); + if (onWindowClose != null) { + final JFrame jFrame = frame.getFrame(); + jFrame.addWindowListener(new WindowAdapter() { + @Override + public void windowClosed(WindowEvent e) { + onWindowClose.run(); + jFrame.removeWindowListener(this); + } + }); } frame.show(); } else { - final DirDiffDialog dirDiffDialog = new DirDiffDialog(myProject, model); + DirDiffDialog dirDiffDialog = new DirDiffDialog(myProject, model); if (myProject == null || myProject.isDefault()) { dirDiffDialog.setModal(true); } - if (windowListener != null) { - dirDiffDialog.getOwner().addWindowListener(windowListener); + if (onWindowClose != null) { + final Window owner = dirDiffDialog.getOwner(); + owner.addWindowListener(new WindowAdapter() { + @Override + public void windowClosed(WindowEvent e) { + onWindowClose.run(); + owner.removeWindowListener(this); + } + }); } dirDiffDialog.show(); } diff --git a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffTableModel.java b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffTableModel.java index 61f6a7c3f356..2ebd770d6060 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffTableModel.java +++ b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffTableModel.java @@ -508,6 +508,10 @@ public class DirDiffTableModel extends AbstractTableModel implements DirDiffMode @Override public void dispose() { myListeners.clear(); + myElements.clear(); + mySrc = null; + myTrg = null; + myTree = null; } public DirDiffSettings getSettings() {