diff --git a/CHANGELOG.md b/CHANGELOG.md index cb445362e..116316161 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 - [#1898] Keyboard shortcut to remove tags (DEL, SHIFT+DEL) +- [#1765] Quick search tree for everything, not just AS3 classes ### Fixed - [#1897] Close menu button without selecting specific item @@ -2682,6 +2683,7 @@ All notable changes to this project will be documented in this file. [alpha 8]: https://github.com/jindrapetrik/jpexs-decompiler/compare/alpha7...alpha8 [alpha 7]: https://github.com/jindrapetrik/jpexs-decompiler/releases/tag/alpha7 [#1898]: https://www.free-decompiler.com/flash/issues/1898 +[#1765]: https://www.free-decompiler.com/flash/issues/1765 [#1897]: https://www.free-decompiler.com/flash/issues/1897 [#1888]: https://www.free-decompiler.com/flash/issues/1888 [#1895]: https://www.free-decompiler.com/flash/issues/1895 diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index 2a7064fff..8cbd7614e 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -281,7 +281,9 @@ import javax.swing.tree.DefaultTreeSelectionModel; import javax.swing.tree.TreePath; import jsyntaxpane.DefaultSyntaxKit; import com.jpexs.decompiler.flash.Bundle; +import com.jpexs.decompiler.flash.gui.tagtree.FilteredTreeModel; import com.jpexs.decompiler.flash.treeitems.Openable; +import javax.swing.tree.TreeModel; /** * @@ -412,6 +414,8 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se private PinsPanel pinsPanel; + private List> unfilteredExpandedNodes = new ArrayList<>(); + public void savePins() { pinsPanel.save(); } @@ -503,7 +507,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } View.expandTreeNodes(tagTree, expandedTagTree); View.expandTreeNodes(tagListTree, expandedTagListTree); - TreePath path = getCurrentTree().getModel().getTreePath(item); + TreePath path = getCurrentTree().getFullModel().getTreePath(item); getCurrentTree().setSelectionPath(path); getCurrentTree().scrollPathToVisible(path); repaintTree(); @@ -1120,7 +1124,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se if (tag == null) { ViewMessages.showMessageDialog(MainPanel.this, translate("message.character.notfound").replace("%characterid%", "" + characterId), translate("error"), JOptionPane.ERROR_MESSAGE); } else { - TreePath path = tagTree.getModel().getTreePath(tag); + TreePath path = tagTree.getFullModel().getTreePath(tag); if (path != null) { tagTree.setSelectionPath(path); } @@ -1146,7 +1150,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se updateUi(); this.openables.addCollectionChangedListener((e) -> { - AbstractTagTreeModel ttm = tagTree.getModel(); + AbstractTagTreeModel ttm = tagTree.getFullModel(); if (ttm != null) { if (getCurrentSwf() == null) { tagTree.setSelectionPath(ttm.getTreePath(ttm.getRoot())); @@ -1159,14 +1163,14 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } else if (e.getAction() == CollectionChangedAction.ADD) { OpenableList list = e.getNewItem(); if (!list.isBundle() && list.items.size() == 1) { - tagTree.expandPath(tagTree.getModel().getTreePath(list.get(0))); + tagTree.expandPath(tagTree.getFullModel().getTreePath(list.get(0))); } else { - tagTree.expandPath(tagTree.getModel().getTreePath(e.getNewItem())); + tagTree.expandPath(tagTree.getFullModel().getTreePath(list)); } } } } - ttm = tagListTree.getModel(); + ttm = tagListTree.getFullModel(); if (ttm != null) { if (getCurrentSwf() == null) { tagListTree.setSelectionPath(ttm.getTreePath(ttm.getRoot())); @@ -1180,9 +1184,9 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } else if (e.getAction() == CollectionChangedAction.ADD) { OpenableList list = e.getNewItem(); if (!list.isBundle() && list.items.size() == 1) { - tagListTree.expandPath(tagListTree.getModel().getTreePath(list.get(0))); + tagListTree.expandPath(tagListTree.getFullModel().getTreePath(list.get(0))); } else { - tagListTree.expandPath(tagListTree.getModel().getTreePath(e.getNewItem())); + tagListTree.expandPath(tagListTree.getFullModel().getTreePath(list)); } } } @@ -1297,9 +1301,9 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } gcClipboard(); - doFilter(); reload(false); View.expandTreeNodes(tagTree, expandedNodes); + doFilter(); pinsPanel.load(); } @@ -1317,9 +1321,9 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se gcClipboard(); - doFilter(); reload(false); - View.expandTreeNodes(getCurrentTree(), expandedNodes); + View.expandTreeNodes(getCurrentTree(), expandedNodes); + doFilter(); pinsPanel.load(); } @@ -1584,21 +1588,32 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } public void doFilter() { - View.checkAccess(); - - List nodes = getASTreeNodes(tagTree); - tagTree.clearSelection(); - for (TreeItem n : nodes) { - if (n instanceof ClassesListTreeModel) { - String filterText = filterField.getText(); - ((ClassesListTreeModel) n).setFilter(filterText); - TagTreeModel tm = tagTree.getModel(); - TreePath path = tm.getTreePath(n); - tm.updateNode(path); - if (!filterText.isEmpty()) { - View.expandTreeNodes(tagTree, path, true); - } + View.checkAccess(); + + TreeModel model = tagTree.getModel(); + String oldFilter = ""; + if (model instanceof FilteredTreeModel) { + oldFilter = ((FilteredTreeModel)model).getFilter(); + } + String newFilter = filterField.getText(); + + + if (oldFilter.trim().equals("")) { + unfilteredExpandedNodes = View.getExpandedNodes(tagTree); + } + + if (oldFilter.trim().equals(newFilter.trim())) { + return; + } + + tagTree.setModel(new FilteredTreeModel(newFilter, tagTree.getFullModel())); + if (!newFilter.trim().isEmpty()) { + for (int i = 0; i < tagTree.getRowCount(); i++) { + tagTree.expandRow(i); } + } else { + tagTree.setModel(tagTree.getFullModel()); + View.expandTreeNodes(tagTree, unfilteredExpandedNodes); } } @@ -2219,7 +2234,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } if (treeItem instanceof Timelined) { Timelined t = (Timelined) treeItem; - Frame f = tagTree.getModel().getFrame((SWF) treeItem.getOpenable(), t, frame); + Frame f = tagTree.getFullModel().getFrame((SWF) treeItem.getOpenable(), t, frame); if (f != null) { setTagTreeSelectedNode(getCurrentTree(), f); } @@ -2747,7 +2762,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } public void setTagTreeSelectedNode(AbstractTagTree tree, TreeItem treeItem) { - AbstractTagTreeModel ttm = tree.getModel(); + AbstractTagTreeModel ttm = tree.getFullModel(); TreePath tp = ttm.getTreePath(treeItem); if (tp != null) { tree.setSelectionPath(tp); @@ -4286,7 +4301,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se if (currentView == VIEW_TIMELINE) { return -1; } - TreePath path = getCurrentTree().getModel().getTreePath(treeItem); + TreePath path = getCurrentTree().getFullModel().getTreePath(treeItem); if (path == null) { return -1; } @@ -4314,7 +4329,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se return null; } - TreePath path = getCurrentTree().getModel().getTreePath(treeItem); + TreePath path = getCurrentTree().getFullModel().getTreePath(treeItem); if (path == null) { return null; } @@ -4397,13 +4412,13 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se if (tagTree.getModel() == null) { TagTreeModel ttm = new TagTreeModel(openables, Configuration.tagTreeShowEmptyFolders.get()); tagTree.setModel(ttm); - tagTree.expandFirstLevelNodes(); + //tagTree.expandFirstLevelNodes(); } if (tagListTree.getModel() == null) { TagListTreeModel ttm = new TagListTreeModel(openables); tagListTree.setModel(ttm); - tagListTree.expandFirstLevelNodes(); + //tagListTree.expandFirstLevelNodes(); } break; } @@ -4772,7 +4787,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se AbstractTagTree tree = getCurrentTree(); TreeItem treeItem = null; TreePath treePath = tree.getSelectionPath(); - if (treePath != null && tree.getModel().treePathExists(treePath)) { + if (treePath != null && tree.getFullModel().treePathExists(treePath)) { treeItem = (TreeItem) treePath.getLastPathComponent(); } @@ -5442,7 +5457,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } public String itemToString(TreeItem item) { - int index = getCurrentTree().getModel().getItemIndex(item); + int index = getCurrentTree().getFullModel().getItemIndex(item); String itemToStr = item.toString(); if (index > 1) { return itemToStr + " [" + index + "]"; diff --git a/src/com/jpexs/decompiler/flash/gui/PinButton.java b/src/com/jpexs/decompiler/flash/gui/PinButton.java index 983983c57..4e7643288 100644 --- a/src/com/jpexs/decompiler/flash/gui/PinButton.java +++ b/src/com/jpexs/decompiler/flash/gui/PinButton.java @@ -328,7 +328,7 @@ public class PinButton extends JPanel { } private String getTreeItemPath(TreeItem item) { - TreePath path = mainPanel.getCurrentTree().getModel().getTreePath(item); + TreePath path = mainPanel.getCurrentTree().getFullModel().getTreePath(item); if (path == null) { return ""; } diff --git a/src/com/jpexs/decompiler/flash/gui/View.java b/src/com/jpexs/decompiler/flash/gui/View.java index c9dcea89b..9bb685245 100644 --- a/src/com/jpexs/decompiler/flash/gui/View.java +++ b/src/com/jpexs/decompiler/flash/gui/View.java @@ -491,7 +491,7 @@ public class View { int rowCount = tree.getRowCount(); for (int i = 0; i < rowCount; i++) { try { - TreePath path = tree.getPathForRow(i); + TreePath path = tree.getPathForRow(i); if (tree.isExpanded(path)) { List pathAsStringList = new ArrayList<>(); for (Object pathCompnent : path.getPath()) { diff --git a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java index c818278af..87570eaa8 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java @@ -1372,7 +1372,7 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener allAbcs = new ArrayList<>(); for (ABCContainerTag container : swf.getAbcList()) { @@ -1404,7 +1404,7 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener= childCount) { - child = tree.getModel().getChild(dest, childCount - 1); + child = tree.getFullModel().getChild(dest, childCount - 1); } else { - child = tree.getModel().getChild(dest, childIndex); + child = tree.getFullModel().getChild(dest, childIndex); } if (child instanceof SWF) { SWF swf = (SWF) child; diff --git a/src/com/jpexs/decompiler/flash/gui/taglistview/TagListTreeCellRenderer.java b/src/com/jpexs/decompiler/flash/gui/taglistview/TagListTreeCellRenderer.java index ec4f68730..eda30bb97 100644 --- a/src/com/jpexs/decompiler/flash/gui/taglistview/TagListTreeCellRenderer.java +++ b/src/com/jpexs/decompiler/flash/gui/taglistview/TagListTreeCellRenderer.java @@ -148,7 +148,7 @@ public class TagListTreeCellRenderer extends DefaultTreeCellRenderer { semiTransparent = true; } - AbstractTagTreeModel model = aTree.getModel(); + AbstractTagTreeModel model = aTree.getFullModel(); int itemIndex = model.getItemIndex(val); if (itemIndex > 1) { lab.setText(lab.getText() + " [" + itemIndex + "]"); diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/AbstractTagTree.java b/src/com/jpexs/decompiler/flash/gui/tagtree/AbstractTagTree.java index 53651bc75..6cea8317a 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/AbstractTagTree.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/AbstractTagTree.java @@ -108,6 +108,7 @@ import javax.swing.Icon; import javax.swing.JTree; import javax.swing.ToolTipManager; import javax.swing.plaf.basic.BasicTreeUI; +import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; @@ -119,6 +120,8 @@ public abstract class AbstractTagTree extends JTree { public TagTreeContextMenu contextPopupMenu; protected final MainPanel mainPanel; + + private AbstractTagTreeModel fullModel; private static final Map ICONS; @@ -134,6 +137,14 @@ public abstract class AbstractTagTree extends JTree { } } + @Override + public void setModel(TreeModel newModel) { + super.setModel(newModel); + if (newModel instanceof AbstractTagTreeModel) { + this.fullModel = (AbstractTagTreeModel)newModel; + } + } + public MainPanel getMainPanel() { return mainPanel; } @@ -392,20 +403,19 @@ public abstract class AbstractTagTree extends JTree { return TreeNodeType.FOLDER; } - @Override - public AbstractTagTreeModel getModel() { - return (AbstractTagTreeModel) super.getModel(); + public AbstractTagTreeModel getFullModel() { + return fullModel; } public void expandRoot() { - AbstractTagTreeModel ttm = getModel(); - TreeItem root = ttm.getRoot(); + TreeModel ttm = getModel(); + Object root = ttm.getRoot(); expandPath(new TreePath(new Object[]{root})); } public void expandFirstLevelNodes() { - AbstractTagTreeModel ttm = getModel(); - TreeItem root = ttm.getRoot(); + TreeModel ttm = getModel(); + Object root = ttm.getRoot(); int childCount = ttm.getChildCount(root); for (int i = 0; i < childCount; i++) { expandPath(new TreePath(new Object[]{root, ttm.getChild(root, i)})); @@ -419,12 +429,13 @@ public abstract class AbstractTagTree extends JTree { TreePath tp = View.getTreePathByPathStrings(this, Arrays.asList(path)); if (tp != null) { // the current view is the Resources view, otherwise tp is null - if (mainPanel.getCurrentView() == MainPanel.VIEW_RESOURCES) { + /*if (mainPanel.getCurrentView() == MainPanel.VIEW_RESOURCES) { mainPanel.tagTree.expandPath(tp.getParentPath()); } if (mainPanel.getCurrentView() == MainPanel.VIEW_TAGLIST) { mainPanel.tagListTree.expandPath(tp.getParentPath()); - } + */ + expandPath(tp.getParentPath()); } } } @@ -454,7 +465,7 @@ public abstract class AbstractTagTree extends JTree { } public void getAllSubs(TreeItem o, List ret) { - AbstractTagTreeModel tm = getModel(); + AbstractTagTreeModel tm = getFullModel(); for (TreeItem c : tm.getAllChildren(o)) { ret.add(c); getAllSubs(c, ret); @@ -600,7 +611,7 @@ public abstract class AbstractTagTree extends JTree { } public void updateSwfs(Openable[] openables) { - AbstractTagTreeModel ttm = getModel(); + AbstractTagTreeModel ttm = getFullModel(); if (ttm != null) { List> expandedNodes = View.getExpandedNodes(this); ttm.updateOpenable(null); // todo: honfika: update only the changed swfs, but there was an exception when i tried it @@ -623,7 +634,7 @@ public abstract class AbstractTagTree extends JTree { } public String getItemPathString(TreeItem item) { - TreePath path = getModel().getTreePath(item); + TreePath path = getFullModel().getTreePath(item); if (path == null) { return null; } @@ -631,12 +642,12 @@ public abstract class AbstractTagTree extends JTree { } public final void calculateCollisions() { - getModel().calculateCollisions(); + getFullModel().calculateCollisions(); } public String pathToString(TreePath path) { StringBuilder sb = new StringBuilder(); - AbstractTagTreeModel model = getModel(); + AbstractTagTreeModel model = getFullModel(); if (path != null) { boolean first = true; for (Object p : path.getPath()) { @@ -772,4 +783,8 @@ public abstract class AbstractTagTree extends JTree { } return new ArrayList<>(); } + + + + } diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/FilteredTreeModel.java b/src/com/jpexs/decompiler/flash/gui/tagtree/FilteredTreeModel.java new file mode 100644 index 000000000..4b6fd19b8 --- /dev/null +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/FilteredTreeModel.java @@ -0,0 +1,184 @@ +/* + * Copyright (C) 2022 JPEXS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.jpexs.decompiler.flash.gui.tagtree; + +import com.jpexs.decompiler.flash.treeitems.TreeItem; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.WeakHashMap; +import javax.swing.event.TreeModelEvent; +import javax.swing.event.TreeModelListener; +import javax.swing.plaf.basic.BasicTreeUI; +import javax.swing.tree.TreeModel; +import javax.swing.tree.TreePath; + +/** + * + * @author JPEXS + */ +public class FilteredTreeModel implements TreeModel { + private String filter; + + private TreeItem root; + private Map> subItems = new WeakHashMap<>(); + + private final List listeners = new ArrayList<>(); + + public String getFilter() { + return filter; + } + + public FilteredTreeModel(String filter, AbstractTagTreeModel fullModel) { + this.filter = filter; + + fullModel.addTreeModelListener(new TreeModelListener() { + @Override + public void treeNodesChanged(TreeModelEvent e) { + rebuildTree(fullModel); + } + + @Override + public void treeNodesInserted(TreeModelEvent e) { + rebuildTree(fullModel); + } + + @Override + public void treeNodesRemoved(TreeModelEvent e) { + rebuildTree(fullModel); + } + + @Override + public void treeStructureChanged(TreeModelEvent e) { + rebuildTree(fullModel); + } + }); + rebuildTree(fullModel); + } + + private void rebuildTree(AbstractTagTreeModel fullModel) { + subItems.clear(); + this.root = fullModel.getRoot(); + buildTree(fullModel, this.root, "root"); + fireTreeStructureChanged(new TreeModelEvent(this, new Object[]{root})); + } + + private void buildTree(AbstractTagTreeModel fullModel, TreeItem item, String path) { + List items = fullModel.getAllChildren(item); + List newSubItems = new ArrayList<>(); + if (filter.trim().isEmpty()) { + newSubItems.addAll(items); + } else { + for (TreeItem ti: items) { + String subPath = path + "." + ti.toString(); + boolean matches = subPath.toLowerCase().contains(filter.toLowerCase()); + if (fullModel.isLeaf(ti)) { + if (matches) { + newSubItems.add(ti); + } + } else { + newSubItems.add(ti); + } + } + } + + for (int i = 0; i < newSubItems.size(); i++) { + TreeItem ti = newSubItems.get(i); + String subPath = path + "." + ti.toString(); + buildTree(fullModel, ti, subPath); + if (!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 + public Object getRoot() { + return root; + } + + @Override + public Object getChild(Object parent, int index) { + if (subItems.containsKey(parent)) { + return subItems.get(parent).get(index); + } + return null; + } + + @Override + public int getChildCount(Object parent) { + if (subItems.containsKey(parent)) { + return subItems.get(parent).size(); + } + return 0; + } + + @Override + public boolean isLeaf(Object node) { + if (subItems.containsKey(node)) { + return subItems.get(node).size() == 0; + } + return true; + } + + @Override + public void valueForPathChanged(TreePath path, Object newValue) { + + } + + @Override + public int getIndexOfChild(Object parent, Object child) { + if (subItems.containsKey(parent)) { + return subItems.get(parent).indexOf(child); + } + return -1; + } + + @Override + public void addTreeModelListener(TreeModelListener l) { + listeners.add(l); + } + + @Override + public void removeTreeModelListener(TreeModelListener l) { + listeners.remove(l); + } + + protected void fireTreeNodesRemoved(TreeModelEvent e) { + for (TreeModelListener listener : listeners) { + listener.treeNodesRemoved(e); + } + } + + protected void fireTreeNodesInserted(TreeModelEvent e) { + for (TreeModelListener listener : listeners) { + listener.treeNodesInserted(e); + } + } + + protected void fireTreeStructureChanged(TreeModelEvent e) { + for (TreeModelListener listener : listeners) { + listener.treeStructureChanged(e); + } + } + +} diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java index d9ceead2f..ab0608ed0 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java @@ -106,6 +106,7 @@ import java.util.Set; import javax.swing.JTree; import javax.swing.plaf.basic.BasicLabelUI; import javax.swing.tree.DefaultTreeCellRenderer; +import javax.swing.tree.TreePath; /** * @@ -126,7 +127,7 @@ public class TagTree extends AbstractTagTree { setOpaque(false); if (View.isOceanic()) { setBackgroundNonSelectionColor(Color.white); - } + } } @Override @@ -225,7 +226,7 @@ public class TagTree extends AbstractTagTree { if (aTree.getMainPanel().isClipboardCut() && aTree.getMainPanel().clipboardContains(val)) { semiTransparent = true; } - int itemIndex = aTree.getModel().getItemIndex(val); + int itemIndex = aTree.getFullModel().getItemIndex(val); if (itemIndex > 1) { setText(val.toString() + " [" + itemIndex + "]"); } @@ -237,6 +238,7 @@ public class TagTree extends AbstractTagTree { public TagTree(TagTreeModel treeModel, MainPanel mainPanel) { super(treeModel, mainPanel); setCellRenderer(new TagTreeCellRenderer()); + setShowsRootHandles(true); } public static List getSwfFolderItemNestedTagIds(String folderName, boolean gfx) { @@ -344,8 +346,8 @@ public class TagTree extends AbstractTagTree { } @Override - public TagTreeModel getModel() { - return (TagTreeModel) super.getModel(); + public TagTreeModel getFullModel() { + return (TagTreeModel) super.getFullModel(); } - + } diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java index b389f66cc..6740745f8 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java @@ -815,7 +815,7 @@ public class TagTreeContextMenu extends JPopupMenu { boolean allSelectedSameParent = !items.isEmpty(); if (allSelectedSameParent) { - AbstractTagTreeModel model = tree.getModel(); + AbstractTagTreeModel model = tree.getFullModel(); TreePath thisPath = model.getTreePath(items.get(0)); TreePath parent = thisPath == null ? null : thisPath.getParentPath(); @@ -983,7 +983,7 @@ public class TagTreeContextMenu extends JPopupMenu { } } - TreePath thisPath = tree.getModel().getTreePath(firstItem); + TreePath thisPath = tree.getFullModel().getTreePath(firstItem); TreeItem parent = thisPath == null ? null : (TreeItem) thisPath.getParentPath().getLastPathComponent(); boolean parentIsFolder = parent instanceof FolderItem; boolean parentIsTopLevelFrame = false; @@ -1290,7 +1290,7 @@ public class TagTreeContextMenu extends JPopupMenu { } private void addAddTagBeforeAfterMenuItems(boolean before, JMenu addTagMenu, TreeItem item, AddTagActionListener listener) { - TreePath thisPath = getTree().getModel().getTreePath(item); + TreePath thisPath = getTree().getFullModel().getTreePath(item); TreeItem parent = thisPath == null ? null : (TreeItem) thisPath.getParentPath().getLastPathComponent(); if (parent == null) { return; @@ -1689,7 +1689,7 @@ public class TagTreeContextMenu extends JPopupMenu { private void expandRecursiveActionPerformed(ActionEvent evt) { AbstractTagTree tree = getTree(); - TreePath path = tree.getModel().getTreePath(getCurrentItem()); + TreePath path = tree.getFullModel().getTreePath(getCurrentItem()); if (path == null) { return; } @@ -1722,7 +1722,7 @@ public class TagTreeContextMenu extends JPopupMenu { if (sel.get(0) instanceof AS3Package) { AS3Package pkg = (AS3Package) sel.get(0); openable = pkg.getOpenable(); - TreePath tp = tree.getModel().getTreePath(sel.get(0)); + TreePath tp = tree.getFullModel().getTreePath(sel.get(0)); Object[] path = tp.getPath(); for (int p = path.length - 1; p >= 0; p--) { if (path[p] instanceof ClassesListTreeModel) { @@ -1826,7 +1826,7 @@ public class TagTreeContextMenu extends JPopupMenu { Object item; if ((mainPanel.getCurrentView() == MainPanel.VIEW_RESOURCES) && (openable instanceof SWF)) { - item = mainPanel.tagTree.getModel().getScriptsNode((SWF) openable); + item = mainPanel.tagTree.getFullModel().getScriptsNode((SWF) openable); } else if (openable instanceof ABC) { item = openable; } else { //SWF on taglist, should be DoABCContainer @@ -1835,7 +1835,7 @@ public class TagTreeContextMenu extends JPopupMenu { loopparts: for (int i = 0; i < parts.length; i++) { - for (TreeItem ti : tree.getModel().getAllChildren(item)) { + for (TreeItem ti : tree.getFullModel().getAllChildren(item)) { if ((ti instanceof AS3Package) && ((AS3Package) ti).isFlat()) { AS3Package pti = (AS3Package) ti; if ((pkg.isEmpty() && pti.isDefaultPackage()) || (!pti.isDefaultPackage() && pkg.equals(pti.packageName))) { @@ -1911,12 +1911,12 @@ public class TagTreeContextMenu extends JPopupMenu { } } - TreePath selection = mainPanel.tagTree.getModel().getTreePath(sel.get(0)); + TreePath selection = mainPanel.tagTree.getFullModel().getTreePath(sel.get(0)); TreePath swfPath = selection.getParentPath(); tim.resetTimeline(); mainPanel.refreshTree(swf); - FolderItem scriptsNode = (FolderItem) mainPanel.tagTree.getModel().getScriptsNode(swf); + FolderItem scriptsNode = (FolderItem) mainPanel.tagTree.getFullModel().getScriptsNode(swf); TreePath scriptsPath = swfPath.pathByAddingChild(scriptsNode); if (addScriptDialog.getScriptType() == AddScriptDialog.TYPE_FRAME) { @@ -1924,7 +1924,7 @@ public class TagTreeContextMenu extends JPopupMenu { if (subItem instanceof FrameScript) { if (((FrameScript) subItem).getFrame().frame + 1 == targetFrame) { TreePath framePath = scriptsPath.pathByAddingChild(subItem); - TreeItem doActionTag = mainPanel.tagTree.getModel().getChild(subItem, 0); + TreeItem doActionTag = mainPanel.tagTree.getFullModel().getChild(subItem, 0); TreePath doActionPath = framePath.pathByAddingChild(doActionTag); mainPanel.tagTree.setSelectionPath(doActionPath); break; @@ -1942,7 +1942,7 @@ public class TagTreeContextMenu extends JPopupMenu { FrameScript fs = (FrameScript) f; if (fs.getFrame().frame + 1 == targetFrame) { TreePath framePath = spritePath.pathByAddingChild(fs); - TreeItem doActionTag = mainPanel.tagTree.getModel().getChild(fs, 0); + TreeItem doActionTag = mainPanel.tagTree.getFullModel().getChild(fs, 0); TreePath doActionPath = framePath.pathByAddingChild(doActionTag); mainPanel.tagTree.setSelectionPath(doActionPath); break; @@ -1968,7 +1968,7 @@ public class TagTreeContextMenu extends JPopupMenu { button.resetTimeline(); mainPanel.refreshTree(swf); - FolderItem scriptsNode = (FolderItem) mainPanel.tagTree.getModel().getScriptsNode(swf); + FolderItem scriptsNode = (FolderItem) mainPanel.tagTree.getFullModel().getScriptsNode(swf); TreePath selection = mainPanel.tagTree.getSelectionPath(); TreePath swfPath = selection.getParentPath(); TreePath scriptsPath = swfPath.pathByAddingChild(scriptsNode); @@ -2043,7 +2043,7 @@ public class TagTreeContextMenu extends JPopupMenu { tim.resetTimeline(); mainPanel.refreshTree(swf); - FolderItem scriptsNode = (FolderItem) mainPanel.tagTree.getModel().getScriptsNode(swf); + FolderItem scriptsNode = (FolderItem) mainPanel.tagTree.getFullModel().getScriptsNode(swf); TreePath scriptsPath = swfPath.pathByAddingChild(scriptsNode); for (TreeItem subItem : scriptsNode.subItems) { @@ -2058,7 +2058,7 @@ public class TagTreeContextMenu extends JPopupMenu { FrameScript fs = (FrameScript) f; if (fs.getFrame().frame + 1 == frame) { TreePath framePath = spritePaths.pathByAddingChild(f); - List subs = mainPanel.tagTree.getModel().getAllChildren(fs); + List subs = mainPanel.tagTree.getFullModel().getAllChildren(fs); for (TreeItem t : subs) { if (t instanceof TagScript) { if (((TagScript) t).getTag() == placeType) { @@ -2079,7 +2079,7 @@ public class TagTreeContextMenu extends JPopupMenu { FrameScript fs = (FrameScript) subItem; if (fs.getFrame().frame + 1 == frame) { TreePath framePath = scriptsPath.pathByAddingChild(fs); - List subs = mainPanel.tagTree.getModel().getAllChildren(fs); + List subs = mainPanel.tagTree.getFullModel().getAllChildren(fs); for (TreeItem t : subs) { if (t instanceof TagScript) { if (((TagScript) t).getTag() == placeType) { @@ -2169,7 +2169,7 @@ public class TagTreeContextMenu extends JPopupMenu { TreePath selection = mainPanel.tagTree.getSelectionPath(); TreePath swfPath = selection.getParentPath(); - FolderItem scriptsNode = (FolderItem) mainPanel.tagTree.getModel().getScriptsNode(swf); + FolderItem scriptsNode = (FolderItem) mainPanel.tagTree.getFullModel().getScriptsNode(swf); TreePath scriptsPath = swfPath.pathByAddingChild(scriptsNode); String classParts[] = className.contains(".") ? className.split("\\.") : new String[]{className}; @@ -2226,7 +2226,7 @@ public class TagTreeContextMenu extends JPopupMenu { TreePath selection = mainPanel.tagTree.getSelectionPath(); TreePath swfPath = selection.getParentPath(); - FolderItem scriptsNode = (FolderItem) mainPanel.tagTree.getModel().getScriptsNode(swf); + FolderItem scriptsNode = (FolderItem) mainPanel.tagTree.getFullModel().getScriptsNode(swf); TreePath scriptsPath = swfPath.pathByAddingChild(scriptsNode); TreePath doinitPath = scriptsPath.pathByAddingChild(doinit); mainPanel.tagTree.setSelectionPath(doinitPath); @@ -2263,7 +2263,7 @@ public class TagTreeContextMenu extends JPopupMenu { } private void populateScriptSubs(TreePath path, TreeItem item, List out) { - List subs = getTree().getModel().getAllChildren(item); + List subs = getTree().getFullModel().getAllChildren(item); for (TreeItem t : subs) { TreePath tPath = path.pathByAddingChild(t); if ((t instanceof TagScript) && (((TagScript) t).getTag() instanceof ASMSource)) { @@ -2289,7 +2289,7 @@ public class TagTreeContextMenu extends JPopupMenu { List sel = getSelectedItems(); for (TreeItem treeItem : sel) { - tps.add(getTree().getModel().getTreePath(treeItem)); + tps.add(getTree().getFullModel().getTreePath(treeItem)); } List tagsToRemove = new ArrayList<>(); @@ -2548,7 +2548,7 @@ public class TagTreeContextMenu extends JPopupMenu { Tag tag = (Tag) item; tag.undo(); tag.getSwf().clearAllCache(); - tree.getModel().updateNode(item); + tree.getFullModel().updateNode(item); } catch (InterruptedException | IOException ex) { logger.log(Level.SEVERE, null, ex); } @@ -2689,7 +2689,7 @@ public class TagTreeContextMenu extends JPopupMenu { private void moveTagActionPerformed(ActionEvent evt) { Tag t = (Tag) getCurrentItem(); - TreePath path = getTree().getModel().getTreePath(t); + TreePath path = getTree().getFullModel().getTreePath(t); Timelined timelined = null; for (int i = path.getPathCount() - 1 - 1 /*not last path component*/; i >= 0; i--) { if ((path.getPathComponent(i) instanceof DefineSpriteTag) || (path.getPathComponent(i) instanceof SWF)) { @@ -3262,7 +3262,7 @@ public class TagTreeContextMenu extends JPopupMenu { } copyOrMoveTags(itemsToMove, true, timelined, position); - TreePath path = getTree().getModel().getTreePath(item); + TreePath path = getTree().getFullModel().getTreePath(item); getTree().setSelectionPath(path); getTree().scrollPathToVisible(path); mainPanel.repaintTree(); diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeModel.java b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeModel.java index 7d2355945..91cb34362 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeModel.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeModel.java @@ -101,7 +101,7 @@ public class TagTreeModel extends AbstractTagTreeModel { private final boolean addAllFolders; private final Map pathCache = new HashMap<>(); - + private final Map abcClassesTree = new WeakHashMap<>(); public TagTreeModel(List swfs, boolean addAllFolders) { @@ -116,8 +116,8 @@ public class TagTreeModel extends AbstractTagTreeModel { } public void updateSwfs(CollectionChangedEvent e) { - if (e.getAction() != CollectionChangedAction.ADD && - e.getAction() != CollectionChangedAction.MOVE) { + if (e.getAction() != CollectionChangedAction.ADD + && e.getAction() != CollectionChangedAction.MOVE) { List toRemove = new ArrayList<>(); for (SWF swf : swfInfos.keySet()) { SWF swf2 = swf.getRootSwf(); @@ -142,12 +142,6 @@ public class TagTreeModel extends AbstractTagTreeModel { fireTreeNodesRemoved(new TreeModelEvent(this, rootPath, new int[]{e.getOldIndex()}, new Object[]{e.getOldItem()})); break; } - /*case MOVE: { - TreePath rootPath = new TreePath(new Object[]{root}); - fireTreeNodesRemoved(new TreeModelEvent(this, rootPath, new int[]{e.getOldIndex()}, new Object[]{e.getOldItem()})); - fireTreeNodesInserted(new TreeModelEvent(this, rootPath, new int[]{e.getNewIndex()}, new Object[]{e.getNewItem()})); - break; - }*/ default: fireTreeStructureChanged(new TreeModelEvent(this, new TreePath(root))); } @@ -159,7 +153,7 @@ public class TagTreeModel extends AbstractTagTreeModel { swfInfos.clear(); abcClassesTree.clear(); TreePath changedPath = getTreePath(openable == null ? root : openable); - fireTreeStructureChanged(new TreeModelEvent(this, changedPath)); + fireTreeStructureChanged(new TreeModelEvent(this, changedPath)); calculateCollisions(); } @@ -420,22 +414,20 @@ public class TagTreeModel extends AbstractTagTreeModel { return newPath; } } else { - - + TreeItem objNoTs = obj; if (obj instanceof TagScript) { objNoTs = ((TagScript) obj).getTag(); } - + TreeItem nNoTs = n; if (n instanceof TagScript) { nNoTs = ((TagScript) n).getTag(); } - - + if (objNoTs == nNoTs) { return newPath; - } + } } ret = searchTreeItem(obj, n, newPath); @@ -508,8 +500,9 @@ public class TagTreeModel extends AbstractTagTreeModel { for (OpenableList swfList : swfs) { if (!swfList.isBundle()) { result.add(swfList.get(0)); + } else { + result.add(swfList); } - result.add(swfList); } return result; } else if (parentNode instanceof OpenableList) { @@ -776,12 +769,12 @@ public class TagTreeModel extends AbstractTagTreeModel { return -1; } - + private ClassesListTreeModel getClassesListTreeModel(ABC abc) { if (abcClassesTree.containsKey(abc)) { return abcClassesTree.get(abc); } - + ClassesListTreeModel model = new ClassesListTreeModel(abc, Configuration.flattenASPackages.get()); abcClassesTree.put(abc, model); return model;