From f90c8f5bfe24c7d77876fb0d3e50c22e91f6c00f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 30 Sep 2023 20:32:46 +0200 Subject: [PATCH] Hilighting compound scripts, Search results exception fix --- .../flash/gui/SearchResultsStorage.java | 2 +- .../flash/gui/abc/ABCExplorerDialog.java | 4 ++ .../decompiler/flash/gui/abc/ABCPanel.java | 54 +++++++++++++------ .../flash/gui/tagtree/TagTreeModel.java | 11 ++++ 4 files changed, 54 insertions(+), 17 deletions(-) diff --git a/src/com/jpexs/decompiler/flash/gui/SearchResultsStorage.java b/src/com/jpexs/decompiler/flash/gui/SearchResultsStorage.java index 0784e140c..64687a4fc 100644 --- a/src/com/jpexs/decompiler/flash/gui/SearchResultsStorage.java +++ b/src/com/jpexs/decompiler/flash/gui/SearchResultsStorage.java @@ -342,7 +342,7 @@ public class SearchResultsStorage { public void destroySwf(SWF swf) { String swfId = getOpenableId(swf); for (int i = 0; i < openableIds.size(); i++) { - if (openableIds.get(i).equals(swfId)) { + if (openableIds.get(i).equals(swfId) && unpackedData.size() > i) { unpackedData.set(i, null); } } diff --git a/src/com/jpexs/decompiler/flash/gui/abc/ABCExplorerDialog.java b/src/com/jpexs/decompiler/flash/gui/abc/ABCExplorerDialog.java index 0d55a9f89..6622db827 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/ABCExplorerDialog.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/ABCExplorerDialog.java @@ -693,6 +693,10 @@ public class ABCExplorerDialog extends AppDialog { if (scriptIndex != -1) { DottedChain scriptNameDc = abc.script_info.get(scriptIndex).getSimplePackName(abc); + if (scriptNameDc == null && (sv.getParentValue() instanceof ScriptInfo)) { + scriptNameDc = abc.script_info.get(scriptIndex).traits.traits.get(traitIndex).getName(abc).getNameWithNamespace(abc.constants, false); + } + String scriptName = (scriptNameDc == null ? "script_" + scriptIndex : scriptNameDc.toPrintableString(true)); mainPanel.gotoScriptTrait(abc.getSwf(), scriptName, classIndex, globalTraitIndex); } diff --git a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java index 4bce246fa..37f6ca7b0 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java @@ -1448,27 +1448,49 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListener rootNodes = new ArrayList<>(); + rootNodes.add(item); + List firstLevelNodes = tree.getFullModel().getAllChildren(item); + for (TreeItem ti :firstLevelNodes) { + if ((ti instanceof AS3Package)&&(((AS3Package)ti).isCompoundScript())) { + rootNodes.add(ti); + } + } + + looproot:for (Object root : rootNodes) { + item = root; + loopparts: + for (int i = 0; i < parts.length; i++) { + boolean found = false; + 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))) { + item = pti; + i = parts.length - 1 - 1; + found = true; + break; + } + continue; + } + if ((ti instanceof AS3Package)&&(((AS3Package)ti).isCompoundScript())) { + continue; } - continue; - } - if (ti instanceof AS3ClassTreeItem) { - AS3ClassTreeItem cti = (AS3ClassTreeItem) ti; + if (ti instanceof AS3ClassTreeItem) { + AS3ClassTreeItem cti = (AS3ClassTreeItem) ti; - if (parts[i].equals(cti.getPrintableNameWithNamespaceSuffix())) { - item = ti; - break; + if (parts[i].equals(cti.getPrintableNameWithNamespaceSuffix())) { + item = ti; + found = true; + break; + } } } + if (!found) { + continue looproot; + } } + break; //found } mainPanel.setTagTreeSelectedNode(mainPanel.getCurrentTree(), (TreeItem) item); mainPanel.reload(true); diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeModel.java b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeModel.java index 8348b454f..b6a4e4adf 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeModel.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeModel.java @@ -53,6 +53,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.WeakHashMap; import javax.swing.event.TreeModelEvent; import javax.swing.event.TreeModelListener; @@ -399,6 +400,16 @@ public class TagTreeModel extends AbstractTagTreeModel { newPath.addAll(path); newPath.add(n); + if (n instanceof AS3Package) { + AS3Package pkg = (AS3Package)n; + if (obj instanceof AS3Package) { + AS3Package opkg = (AS3Package)obj; + if (Objects.equals(pkg.packageName, opkg.packageName) && pkg.getAbc() == opkg.getAbc()) { + return newPath; + } + } + } + if (n instanceof AS3ClassTreeItem) { AS3ClassTreeItem te = (AS3ClassTreeItem) n; if (obj == te) {