Added #1765 Quick search tree for everything, not just AS3 classes

This commit is contained in:
Jindra Petřík
2022-12-03 10:43:27 +01:00
parent 3b2939c4ba
commit 296f58f059
13 changed files with 318 additions and 107 deletions

View File

@@ -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

View File

@@ -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<List<String>> 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<TreeItem> 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 + "]";

View File

@@ -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 "";
}

View File

@@ -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<String> pathAsStringList = new ArrayList<>();
for (Object pathCompnent : path.getPath()) {

View File

@@ -1372,7 +1372,7 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener<Scr
if (openable instanceof SWF) {
SWF swf = (SWF) openable;
if (mainPanel.getCurrentView() == MainPanel.VIEW_RESOURCES) {
scriptNode = mainPanel.tagTree.getModel().getScriptsNode(swf);
scriptNode = mainPanel.tagTree.getFullModel().getScriptsNode(swf);
} else {
List<ABC> allAbcs = new ArrayList<>();
for (ABCContainerTag container : swf.getAbcList()) {
@@ -1404,7 +1404,7 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener<Scr
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
@@ -1418,7 +1418,7 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener<Scr
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))) {
@@ -1444,7 +1444,7 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener<Scr
public void hilightScript(ScriptPack pack) {
View.checkAccess();
AbstractTagTreeModel ttm = mainPanel.getCurrentTree().getModel();
AbstractTagTreeModel ttm = mainPanel.getCurrentTree().getFullModel();
TreePath tp = ttm.getTreePath(pack);
if (tp == null) {
mainPanel.closeTagTreeSearch();
@@ -1558,7 +1558,7 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener<Scr
}
public TreeItem getScriptNodeForPack(ScriptPack pack) {
TreePath scriptsPath = mainPanel.getCurrentTree().getModel().getTreePath(pack);
TreePath scriptsPath = mainPanel.getCurrentTree().getFullModel().getTreePath(pack);
while (!(scriptsPath.getLastPathComponent() instanceof ClassesListTreeModel)
&& !(scriptsPath.getLastPathComponent() instanceof ABC)
&& !(scriptsPath.getLastPathComponent() instanceof ABCContainerTag)) {

View File

@@ -1140,7 +1140,7 @@ public class ActionPanel extends JPanel implements SearchListener<ScriptSearchRe
addScriptListener(onScriptComplete);
AbstractTagTreeModel ttm = mainPanel.getCurrentTree().getModel();
AbstractTagTreeModel ttm = mainPanel.getCurrentTree().getFullModel();
TreePath tp = ttm.getTreePath(result.getSrc());
mainPanel.getCurrentTree().setSelectionPath(tp);
mainPanel.getCurrentTree().scrollPathToVisible(tp);

View File

@@ -64,8 +64,8 @@ public class TagListTree extends AbstractTagTree {
}
@Override
public TagListTreeModel getModel() {
return (TagListTreeModel) super.getModel();
public TagListTreeModel getFullModel() {
return (TagListTreeModel) super.getFullModel();
}
@Override
@@ -242,12 +242,12 @@ class TreeTransferHandler extends TransferHandler {
timelined = ((Tag) dest).getTimelined();
position = (Tag) dest;
} else {
int childCount = tree.getModel().getChildCount(dest);
int childCount = tree.getFullModel().getChildCount(dest);
TreeItem child;
if (childIndex >= 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;

View File

@@ -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 + "]");

View File

@@ -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<TreeNodeType, Icon> 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<TreeItem> 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<List<String>> 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<>();
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>.
*/
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<TreeItem, List<TreeItem>> subItems = new WeakHashMap<>();
private final List<TreeModelListener> 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<? extends TreeItem> items = fullModel.getAllChildren(item);
List<TreeItem> 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);
}
}
}

View File

@@ -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<Integer> 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();
}
}

View File

@@ -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<? extends TreeItem> subs = mainPanel.tagTree.getModel().getAllChildren(fs);
List<? extends TreeItem> 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<? extends TreeItem> subs = mainPanel.tagTree.getModel().getAllChildren(fs);
List<? extends TreeItem> 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<TreePath> out) {
List<? extends TreeItem> subs = getTree().getModel().getAllChildren(item);
List<? extends TreeItem> 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<TreeItem> sel = getSelectedItems();
for (TreeItem treeItem : sel) {
tps.add(getTree().getModel().getTreePath(treeItem));
tps.add(getTree().getFullModel().getTreePath(treeItem));
}
List<Tag> 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();

View File

@@ -101,7 +101,7 @@ public class TagTreeModel extends AbstractTagTreeModel {
private final boolean addAllFolders;
private final Map<TreeItem, TreePath> pathCache = new HashMap<>();
private final Map<ABC, ClassesListTreeModel> abcClassesTree = new WeakHashMap<>();
public TagTreeModel(List<OpenableList> 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<SWF> 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;