From d6cf6a2c8b4be51748e89239cf98bbe0129699f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Tue, 23 Feb 2021 22:50:48 +0100 Subject: [PATCH] Proper removing search results on SWF close --- .../flash/search/ABCSearchResult.java | 5 +++ .../flash/search/ActionSearchResult.java | 5 +++ .../flash/search/ScriptSearchResult.java | 2 +- .../decompiler/flash/search/SearchResult.java | 11 ++++++ .../decompiler/flash/gui/MainFrameMenu.java | 5 +-- .../flash/gui/MainFrameRibbonMenu.java | 5 +-- .../jpexs/decompiler/flash/gui/MainPanel.java | 35 ++++++++++--------- .../flash/gui/SearchResultsDialog.java | 19 +++++++++- .../flash/gui/SearchResultsStorage.java | 11 +++++- 9 files changed, 70 insertions(+), 28 deletions(-) create mode 100644 libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/search/SearchResult.java diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/search/ABCSearchResult.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/search/ABCSearchResult.java index 847dc3c7d..fe59f7afb 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/search/ABCSearchResult.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/search/ABCSearchResult.java @@ -176,4 +176,9 @@ public class ABCSearchResult implements Serializable, ScriptSearchResult { return result; } + + @Override + public SWF getSWF() { + return scriptPack.getSwf(); + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/search/ActionSearchResult.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/search/ActionSearchResult.java index ebb7e6f8a..8b4f110b6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/search/ActionSearchResult.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/search/ActionSearchResult.java @@ -87,4 +87,9 @@ public class ActionSearchResult implements ScriptSearchResult { public String toString() { return path; } + + @Override + public SWF getSWF() { + return src.getSwf(); + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/search/ScriptSearchResult.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/search/ScriptSearchResult.java index 241720032..34e7b05ee 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/search/ScriptSearchResult.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/search/ScriptSearchResult.java @@ -4,6 +4,6 @@ package com.jpexs.decompiler.flash.search; * * @author JPEXS */ -public interface ScriptSearchResult { +public interface ScriptSearchResult extends SearchResult { } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/search/SearchResult.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/search/SearchResult.java new file mode 100644 index 000000000..831964521 --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/search/SearchResult.java @@ -0,0 +1,11 @@ +package com.jpexs.decompiler.flash.search; + +import com.jpexs.decompiler.flash.SWF; + +/** + * + * @author JPEXS + */ +public interface SearchResult { + public SWF getSWF(); +} diff --git a/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java b/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java index df99cd5e4..b376ed018 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java +++ b/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java @@ -1195,10 +1195,7 @@ public abstract class MainFrameMenu implements MenuBuilder { } sr.setResults(Main.searchResultsStorage.getSearchResultsAt(mainFrame.getPanel().getAllSwfs(), fi)); sr.setVisible(true); - if (!Main.getMainFrame().getPanel().searchResultsDialogs.containsKey(swf)) { - Main.getMainFrame().getPanel().searchResultsDialogs.put(swf, new ArrayList<>()); - } - Main.getMainFrame().getPanel().searchResultsDialogs.get(swf).add(sr); + Main.getMainFrame().getPanel().searchResultsDialogs.add(sr); }; addMenuItem("/tools/" + (supportsMenuAction() ? "search" : "recentsearch") + "/" + i, searched, null, a, 0, null, true, null, false); } diff --git a/src/com/jpexs/decompiler/flash/gui/MainFrameRibbonMenu.java b/src/com/jpexs/decompiler/flash/gui/MainFrameRibbonMenu.java index bd3ffd8c3..0998f3ad0 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainFrameRibbonMenu.java +++ b/src/com/jpexs/decompiler/flash/gui/MainFrameRibbonMenu.java @@ -189,10 +189,7 @@ public class MainFrameRibbonMenu extends MainFrameMenu { } sr.setResults(Main.searchResultsStorage.getSearchResultsAt(Main.getMainFrame().getPanel().getAllSwfs(), fi)); sr.setVisible(true); - if (!Main.getMainFrame().getPanel().searchResultsDialogs.containsKey(swf)) { - Main.getMainFrame().getPanel().searchResultsDialogs.put(swf, new ArrayList<>()); - } - Main.getMainFrame().getPanel().searchResultsDialogs.get(swf).add(sr); + Main.getMainFrame().getPanel().searchResultsDialogs.add(sr); }); j++; historyButton.setHorizontalAlignment(SwingUtilities.LEFT); diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index 52d88c26b..13b3afe20 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -333,7 +333,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se public TreeItem oldItem; - public Map> searchResultsDialogs = new HashMap<>(); + public List searchResultsDialogs = new ArrayList<>(); private static final Logger logger = Logger.getLogger(MainPanel.class.getName()); @@ -937,10 +937,8 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se List swfsLists = new ArrayList<>(swfs); - for (SWF swf : searchResultsDialogs.keySet()) { - for (SearchResultsDialog sr : searchResultsDialogs.get(swf)) { - sr.setVisible(false); - } + for (SearchResultsDialog sr : searchResultsDialogs) { + sr.setVisible(false); } searchResultsDialogs.clear(); @@ -976,12 +974,21 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } } + List swfsToClose = new ArrayList<>(); + swfsToClose.addAll(swfList); for (SWF swf : swfList) { - if (searchResultsDialogs.containsKey(swf)) { - for (SearchResultsDialog sr : searchResultsDialogs.get(swf)) { - sr.setVisible(false); - } - searchResultsDialogs.remove(swf); + populateSwfs(swf, swfsToClose); + } + + for (int i = 0; i < searchResultsDialogs.size(); i++) { + SearchResultsDialog sr = searchResultsDialogs.get(i); + for (SWF swf : swfsToClose) { + sr.removeSwf(swf); + } + if (sr.isEmpty()) { + sr.setVisible(false); + searchResultsDialogs.remove(i); + i--; } } @@ -1935,13 +1942,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se SearchResultsDialog sr = new SearchResultsDialog<>(getMainFrame().getWindow(), txt, ignoreCase, regexp, listeners); sr.setResults(fResult); sr.setVisible(true); - if (swfsUsed.size() == 1) { - SWF usedSwf = swfsUsed.iterator().next(); - if (!searchResultsDialogs.containsKey(usedSwf)) { - searchResultsDialogs.put(usedSwf, new ArrayList<>()); - } - searchResultsDialogs.get(usedSwf).add(sr); - } + searchResultsDialogs.add(sr); if (!found) { View.showMessageDialog(null, translate("message.search.notfound").replace("%searchtext%", txt), translate("message.search.notfound.title"), JOptionPane.INFORMATION_MESSAGE); } diff --git a/src/com/jpexs/decompiler/flash/gui/SearchResultsDialog.java b/src/com/jpexs/decompiler/flash/gui/SearchResultsDialog.java index f5cb1f229..cfd02b717 100644 --- a/src/com/jpexs/decompiler/flash/gui/SearchResultsDialog.java +++ b/src/com/jpexs/decompiler/flash/gui/SearchResultsDialog.java @@ -16,7 +16,9 @@ */ package com.jpexs.decompiler.flash.gui; +import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.configuration.Configuration; +import com.jpexs.decompiler.flash.search.SearchResult; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; @@ -27,6 +29,7 @@ import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.util.ArrayList; import java.util.List; import javax.swing.Box; import javax.swing.BoxLayout; @@ -44,7 +47,7 @@ import javax.swing.SwingConstants; * @author JPEXS * @param Element to search */ -public class SearchResultsDialog extends AppDialog { +public class SearchResultsDialog extends AppDialog { private final JList resultsList; @@ -133,6 +136,20 @@ public class SearchResultsDialog extends AppDialog { } } + public void removeSwf(SWF swf) { + List newItems = new ArrayList<>(); + for (int i = 0; i < model.getSize(); i++) { + if (model.getElementAt(i).getSWF() != swf) { + newItems.add(model.getElementAt(i)); + } + } + setResults(newItems); + } + + public boolean isEmpty() { + return model.isEmpty(); + } + private void gotoButtonActionPerformed(ActionEvent evt) { gotoElement(); } diff --git a/src/com/jpexs/decompiler/flash/gui/SearchResultsStorage.java b/src/com/jpexs/decompiler/flash/gui/SearchResultsStorage.java index cc8490512..0a3238894 100644 --- a/src/com/jpexs/decompiler/flash/gui/SearchResultsStorage.java +++ b/src/com/jpexs/decompiler/flash/gui/SearchResultsStorage.java @@ -139,7 +139,16 @@ public class SearchResultsStorage { @SuppressWarnings("unchecked") public List getSearchResultsAt(Set allSwfs, int index) { if (unpackedData.containsKey(index)) { - return unpackedData.get(index); + + List unpacked = unpackedData.get(index); + List res = new ArrayList<>(); + for (ScriptSearchResult sr : unpacked) { + if (allSwfs.contains(sr.getSWF())) { + res.add(sr); + } + } + + return res; } List result = new ArrayList<>();