From c79fac229fe13f9697c8cda1730acb6a205b946f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 6 Mar 2021 10:40:24 +0100 Subject: [PATCH] #1639 Clearing search results for current file --- CHANGELOG.md | 1 + .../flash/gui/MainFrameClassicMenu.java | 6 ++- .../decompiler/flash/gui/MainFrameMenu.java | 51 ++++++++++++------- .../flash/gui/MainFrameRibbonMenu.java | 7 +++ .../flash/gui/SearchResultsStorage.java | 15 ++++++ .../flash/gui/locales/MainFrame.properties | 4 +- 6 files changed, 62 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ad77fcc6..7631543a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ All notable changes to this project will be documented in this file. ## [Unreleased] ### Added - #1645 Scrollbar to recent searches dropdown +- #1639 Clearing search results for current file ## [14.1.0] - 2021-03-05 ### Added diff --git a/src/com/jpexs/decompiler/flash/gui/MainFrameClassicMenu.java b/src/com/jpexs/decompiler/flash/gui/MainFrameClassicMenu.java index edead606d..f8574e224 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainFrameClassicMenu.java +++ b/src/com/jpexs/decompiler/flash/gui/MainFrameClassicMenu.java @@ -268,9 +268,11 @@ public class MainFrameClassicMenu extends MainFrameMenu { @Override public void setGroupSelection(String group, String selected) { - selected = mapping(selected); + if (selected != null) { + selected = mapping(selected); + } for (String path : menuGroups.get(group)) { - setMenuChecked(path, path.equals(selected)); + setMenuChecked(path, selected == null ? false : path.equals(selected)); } } diff --git a/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java b/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java index 59064a4cb..e87db3456 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java +++ b/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java @@ -1177,32 +1177,45 @@ public abstract class MainFrameMenu implements MenuBuilder { clearMenu("/tools/" + (supportsMenuAction() ? "search" : "recentsearch")); SWF swf = Main.getMainFrame().getPanel().getCurrentSwf(); - List indices = Main.searchResultsStorage.getIndicesForSwf(swf); - for (int i = 0; i < indices.size(); i++) { - final int fi = indices.get(i); - String searched = Main.searchResultsStorage.getSearchedValueAt(fi); - ActionListener a = (ActionEvent e) -> { - SearchResultsDialog sr; - List> listeners = new ArrayList<>(); - listeners.add(Main.getMainFrame().getPanel().getABCPanel()); - listeners.add(Main.getMainFrame().getPanel().getActionPanel()); + if (swf != null) { + List indices = Main.searchResultsStorage.getIndicesForSwf(swf); + int j = 0; + for (int i = 0; i < indices.size(); i++) { + final int fi = indices.get(i); + String searched = Main.searchResultsStorage.getSearchedValueAt(fi); + ActionListener a = (ActionEvent e) -> { + SearchResultsDialog sr; + List> listeners = new ArrayList<>(); + listeners.add(Main.getMainFrame().getPanel().getABCPanel()); + listeners.add(Main.getMainFrame().getPanel().getActionPanel()); - if (swf.isAS3()) { - sr = new SearchResultsDialog<>(Main.getMainFrame().getWindow(), searched, Main.searchResultsStorage.isIgnoreCaseAt(fi), Main.searchResultsStorage.isRegExpAt(fi), listeners); + if (swf.isAS3()) { + sr = new SearchResultsDialog<>(Main.getMainFrame().getWindow(), searched, Main.searchResultsStorage.isIgnoreCaseAt(fi), Main.searchResultsStorage.isRegExpAt(fi), listeners); - } else { - sr = new SearchResultsDialog<>(Main.getMainFrame().getWindow(), searched, Main.searchResultsStorage.isIgnoreCaseAt(fi), Main.searchResultsStorage.isRegExpAt(fi), listeners); - } - sr.setResults(Main.searchResultsStorage.getSearchResultsAt(mainFrame.getPanel().getAllSwfs(), fi)); - sr.setVisible(true); - Main.getMainFrame().getPanel().searchResultsDialogs.add(sr); - }; - addMenuItem("/tools/" + (supportsMenuAction() ? "search" : "recentsearch") + "/" + i, searched, null, a, 0, null, true, null, false); + } else { + sr = new SearchResultsDialog<>(Main.getMainFrame().getWindow(), searched, Main.searchResultsStorage.isIgnoreCaseAt(fi), Main.searchResultsStorage.isRegExpAt(fi), listeners); + } + sr.setResults(Main.searchResultsStorage.getSearchResultsAt(mainFrame.getPanel().getAllSwfs(), fi)); + sr.setVisible(true); + Main.getMainFrame().getPanel().searchResultsDialogs.add(sr); + }; + addMenuItem("/tools/" + (supportsMenuAction() ? "search" : "recentsearch") + "/" + i, j + " " + searched, null, a, 0, null, true, null, false); + j++; + } + if (indices.size() > 0) { + addMenuItem("/tools/" + (supportsMenuAction() ? "search" : "recentsearch") + "/clear", translate("menu.recentSearches.clear"), null, this::clearRecentSearchesForCurrentSwfActionPerformed, 0, null, true, null, false); + } } finishMenu("/tools/" + (supportsMenuAction() ? "search" : "recentsearch")); } + protected void clearRecentSearchesForCurrentSwfActionPerformed(ActionEvent evt) { + if (View.showConfirmDialog(mainFrame.getPanel(), translate("message.confirm.recentSearches.clear"), translate("message.confirm"), JOptionPane.OK_CANCEL_OPTION) == JOptionPane.OK_OPTION) { + Main.searchResultsStorage.clearForSwf(swf); + } + } + protected void loadRecent(ActionEvent evt) { List recentFiles = Configuration.getRecentFiles(); clearMenu("/file/" + (supportsMenuAction() ? "open" : "recent")); diff --git a/src/com/jpexs/decompiler/flash/gui/MainFrameRibbonMenu.java b/src/com/jpexs/decompiler/flash/gui/MainFrameRibbonMenu.java index e4fce5213..e521a125a 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainFrameRibbonMenu.java +++ b/src/com/jpexs/decompiler/flash/gui/MainFrameRibbonMenu.java @@ -211,6 +211,13 @@ public class MainFrameRibbonMenu extends MainFrameMenu { emptyLabel.setHorizontalAlignment(SwingUtilities.LEFT); emptyLabel.setEnabled(false); searchHistoryPanel.addButtonToLastGroup(emptyLabel); + height += emptyLabel.getHeight() + 4 /*layoutGap*/; + } else { + JCommandButton clearButton = new JCommandButton(translate("menu.recentSearches.clear")); + clearButton.setHorizontalAlignment(SwingUtilities.LEFT); + clearButton.addActionListener(this::clearRecentSearchesForCurrentSwfActionPerformed); + searchHistoryPanel.addButtonToLastGroup(clearButton); + height += clearButton.getHeight() + 4 /*layoutGap*/; } searchHistoryPanel.setMaxButtonColumns(1); diff --git a/src/com/jpexs/decompiler/flash/gui/SearchResultsStorage.java b/src/com/jpexs/decompiler/flash/gui/SearchResultsStorage.java index 5fdb32ced..146f564e6 100644 --- a/src/com/jpexs/decompiler/flash/gui/SearchResultsStorage.java +++ b/src/com/jpexs/decompiler/flash/gui/SearchResultsStorage.java @@ -300,6 +300,21 @@ public class SearchResultsStorage { unpackedData.clear(); } + public void clearForSwf(SWF swf) { + String swfId = getSwfId(swf); + for (int i = 0; i < swfIds.size(); i++) { + if (swfIds.get(i).equals(swfId)) { + swfIds.remove(i); + searchedValues.remove(i); + isIgnoreCase.remove(i); + isRegExp.remove(i); + groups.remove(i); + data.remove(i); + unpackedData.remove(i); + } + } + } + private static void writeByteList(ObjectOutputStream os, List data) throws IOException { os.writeInt(data.size()); for (byte[] d : data) { diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties index ae7e02af3..2553c4f64 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties @@ -795,4 +795,6 @@ message.confirm.removemultiple.nodep = Are you sure you want to remove %count% i menu.recentSearches = Recent searches for current file menu.recentSearches.empty = Recent searches list is empty -menu.tools.otherTools.clearRecentSearches = Clear recent searches \ No newline at end of file +menu.tools.otherTools.clearRecentSearches = Clear recent searches +menu.recentSearches.clear = clear search results +message.confirm.recentSearches.clear = Do you really want to clear recent searches for current file? \ No newline at end of file