From 1069c92c317fec911ec78317b9f5919382d6fdc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Mon, 19 May 2025 00:40:57 +0200 Subject: [PATCH] Fixed: Proper freeing memory after SWF close 2 --- .../decompiler/flash/gui/FolderListPanel.java | 6 ++-- .../flash/gui/FolderPreviewPanel.java | 2 +- .../flash/gui/GenericTagTreePanel.java | 2 ++ .../jpexs/decompiler/flash/gui/MainPanel.java | 27 ++++++++++++-- .../decompiler/flash/gui/PreviewPanel.java | 1 + .../decompiler/flash/gui/TagInfoPanel.java | 9 +++++ .../flash/gui/tagtree/AbstractTagTree.java | 35 +++++++++++++++++++ 7 files changed, 76 insertions(+), 6 deletions(-) diff --git a/src/com/jpexs/decompiler/flash/gui/FolderListPanel.java b/src/com/jpexs/decompiler/flash/gui/FolderListPanel.java index 31e7119e5..00b330cd0 100644 --- a/src/com/jpexs/decompiler/flash/gui/FolderListPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/FolderListPanel.java @@ -19,6 +19,7 @@ package com.jpexs.decompiler.flash.gui; import com.jpexs.decompiler.flash.configuration.Configuration; import com.jpexs.decompiler.flash.gui.tagtree.AbstractTagTree; import com.jpexs.decompiler.flash.tags.Tag; +import com.jpexs.decompiler.flash.treeitems.Openable; import com.jpexs.decompiler.flash.treeitems.TreeItem; import com.jpexs.helpers.SerializableImage; import java.awt.Color; @@ -174,12 +175,13 @@ public class FolderListPanel extends JPanel { selectedItems.clear(); selectedIndex = -1; ((JScrollPane) getParent().getParent()).getVerticalScrollBar().setValue(0); - } - + } + public void clear() { items = new ArrayList<>(); selectedItems.clear(); selectedIndex = -1; + parentPath = null; } @Override diff --git a/src/com/jpexs/decompiler/flash/gui/FolderPreviewPanel.java b/src/com/jpexs/decompiler/flash/gui/FolderPreviewPanel.java index 91a98e8f1..4ddebba96 100644 --- a/src/com/jpexs/decompiler/flash/gui/FolderPreviewPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/FolderPreviewPanel.java @@ -171,7 +171,7 @@ public class FolderPreviewPanel extends JPanel { repaint(); ((JScrollPane) getParent().getParent()).getVerticalScrollBar().setValue(0); } - + public void clear() { items = new ArrayList<>(); executor.shutdownNow(); diff --git a/src/com/jpexs/decompiler/flash/gui/GenericTagTreePanel.java b/src/com/jpexs/decompiler/flash/gui/GenericTagTreePanel.java index da2924f69..1c230cfb9 100644 --- a/src/com/jpexs/decompiler/flash/gui/GenericTagTreePanel.java +++ b/src/com/jpexs/decompiler/flash/gui/GenericTagTreePanel.java @@ -103,6 +103,7 @@ import javax.swing.plaf.basic.BasicTreeUI; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.DefaultTreeSelectionModel; import javax.swing.tree.TreeCellEditor; import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; @@ -761,6 +762,7 @@ public class GenericTagTreePanel extends GenericTagPanel { tag = null; editedTag = null; tree.setModel(new DefaultTreeModel(new DefaultMutableTreeNode("root"))); + tree.setSelectionModel(new DefaultTreeSelectionModel()); revalidate(); repaint(); } diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index 55dd8ac82..6167c7233 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -1727,7 +1727,11 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se gcClipboard(); mainMenu.updateComponents(null); - previewPanel.clear(); + folderPreviewPanel.clear(); + folderListPanel.clear(); + previewPanel.clear(); + tagInfoPanel.clear(); + dumpPreviewPanel.clear(); return true; } @@ -1849,8 +1853,24 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } else { mainMenu.updateComponents(); } - previewPanel.clear(); + + folderPreviewPanel.clear(); + folderListPanel.clear(); + previewPanel.clear(); + tagInfoPanel.clear(); dumpPreviewPanel.clear(); + + List> nodes; + + //To properly clear cached TreePaths + nodes = View.getExpandedNodes(tagTree); + tagTree.setModel(tagTree.getFullModel()); + View.expandTreeNodes(tagTree, nodes); + + nodes = View.getExpandedNodes(tagListTree); + tagListTree.setModel(tagListTree.getFullModel()); + View.expandTreeNodes(tagListTree, nodes); + doFilter(); return true; } @@ -6135,7 +6155,8 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se folderPreviewPanel.clear(); folderListPanel.clear(); - previewPanel.clear(); + previewPanel.clear(); + tagInfoPanel.clear(); previewPanel.setImageReplaceButtonVisible(false, false, false, false, false, false, false); diff --git a/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java b/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java index 6aeab556b..afdc3ab5b 100644 --- a/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java @@ -1810,6 +1810,7 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel binaryPanel.setBinaryData(null); genericTagPanel.clear(); + displayEditGenericPanel.clear(); fontPanel.clear(); } diff --git a/src/com/jpexs/decompiler/flash/gui/TagInfoPanel.java b/src/com/jpexs/decompiler/flash/gui/TagInfoPanel.java index 3a35d4ead..50e6d089c 100644 --- a/src/com/jpexs/decompiler/flash/gui/TagInfoPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/TagInfoPanel.java @@ -109,6 +109,11 @@ public class TagInfoPanel extends JPanel { buildHtmlContent(); } + public void clear() { + this.tagInfo = new TagInfo(null); + buildHtmlContent(); + } + private void updateHtmlContent(boolean expand, boolean showDetails) { String categoryName = "general"; StringBuilder result = new StringBuilder(); @@ -117,6 +122,10 @@ public class TagInfoPanel extends JPanel { List items = tagInfo.getInfos().get(categoryName); + if (items == null) { + items = new ArrayList<>(); + } + if (View.isOceanic()) { result.append(""); } else { diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/AbstractTagTree.java b/src/com/jpexs/decompiler/flash/gui/tagtree/AbstractTagTree.java index 2a2b28464..2e94d155a 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/AbstractTagTree.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/AbstractTagTree.java @@ -107,6 +107,7 @@ import com.jpexs.decompiler.flash.types.CLIPACTIONRECORD; import java.awt.Color; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; @@ -221,6 +222,40 @@ public abstract class AbstractTagTree extends JTree { setHashColor(Color.gray); } } + + @Override + protected MouseListener createMouseListener() { + MouseListener handler = super.createMouseListener(); + return new MouseListener() { + @Override + public void mouseClicked(MouseEvent e) { + handler.mouseClicked(e); + } + + @Override + public void mousePressed(MouseEvent e) { + handler.mousePressed(e); + } + + @Override + public void mouseReleased(MouseEvent e) { + handler.mouseReleased(e); + } + + @Override + public void mouseEntered(MouseEvent e) { + handler.mouseEntered(e); + } + + @Override + public void mouseExited(MouseEvent e) { + handler.mouseReleased(e); //crucial to properly free nodes + handler.mouseExited(e); + } + + }; + } + }); ToolTipManager.sharedInstance().registerComponent(this); addMouseListener(new MouseAdapter() {