From 15ab519570fe13d73f47f29b0b3b8cf0fe3b7948 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 4 Feb 2023 15:00:43 +0100 Subject: [PATCH] Fixed #1960 Quick search does not search in SWF name or folder names --- CHANGELOG.md | 3 + .../flash/gui/tagtree/FilteredTreeModel.java | 72 ++++++++++++------- 2 files changed, 51 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a9632800..a0f115c76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,9 @@ All notable changes to this project will be documented in this file. ### Fixed - [#1960] Hide tag tree root handles as it was in previous versions +### Changed +- [#1960] Quick search does not search in SWF name or folder names + ## [18.3.4] - 2023-01-30 ### Added - [#1029] Better separation of library and main app, dependencies inside library zip, library readme diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/FilteredTreeModel.java b/src/com/jpexs/decompiler/flash/gui/tagtree/FilteredTreeModel.java index d2463d9c7..9c47543da 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/FilteredTreeModel.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/FilteredTreeModel.java @@ -16,6 +16,11 @@ */ package com.jpexs.decompiler.flash.gui.tagtree; +import com.jpexs.decompiler.flash.SWF; +import com.jpexs.decompiler.flash.gui.abc.ClassesListTreeModel; +import com.jpexs.decompiler.flash.treeitems.FolderItem; +import com.jpexs.decompiler.flash.treeitems.Openable; +import com.jpexs.decompiler.flash.treeitems.OpenableList; import com.jpexs.decompiler.flash.treeitems.TreeItem; import java.util.ArrayList; import java.util.List; @@ -31,25 +36,26 @@ import javax.swing.tree.TreePath; * * @author JPEXS */ -public class FilteredTreeModel implements TreeModel { +public class FilteredTreeModel implements TreeModel { + private String filter; - + private TreeItem root; private Map> subItems = new WeakHashMap<>(); - - private final List listeners = new ArrayList<>(); - + + private final List listeners = new ArrayList<>(); + private final JTree tree; public String getFilter() { return filter; - } + } public FilteredTreeModel(String filter, AbstractTagTreeModel fullModel, JTree tree) { this.filter = filter; this.tree = tree; - - fullModel.addTreeModelListener(new TreeModelListener() { + + fullModel.addTreeModelListener(new TreeModelListener() { @Override public void treeNodesChanged(TreeModelEvent e) { rebuildTree(fullModel); @@ -72,7 +78,7 @@ public class FilteredTreeModel implements TreeModel { }); rebuildTree(fullModel); } - + private void rebuildTree(AbstractTagTreeModel fullModel) { subItems.clear(); this.root = fullModel.getRoot(); @@ -80,30 +86,47 @@ public class FilteredTreeModel implements TreeModel { TreePath selectionPaths[] = tree.getSelectionPaths(); if (selectionPaths != null) { List currentPathItems = new ArrayList<>(); - for (TreePath tp:selectionPaths) { + for (TreePath tp : selectionPaths) { for (int i = 0; i < tp.getPathCount(); i++) { currentPathItems.add(tp.getPathComponent(i).toString()); } } selectionPathsList.add(String.join(".", currentPathItems)); } - buildTree(fullModel, this.root, "root", selectionPathsList); + buildTree(fullModel, this.root, "root", "", selectionPathsList); fireTreeStructureChanged(new TreeModelEvent(this, new Object[]{root})); } - - private void buildTree(AbstractTagTreeModel fullModel, TreeItem item, String path, List selectionPaths) { + + private boolean isItemSearchable(TreeItem ti) { + if (ti instanceof Openable) { + return false; + } + if (ti instanceof OpenableList) { + return false; + } + if (ti instanceof FolderItem) { + return false; + } + if (ti instanceof ClassesListTreeModel) { + return false; + } + return true; + } + + private void buildTree(AbstractTagTreeModel fullModel, TreeItem item, String path, String searchPath, List selectionPaths) { List items = fullModel.getAllChildren(item); List newSubItems = new ArrayList<>(); if (filter.trim().isEmpty()) { newSubItems.addAll(items); } else { - for (TreeItem ti: items) { + for (TreeItem ti : items) { String subPath = path + "." + ti.toString(); - boolean matches = subPath.toLowerCase().contains(filter.toLowerCase()); + String searchSubPath = isItemSearchable(ti) ? searchPath + "." + ti.toString() : searchPath; + boolean matches = searchSubPath.toLowerCase().contains(filter.toLowerCase()); if (fullModel.isLeaf(ti)) { - if (matches || selectionPaths.contains(subPath)) { - newSubItems.add(ti); - } + if (matches || selectionPaths.contains(subPath)) { + newSubItems.add(ti); + } } else { newSubItems.add(ti); } @@ -113,16 +136,17 @@ public class FilteredTreeModel implements TreeModel { for (int i = 0; i < newSubItems.size(); i++) { TreeItem ti = newSubItems.get(i); String subPath = path + "." + ti.toString(); - buildTree(fullModel, ti, subPath, selectionPaths); + String searchSubPath = isItemSearchable(ti) ? searchPath + "." + ti.toString() : searchPath; + buildTree(fullModel, ti, subPath, searchSubPath, selectionPaths); if (!selectionPaths.contains(subPath) && !fullModel.isLeaf(ti) && (!this.subItems.containsKey(ti) || this.subItems.get(ti).isEmpty())) { newSubItems.remove(i); i--; } } - + if (!newSubItems.isEmpty()) { this.subItems.put(item, newSubItems); - } + } } @Override @@ -156,7 +180,7 @@ public class FilteredTreeModel implements TreeModel { @Override public void valueForPathChanged(TreePath path, Object newValue) { - + } @Override @@ -176,7 +200,7 @@ public class FilteredTreeModel implements TreeModel { public void removeTreeModelListener(TreeModelListener l) { listeners.remove(l); } - + protected void fireTreeNodesRemoved(TreeModelEvent e) { for (TreeModelListener listener : listeners) { listener.treeNodesRemoved(e); @@ -194,5 +218,5 @@ public class FilteredTreeModel implements TreeModel { listener.treeStructureChanged(e); } } - + }