From 95746fd3d7eaca1951f1c1d901bd1a408612f651 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 1 Jun 2014 17:57:34 +0200 Subject: [PATCH] Issue #302 Find declaration (Ctrl+click, Ctrl+B), Find usages (Ctrl+U) --- src/com/jpexs/decompiler/flash/abc/ABC.java | 54 +++--- .../abc/usages/ClassNameMultinameUsage.java | 8 +- .../abc/usages/ConstVarMultinameUsage.java | 22 ++- .../usages/ConstVarNameMultinameUsage.java | 10 +- .../usages/ConstVarTypeMultinameUsage.java | 8 +- .../flash/abc/usages/DefinitionUsage.java | 26 +++ .../abc/usages/ExtendsMultinameUsage.java | 8 +- .../abc/usages/ImplementsMultinameUsage.java | 8 +- .../abc/usages/InsideClassMultinameUsage.java | 5 +- .../abc/usages/MethodBodyMultinameUsage.java | 8 +- .../abc/usages/MethodMultinameUsage.java | 8 +- .../abc/usages/MethodNameMultinameUsage.java | 10 +- .../usages/MethodParamsMultinameUsage.java | 8 +- .../MethodReturnTypeMultinameUsage.java | 8 +- .../flash/abc/usages/MultinameUsage.java | 8 +- .../flash/abc/usages/TraitMultinameUsage.java | 7 +- .../abc/usages/TypeNameMultinameUsage.java | 5 +- src/com/jpexs/decompiler/flash/gui/View.java | 22 +++ .../decompiler/flash/gui/abc/ABCPanel.java | 167 +++++++++++++++--- .../flash/gui/abc/DecompiledEditorPane.java | 19 +- .../decompiler/flash/gui/abc/UsageFrame.java | 95 ++++++---- .../flash/gui/abc/UsageListModel.java | 22 +-- .../flash/gui/locales/MainFrame.properties | 3 + .../flash/gui/locales/MainFrame_cs.properties | 5 +- .../gui/locales/abc/UsageFrame.properties | 1 + .../gui/locales/abc/UsageFrame_cs.properties | 1 + 26 files changed, 389 insertions(+), 157 deletions(-) create mode 100644 src/com/jpexs/decompiler/flash/abc/usages/DefinitionUsage.java diff --git a/src/com/jpexs/decompiler/flash/abc/ABC.java b/src/com/jpexs/decompiler/flash/abc/ABC.java index ec0faf7fb..a6f0a00f4 100644 --- a/src/com/jpexs/decompiler/flash/abc/ABC.java +++ b/src/com/jpexs/decompiler/flash/abc/ABC.java @@ -44,6 +44,7 @@ import com.jpexs.decompiler.flash.abc.types.traits.Traits; import com.jpexs.decompiler.flash.abc.usages.ClassNameMultinameUsage; import com.jpexs.decompiler.flash.abc.usages.ConstVarNameMultinameUsage; import com.jpexs.decompiler.flash.abc.usages.ConstVarTypeMultinameUsage; +import com.jpexs.decompiler.flash.abc.usages.DefinitionUsage; import com.jpexs.decompiler.flash.abc.usages.ExtendsMultinameUsage; import com.jpexs.decompiler.flash.abc.usages.ImplementsMultinameUsage; import com.jpexs.decompiler.flash.abc.usages.MethodBodyMultinameUsage; @@ -802,22 +803,22 @@ public class ABC { } } - private void checkMultinameUsedInMethod(int multinameIndex, int methodInfo, List ret, int classIndex, int traitIndex, boolean isStatic, boolean isInitializer, Traits traits, int parentTraitIndex) { + private void checkMultinameUsedInMethod(List abcTags,int multinameIndex, int methodInfo, List ret, int classIndex, int traitIndex, boolean isStatic, boolean isInitializer, Traits traits, int parentTraitIndex) { for (int p = 0; p < method_info.get(methodInfo).param_types.length; p++) { if (method_info.get(methodInfo).param_types[p] == multinameIndex) { - ret.add(new MethodParamsMultinameUsage(multinameIndex, classIndex, traitIndex, isStatic, isInitializer, traits, parentTraitIndex)); + ret.add(new MethodParamsMultinameUsage(abcTags,this,multinameIndex, classIndex, traitIndex, isStatic, isInitializer, traits, parentTraitIndex)); break; } } if (method_info.get(methodInfo).ret_type == multinameIndex) { - ret.add(new MethodReturnTypeMultinameUsage(multinameIndex, classIndex, traitIndex, isStatic, isInitializer, traits, parentTraitIndex)); + ret.add(new MethodReturnTypeMultinameUsage(abcTags,this,multinameIndex, classIndex, traitIndex, isStatic, isInitializer, traits, parentTraitIndex)); } MethodBody body = findBody(methodInfo); if (body != null) { - findMultinameUsageInTraits(body.traits, multinameIndex, isStatic, classIndex, ret, traitIndex); + findMultinameUsageInTraits(abcTags,body.traits, multinameIndex, isStatic, classIndex, ret, traitIndex); for (ABCException e : body.exceptions) { if ((e.name_index == multinameIndex) || (e.type_index == multinameIndex)) { - ret.add(new MethodBodyMultinameUsage(multinameIndex, classIndex, traitIndex, isStatic, isInitializer, traits, parentTraitIndex)); + ret.add(new MethodBodyMultinameUsage(abcTags,this,multinameIndex, classIndex, traitIndex, isStatic, isInitializer, traits, parentTraitIndex)); return; } } @@ -825,7 +826,7 @@ public class ABC { for (int o = 0; o < ins.definition.operands.length; o++) { if (ins.definition.operands[o] == AVM2Code.DAT_MULTINAME_INDEX) { if (ins.operands[o] == multinameIndex) { - ret.add(new MethodBodyMultinameUsage(multinameIndex, classIndex, traitIndex, isStatic, isInitializer, traits, parentTraitIndex)); + ret.add(new MethodBodyMultinameUsage(abcTags,this,multinameIndex, classIndex, traitIndex, isStatic, isInitializer, traits, parentTraitIndex)); return; } } @@ -834,59 +835,70 @@ public class ABC { } } - private void findMultinameUsageInTraits(Traits traits, int multinameIndex, boolean isStatic, int classIndex, List ret, int parentTraitIndex) { + private void findMultinameUsageInTraits(List abcTags,Traits traits, int multinameIndex, boolean isStatic, int classIndex, List ret, int parentTraitIndex) { for (int t = 0; t < traits.traits.size(); t++) { if (traits.traits.get(t) instanceof TraitSlotConst) { TraitSlotConst tsc = (TraitSlotConst) traits.traits.get(t); if (tsc.name_index == multinameIndex) { - ret.add(new ConstVarNameMultinameUsage(multinameIndex, classIndex, t, isStatic, traits, parentTraitIndex)); + ret.add(new ConstVarNameMultinameUsage(abcTags,this,multinameIndex, classIndex, t, isStatic, traits, parentTraitIndex)); } if (tsc.type_index == multinameIndex) { - ret.add(new ConstVarTypeMultinameUsage(multinameIndex, classIndex, t, isStatic, traits, parentTraitIndex)); + ret.add(new ConstVarTypeMultinameUsage(abcTags,this,multinameIndex, classIndex, t, isStatic, traits, parentTraitIndex)); } } if (traits.traits.get(t) instanceof TraitMethodGetterSetter) { TraitMethodGetterSetter tmgs = (TraitMethodGetterSetter) traits.traits.get(t); if (tmgs.name_index == multinameIndex) { - ret.add(new MethodNameMultinameUsage(multinameIndex, classIndex, t, isStatic, false, traits, parentTraitIndex)); + ret.add(new MethodNameMultinameUsage(abcTags,this,multinameIndex, classIndex, t, isStatic, false, traits, parentTraitIndex)); } - checkMultinameUsedInMethod(multinameIndex, tmgs.method_info, ret, classIndex, t, isStatic, false, traits, parentTraitIndex); + checkMultinameUsedInMethod(abcTags,multinameIndex, tmgs.method_info, ret, classIndex, t, isStatic, false, traits, parentTraitIndex); } } } - public List findMultinameUsage(int multinameIndex) { + public List findMultinameDefinition(List abcTags,int multinameIndex){ + List usages = findMultinameUsage(abcTags,multinameIndex); + List ret = new ArrayList<>(); + for(MultinameUsage u:usages){ + if(u instanceof DefinitionUsage){ + ret.add(u); + } + } + return ret; + } + + public List findMultinameUsage(List abcTags,int multinameIndex) { List ret = new ArrayList<>(); if (multinameIndex == 0) { return ret; } for (int c = 0; c < instance_info.size(); c++) { if (instance_info.get(c).name_index == multinameIndex) { - ret.add(new ClassNameMultinameUsage(multinameIndex, c)); + ret.add(new ClassNameMultinameUsage(abcTags,this,multinameIndex, c)); } if (instance_info.get(c).super_index == multinameIndex) { - ret.add(new ExtendsMultinameUsage(multinameIndex, c)); + ret.add(new ExtendsMultinameUsage(abcTags,this,multinameIndex, c)); } for (int i = 0; i < instance_info.get(c).interfaces.length; i++) { if (instance_info.get(c).interfaces[i] == multinameIndex) { - ret.add(new ImplementsMultinameUsage(multinameIndex, c)); + ret.add(new ImplementsMultinameUsage(abcTags,this,multinameIndex, c)); } } - checkMultinameUsedInMethod(multinameIndex, instance_info.get(c).iinit_index, ret, c, 0, false, true, null, -1); - checkMultinameUsedInMethod(multinameIndex, class_info.get(c).cinit_index, ret, c, 0, true, true, null, -1); - findMultinameUsageInTraits(instance_info.get(c).instance_traits, multinameIndex, false, c, ret, -1); - findMultinameUsageInTraits(class_info.get(c).static_traits, multinameIndex, true, c, ret, -1); + checkMultinameUsedInMethod(abcTags,multinameIndex, instance_info.get(c).iinit_index, ret, c, 0, false, true, null, -1); + checkMultinameUsedInMethod(abcTags,multinameIndex, class_info.get(c).cinit_index, ret, c, 0, true, true, null, -1); + findMultinameUsageInTraits(abcTags,instance_info.get(c).instance_traits, multinameIndex, false, c, ret, -1); + findMultinameUsageInTraits(abcTags,class_info.get(c).static_traits, multinameIndex, true, c, ret, -1); } loopm: for (int m = 1; m < constants.getMultinameCount(); m++) { if (constants.getMultiname(m).kind == Multiname.TYPENAME) { if (constants.getMultiname(m).qname_index == multinameIndex) { - ret.add(new TypeNameMultinameUsage(m)); + ret.add(new TypeNameMultinameUsage(abcTags,this,m)); continue; } for (int mp : constants.getMultiname(m).params) { if (mp == multinameIndex) { - ret.add(new TypeNameMultinameUsage(m)); + ret.add(new TypeNameMultinameUsage(abcTags,this,m)); continue loopm; } } diff --git a/src/com/jpexs/decompiler/flash/abc/usages/ClassNameMultinameUsage.java b/src/com/jpexs/decompiler/flash/abc/usages/ClassNameMultinameUsage.java index e61948606..7b103abc9 100644 --- a/src/com/jpexs/decompiler/flash/abc/usages/ClassNameMultinameUsage.java +++ b/src/com/jpexs/decompiler/flash/abc/usages/ClassNameMultinameUsage.java @@ -24,14 +24,14 @@ import java.util.List; * * @author JPEXS */ -public class ClassNameMultinameUsage extends InsideClassMultinameUsage { +public class ClassNameMultinameUsage extends InsideClassMultinameUsage implements DefinitionUsage { - public ClassNameMultinameUsage(int multinameIndex, int classIndex) { - super(multinameIndex, classIndex); + public ClassNameMultinameUsage(List abcTags, ABC abc, int multinameIndex, int classIndex) { + super(abcTags,abc,multinameIndex, classIndex); } @Override - public String toString(List abcTags, ABC abc) { + public String toString() { return "class " + abc.constants.getMultiname(abc.instance_info.get(classIndex).name_index).getNameWithNamespace(abc.constants); } } diff --git a/src/com/jpexs/decompiler/flash/abc/usages/ConstVarMultinameUsage.java b/src/com/jpexs/decompiler/flash/abc/usages/ConstVarMultinameUsage.java index bcc898efa..93920670c 100644 --- a/src/com/jpexs/decompiler/flash/abc/usages/ConstVarMultinameUsage.java +++ b/src/com/jpexs/decompiler/flash/abc/usages/ConstVarMultinameUsage.java @@ -27,6 +27,8 @@ import com.jpexs.decompiler.flash.helpers.NulWriter; import com.jpexs.decompiler.flash.tags.ABCContainerTag; import java.util.ArrayList; import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; /** * @@ -34,12 +36,12 @@ import java.util.List; */ public abstract class ConstVarMultinameUsage extends TraitMultinameUsage { - public ConstVarMultinameUsage(int multinameIndex, int classIndex, int traitIndex, boolean isStatic, Traits traits, int parentTraitIndex) { - super(multinameIndex, classIndex, traitIndex, isStatic, traits, parentTraitIndex); + public ConstVarMultinameUsage(List abcTags, ABC abc, int multinameIndex, int classIndex, int traitIndex, boolean isStatic, Traits traits, int parentTraitIndex) { + super(abcTags,abc,multinameIndex, classIndex, traitIndex, isStatic, traits, parentTraitIndex); } @Override - public String toString(List abcTags, ABC abc) throws InterruptedException { + public String toString() { NulWriter nulWriter = new NulWriter(); if (parentTraitIndex > -1) { if (isStatic) { @@ -48,10 +50,14 @@ public abstract class ConstVarMultinameUsage extends TraitMultinameUsage { ((TraitMethodGetterSetter) abc.instance_info.get(classIndex).instance_traits.traits.get(parentTraitIndex)).convertHeader(null, "", abcTags, abc, isStatic, ScriptExportMode.AS, -1/*FIXME*/, classIndex, nulWriter, new ArrayList(), false); } } - ((TraitSlotConst) traits.traits.get(traitIndex)).convertHeader(null, "", abcTags, abc, isStatic, ScriptExportMode.AS, -1/*FIXME*/, classIndex, nulWriter, new ArrayList(), false); + try { + ((TraitSlotConst) traits.traits.get(traitIndex)).convertHeader(null, "", abcTags, abc, isStatic, ScriptExportMode.AS, -1/*FIXME*/, classIndex, nulWriter, new ArrayList(), false); + } catch (InterruptedException ex) { + //ignore + } HilightedTextWriter writer = new HilightedTextWriter(Configuration.getCodeFormatting(), false); - writer.appendNoHilight(super.toString(abcTags, abc) + " "); + writer.appendNoHilight(super.toString() + " "); if (parentTraitIndex > -1) { if (isStatic) { ((TraitMethodGetterSetter) abc.class_info.get(classIndex).static_traits.traits.get(parentTraitIndex)).toStringHeader(null, "", abcTags, abc, isStatic, ScriptExportMode.AS, -1/*FIXME*/, classIndex, writer, new ArrayList(), false); @@ -59,7 +65,11 @@ public abstract class ConstVarMultinameUsage extends TraitMultinameUsage { ((TraitMethodGetterSetter) abc.instance_info.get(classIndex).instance_traits.traits.get(parentTraitIndex)).toStringHeader(null, "", abcTags, abc, isStatic, ScriptExportMode.AS, -1/*FIXME*/, classIndex, writer, new ArrayList(), false); } } - ((TraitSlotConst) traits.traits.get(traitIndex)).toStringHeader(null, "", abcTags, abc, isStatic, ScriptExportMode.AS, -1/*FIXME*/, classIndex, writer, new ArrayList(), false); + try { + ((TraitSlotConst) traits.traits.get(traitIndex)).toStringHeader(null, "", abcTags, abc, isStatic, ScriptExportMode.AS, -1/*FIXME*/, classIndex, writer, new ArrayList(), false); + } catch (InterruptedException ex) { + //ignore + } return writer.toString(); } diff --git a/src/com/jpexs/decompiler/flash/abc/usages/ConstVarNameMultinameUsage.java b/src/com/jpexs/decompiler/flash/abc/usages/ConstVarNameMultinameUsage.java index f6e228fa2..42dbd7eac 100644 --- a/src/com/jpexs/decompiler/flash/abc/usages/ConstVarNameMultinameUsage.java +++ b/src/com/jpexs/decompiler/flash/abc/usages/ConstVarNameMultinameUsage.java @@ -25,14 +25,14 @@ import java.util.List; * * @author JPEXS */ -public class ConstVarNameMultinameUsage extends ConstVarMultinameUsage { +public class ConstVarNameMultinameUsage extends ConstVarMultinameUsage implements DefinitionUsage { - public ConstVarNameMultinameUsage(int multinameIndex, int classIndex, int traitIndex, boolean isStatic, Traits traits, int parentTraitIndex) { - super(multinameIndex, classIndex, traitIndex, isStatic, traits, parentTraitIndex); + public ConstVarNameMultinameUsage(List abcTags, ABC abc, int multinameIndex, int classIndex, int traitIndex, boolean isStatic, Traits traits, int parentTraitIndex) { + super(abcTags,abc,multinameIndex, classIndex, traitIndex, isStatic, traits, parentTraitIndex); } @Override - public String toString(List abcTags, ABC abc) throws InterruptedException { - return super.toString(abcTags, abc) + " name"; + public String toString() { + return super.toString() + " name"; } } diff --git a/src/com/jpexs/decompiler/flash/abc/usages/ConstVarTypeMultinameUsage.java b/src/com/jpexs/decompiler/flash/abc/usages/ConstVarTypeMultinameUsage.java index 9b390906b..6107f1db0 100644 --- a/src/com/jpexs/decompiler/flash/abc/usages/ConstVarTypeMultinameUsage.java +++ b/src/com/jpexs/decompiler/flash/abc/usages/ConstVarTypeMultinameUsage.java @@ -27,12 +27,12 @@ import java.util.List; */ public class ConstVarTypeMultinameUsage extends ConstVarMultinameUsage { - public ConstVarTypeMultinameUsage(int multinameIndex, int classIndex, int traitIndex, boolean isStatic, Traits traits, int parentTraitIndex) { - super(multinameIndex, classIndex, traitIndex, isStatic, traits, parentTraitIndex); + public ConstVarTypeMultinameUsage(List abcTags, ABC abc, int multinameIndex, int classIndex, int traitIndex, boolean isStatic, Traits traits, int parentTraitIndex) { + super(abcTags,abc,multinameIndex, classIndex, traitIndex, isStatic, traits, parentTraitIndex); } @Override - public String toString(List abcTags, ABC abc) throws InterruptedException { - return super.toString(abcTags, abc) + " type"; + public String toString() { + return super.toString() + " type"; } } diff --git a/src/com/jpexs/decompiler/flash/abc/usages/DefinitionUsage.java b/src/com/jpexs/decompiler/flash/abc/usages/DefinitionUsage.java new file mode 100644 index 000000000..fdb82eca2 --- /dev/null +++ b/src/com/jpexs/decompiler/flash/abc/usages/DefinitionUsage.java @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2014 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.abc.usages; + +/** + * + * @author JPEXS + */ +public interface DefinitionUsage { + +} diff --git a/src/com/jpexs/decompiler/flash/abc/usages/ExtendsMultinameUsage.java b/src/com/jpexs/decompiler/flash/abc/usages/ExtendsMultinameUsage.java index 03b4aea92..68ad092f4 100644 --- a/src/com/jpexs/decompiler/flash/abc/usages/ExtendsMultinameUsage.java +++ b/src/com/jpexs/decompiler/flash/abc/usages/ExtendsMultinameUsage.java @@ -26,12 +26,12 @@ import java.util.List; */ public class ExtendsMultinameUsage extends InsideClassMultinameUsage { - public ExtendsMultinameUsage(int multinameIndex, int classIndex) { - super(multinameIndex, classIndex); + public ExtendsMultinameUsage(List abcTags, ABC abc, int multinameIndex, int classIndex) { + super(abcTags,abc,multinameIndex, classIndex); } @Override - public String toString(List abcTags, ABC abc) throws InterruptedException { - return super.toString(abcTags, abc) + " extends"; + public String toString() { + return super.toString() + " extends"; } } diff --git a/src/com/jpexs/decompiler/flash/abc/usages/ImplementsMultinameUsage.java b/src/com/jpexs/decompiler/flash/abc/usages/ImplementsMultinameUsage.java index 05eb3b355..0b5104e00 100644 --- a/src/com/jpexs/decompiler/flash/abc/usages/ImplementsMultinameUsage.java +++ b/src/com/jpexs/decompiler/flash/abc/usages/ImplementsMultinameUsage.java @@ -26,12 +26,12 @@ import java.util.List; */ public class ImplementsMultinameUsage extends InsideClassMultinameUsage { - public ImplementsMultinameUsage(int multinameIndex, int classIndex) { - super(multinameIndex, classIndex); + public ImplementsMultinameUsage(List abcTags, ABC abc, int multinameIndex, int classIndex) { + super(abcTags,abc,multinameIndex, classIndex); } @Override - public String toString(List abcTags, ABC abc) throws InterruptedException { - return super.toString(abcTags, abc) + " implements"; + public String toString() { + return super.toString() + " implements"; } } diff --git a/src/com/jpexs/decompiler/flash/abc/usages/InsideClassMultinameUsage.java b/src/com/jpexs/decompiler/flash/abc/usages/InsideClassMultinameUsage.java index e69069b16..f6673d135 100644 --- a/src/com/jpexs/decompiler/flash/abc/usages/InsideClassMultinameUsage.java +++ b/src/com/jpexs/decompiler/flash/abc/usages/InsideClassMultinameUsage.java @@ -29,13 +29,14 @@ public abstract class InsideClassMultinameUsage extends MultinameUsage { public int multinameIndex; public int classIndex; - public InsideClassMultinameUsage(int multinameIndex, int classIndex) { + public InsideClassMultinameUsage(List abcTags, ABC abc,int multinameIndex, int classIndex) { + super(abcTags, abc); this.multinameIndex = multinameIndex; this.classIndex = classIndex; } @Override - public String toString(List abcTags, ABC abc) throws InterruptedException { + public String toString(){ return "class " + abc.constants.getMultiname(abc.instance_info.get(classIndex).name_index).getNameWithNamespace(abc.constants); } diff --git a/src/com/jpexs/decompiler/flash/abc/usages/MethodBodyMultinameUsage.java b/src/com/jpexs/decompiler/flash/abc/usages/MethodBodyMultinameUsage.java index a7fe00630..b168b3206 100644 --- a/src/com/jpexs/decompiler/flash/abc/usages/MethodBodyMultinameUsage.java +++ b/src/com/jpexs/decompiler/flash/abc/usages/MethodBodyMultinameUsage.java @@ -27,12 +27,12 @@ import java.util.List; */ public class MethodBodyMultinameUsage extends MethodMultinameUsage { - public MethodBodyMultinameUsage(int multinameIndex, int classIndex, int traitIndex, boolean isStatic, boolean isInitializer, Traits traits, int parentTraitIndex) { - super(multinameIndex, classIndex, traitIndex, isStatic, isInitializer, traits, parentTraitIndex); + public MethodBodyMultinameUsage(List abcTags, ABC abc, int multinameIndex, int classIndex, int traitIndex, boolean isStatic, boolean isInitializer, Traits traits, int parentTraitIndex) { + super(abcTags,abc,multinameIndex, classIndex, traitIndex, isStatic, isInitializer, traits, parentTraitIndex); } @Override - public String toString(List abcTags, ABC abc) throws InterruptedException { - return super.toString(abcTags, abc) + " body"; + public String toString() { + return super.toString() + " body"; } } diff --git a/src/com/jpexs/decompiler/flash/abc/usages/MethodMultinameUsage.java b/src/com/jpexs/decompiler/flash/abc/usages/MethodMultinameUsage.java index 965a5f1ce..7be4e0cf2 100644 --- a/src/com/jpexs/decompiler/flash/abc/usages/MethodMultinameUsage.java +++ b/src/com/jpexs/decompiler/flash/abc/usages/MethodMultinameUsage.java @@ -35,8 +35,8 @@ public abstract class MethodMultinameUsage extends TraitMultinameUsage { public boolean isInitializer; - public MethodMultinameUsage(int multinameIndex, int classIndex, int traitIndex, boolean isStatic, boolean isInitializer, Traits traits, int parentTraitIndex) { - super(multinameIndex, classIndex, traitIndex, isStatic, traits, parentTraitIndex); + public MethodMultinameUsage(List abcTags, ABC abc,int multinameIndex, int classIndex, int traitIndex, boolean isStatic, boolean isInitializer, Traits traits, int parentTraitIndex) { + super(abcTags,abc,multinameIndex, classIndex, traitIndex, isStatic, traits, parentTraitIndex); this.isInitializer = isInitializer; } @@ -45,7 +45,7 @@ public abstract class MethodMultinameUsage extends TraitMultinameUsage { } @Override - public String toString(List abcTags, ABC abc) throws InterruptedException { + public String toString() { NulWriter nulWriter = new NulWriter(); if (!isInitializer) { if (parentTraitIndex > -1) { @@ -59,7 +59,7 @@ public abstract class MethodMultinameUsage extends TraitMultinameUsage { } HilightedTextWriter writer = new HilightedTextWriter(Configuration.getCodeFormatting(), false); - writer.appendNoHilight(super.toString(abcTags, abc)); + writer.appendNoHilight(super.toString()); writer.appendNoHilight(" "); if (isInitializer) { if (isStatic) { diff --git a/src/com/jpexs/decompiler/flash/abc/usages/MethodNameMultinameUsage.java b/src/com/jpexs/decompiler/flash/abc/usages/MethodNameMultinameUsage.java index ac0fd00a7..16d464fc5 100644 --- a/src/com/jpexs/decompiler/flash/abc/usages/MethodNameMultinameUsage.java +++ b/src/com/jpexs/decompiler/flash/abc/usages/MethodNameMultinameUsage.java @@ -25,14 +25,14 @@ import java.util.List; * * @author JPEXS */ -public class MethodNameMultinameUsage extends MethodMultinameUsage { +public class MethodNameMultinameUsage extends MethodMultinameUsage implements DefinitionUsage { - public MethodNameMultinameUsage(int multinameIndex, int classIndex, int traitIndex, boolean isStatic, boolean isInitializer, Traits traits, int parentTraitIndex) { - super(multinameIndex, classIndex, traitIndex, isStatic, isInitializer, traits, parentTraitIndex); + public MethodNameMultinameUsage(List abcTags, ABC abc, int multinameIndex, int classIndex, int traitIndex, boolean isStatic, boolean isInitializer, Traits traits, int parentTraitIndex) { + super(abcTags,abc, multinameIndex, classIndex, traitIndex, isStatic, isInitializer, traits, parentTraitIndex); } @Override - public String toString(List abcTags, ABC abc) throws InterruptedException { - return super.toString(abcTags, abc) + " name"; + public String toString() { + return super.toString() + " name"; } } diff --git a/src/com/jpexs/decompiler/flash/abc/usages/MethodParamsMultinameUsage.java b/src/com/jpexs/decompiler/flash/abc/usages/MethodParamsMultinameUsage.java index 75485023d..900d45c2d 100644 --- a/src/com/jpexs/decompiler/flash/abc/usages/MethodParamsMultinameUsage.java +++ b/src/com/jpexs/decompiler/flash/abc/usages/MethodParamsMultinameUsage.java @@ -27,12 +27,12 @@ import java.util.List; */ public class MethodParamsMultinameUsage extends MethodMultinameUsage { - public MethodParamsMultinameUsage(int multinameIndex, int classIndex, int traitIndex, boolean isStatic, boolean isInitializer, Traits traits, int parentTraitIndex) { - super(multinameIndex, classIndex, traitIndex, isStatic, isInitializer, traits, parentTraitIndex); + public MethodParamsMultinameUsage(List abcTags, ABC abc, int multinameIndex, int classIndex, int traitIndex, boolean isStatic, boolean isInitializer, Traits traits, int parentTraitIndex) { + super(abcTags,abc,multinameIndex, classIndex, traitIndex, isStatic, isInitializer, traits, parentTraitIndex); } @Override - public String toString(List abcTags, ABC abc) throws InterruptedException { - return super.toString(abcTags, abc) + " params"; + public String toString() { + return super.toString() + " params"; } } diff --git a/src/com/jpexs/decompiler/flash/abc/usages/MethodReturnTypeMultinameUsage.java b/src/com/jpexs/decompiler/flash/abc/usages/MethodReturnTypeMultinameUsage.java index 3e4ba7f7d..96ccccead 100644 --- a/src/com/jpexs/decompiler/flash/abc/usages/MethodReturnTypeMultinameUsage.java +++ b/src/com/jpexs/decompiler/flash/abc/usages/MethodReturnTypeMultinameUsage.java @@ -27,12 +27,12 @@ import java.util.List; */ public class MethodReturnTypeMultinameUsage extends MethodMultinameUsage { - public MethodReturnTypeMultinameUsage(int multinameIndex, int classIndex, int traitIndex, boolean isStatic, boolean isInitializer, Traits traits, int parentTraitIndex) { - super(multinameIndex, classIndex, traitIndex, isStatic, isInitializer, traits, parentTraitIndex); + public MethodReturnTypeMultinameUsage(List abcTags, ABC abc, int multinameIndex, int classIndex, int traitIndex, boolean isStatic, boolean isInitializer, Traits traits, int parentTraitIndex) { + super(abcTags,abc,multinameIndex, classIndex, traitIndex, isStatic, isInitializer, traits, parentTraitIndex); } @Override - public String toString(List abcTags, ABC abc) throws InterruptedException { - return super.toString(abcTags, abc) + " return type"; + public String toString() { + return super.toString() + " return type"; } } diff --git a/src/com/jpexs/decompiler/flash/abc/usages/MultinameUsage.java b/src/com/jpexs/decompiler/flash/abc/usages/MultinameUsage.java index 4776a4ed4..3eaa81713 100644 --- a/src/com/jpexs/decompiler/flash/abc/usages/MultinameUsage.java +++ b/src/com/jpexs/decompiler/flash/abc/usages/MultinameUsage.java @@ -25,6 +25,12 @@ import java.util.List; * @author JPEXS */ public abstract class MultinameUsage { + public List abcTags; + public ABC abc; - public abstract String toString(List abcTags, ABC abc) throws InterruptedException; + public MultinameUsage(List abcTags, ABC abc) { + this.abcTags = abcTags; + this.abc = abc; + } + } diff --git a/src/com/jpexs/decompiler/flash/abc/usages/TraitMultinameUsage.java b/src/com/jpexs/decompiler/flash/abc/usages/TraitMultinameUsage.java index f4a52d3e0..89ffc2068 100644 --- a/src/com/jpexs/decompiler/flash/abc/usages/TraitMultinameUsage.java +++ b/src/com/jpexs/decompiler/flash/abc/usages/TraitMultinameUsage.java @@ -16,7 +16,10 @@ */ package com.jpexs.decompiler.flash.abc.usages; +import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.types.traits.Traits; +import com.jpexs.decompiler.flash.tags.ABCContainerTag; +import java.util.List; /** * @@ -29,8 +32,8 @@ public abstract class TraitMultinameUsage extends InsideClassMultinameUsage { public Traits traits; public int parentTraitIndex; - public TraitMultinameUsage(int multinameIndex, int classIndex, int traitIndex, boolean isStatic, Traits traits, int parentTraitIndex) { - super(multinameIndex, classIndex); + public TraitMultinameUsage(List abcTags, ABC abc, int multinameIndex, int classIndex, int traitIndex, boolean isStatic, Traits traits, int parentTraitIndex) { + super(abcTags,abc,multinameIndex, classIndex); this.traitIndex = traitIndex; this.isStatic = isStatic; this.traits = traits; diff --git a/src/com/jpexs/decompiler/flash/abc/usages/TypeNameMultinameUsage.java b/src/com/jpexs/decompiler/flash/abc/usages/TypeNameMultinameUsage.java index bc7b74e3d..138ba7e33 100644 --- a/src/com/jpexs/decompiler/flash/abc/usages/TypeNameMultinameUsage.java +++ b/src/com/jpexs/decompiler/flash/abc/usages/TypeNameMultinameUsage.java @@ -29,12 +29,13 @@ public class TypeNameMultinameUsage extends MultinameUsage { public int typename_index; - public TypeNameMultinameUsage(int typename_index) { + public TypeNameMultinameUsage(List abcTags, ABC abc, int typename_index) { + super(abcTags, abc); this.typename_index = typename_index; } @Override - public String toString(List abcTags, ABC abc) { + public String toString() { return "TypeName " + abc.constants.getMultiname(typename_index).toString(abc.constants, new ArrayList()); } } diff --git a/src/com/jpexs/decompiler/flash/gui/View.java b/src/com/jpexs/decompiler/flash/gui/View.java index f5121f1ae..4e77d55c9 100644 --- a/src/com/jpexs/decompiler/flash/gui/View.java +++ b/src/com/jpexs/decompiler/flash/gui/View.java @@ -43,16 +43,21 @@ import java.util.logging.Logger; import javax.imageio.ImageIO; import javax.swing.AbstractAction; import javax.swing.Action; +import javax.swing.ActionMap; import javax.swing.Icon; import javax.swing.ImageIcon; +import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JDialog; +import javax.swing.JEditorPane; import javax.swing.JFrame; import javax.swing.JLabel; +import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; +import javax.swing.JPopupMenu; import javax.swing.JRootPane; import javax.swing.JTree; import javax.swing.KeyStroke; @@ -62,6 +67,7 @@ import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.plaf.FontUIResource; import javax.swing.plaf.basic.BasicColorChooserUI; +import javax.swing.text.JTextComponent; import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; import org.pushingpixels.flamingo.api.common.icon.ImageWrapperResizableIcon; @@ -498,4 +504,20 @@ public class View { tree.collapsePath(parent); } } + + public static void addEditorAction(JEditorPane editor,AbstractAction a,String key, String name, String keyStroke){ + KeyStroke ks = KeyStroke.getKeyStroke(keyStroke); + a.putValue(Action.ACCELERATOR_KEY, ks); + a.putValue(Action.NAME, name); + + String actionName = key; + ActionMap amap = editor.getActionMap(); + InputMap imap = editor.getInputMap(JTextComponent.WHEN_FOCUSED); + imap.put(ks, actionName); + amap.put(actionName, a); + + JPopupMenu pmenu = editor.getComponentPopupMenu(); + JMenuItem findUsagesMenu = new JMenuItem(a); + pmenu.add(findUsagesMenu); + } } diff --git a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java index 06d1966a1..f411f1460 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java @@ -38,6 +38,7 @@ import com.jpexs.decompiler.flash.abc.types.traits.Trait; import com.jpexs.decompiler.flash.abc.types.traits.TraitMethodGetterSetter; import com.jpexs.decompiler.flash.abc.types.traits.TraitSlotConst; import com.jpexs.decompiler.flash.abc.types.traits.Traits; +import com.jpexs.decompiler.flash.abc.usages.MultinameUsage; import com.jpexs.decompiler.flash.configuration.Configuration; import com.jpexs.decompiler.flash.gui.HeaderLabel; import com.jpexs.decompiler.flash.gui.Main; @@ -67,6 +68,7 @@ import com.jpexs.helpers.CancellableWorker; import com.jpexs.helpers.Helper; import java.awt.BorderLayout; import java.awt.Component; +import java.awt.Cursor; import java.awt.FlowLayout; import java.awt.Font; import java.awt.Insets; @@ -74,8 +76,12 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; @@ -87,17 +93,25 @@ import java.util.concurrent.ExecutionException; import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Pattern; +import javax.swing.AbstractAction; +import javax.swing.Action; +import javax.swing.ActionMap; import javax.swing.BoxLayout; +import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JComboBox; +import javax.swing.JEditorPane; import javax.swing.JLabel; +import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; +import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTabbedPane; import javax.swing.JTable; import javax.swing.JToggleButton; +import javax.swing.KeyStroke; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; import javax.swing.border.BevelBorder; @@ -107,10 +121,13 @@ import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import javax.swing.table.TableModel; +import javax.swing.text.DefaultEditorKit; +import javax.swing.text.JTextComponent; import javax.swing.tree.TreePath; import jsyntaxpane.DefaultSyntaxKit; import jsyntaxpane.actions.DocumentSearchData; import jsyntaxpane.actions.QuickFindAction; +import jsyntaxpane.actions.SyntaxAction; public class ABCPanel extends JPanel implements ItemListener, ActionListener, SearchListener, Freed { @@ -449,7 +466,32 @@ public class ABCPanel extends JPanel implements ItemListener, ActionListener, Se }); decompiledTextArea.setContentType("text/actionscript"); decompiledTextArea.setFont(new Font("Monospaced", Font.PLAIN, decompiledTextArea.getFont().getSize())); - + + + + View.addEditorAction(decompiledTextArea, new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + int multinameIndex = decompiledTextArea.getMultinameUnderCursor(); + if(multinameIndex>-1){ + UsageFrame usageFrame = new UsageFrame(swf.abcList, abc, multinameIndex, ABCPanel.this,false); + usageFrame.setVisible(true); + } + } + }, "find-usages", AppStrings.translate("abc.action.find-usages"), "control U"); + + View.addEditorAction(decompiledTextArea, new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + gotoDeclaration(); + } + }, "find-declaration", AppStrings.translate("abc.action.find-declaration"), "control B"); + + CtrlClickHandler cch = new CtrlClickHandler(); + decompiledTextArea.addKeyListener(cch); + decompiledTextArea.addMouseListener(cch); + decompiledTextArea.addMouseMotionListener(cch); + JPanel pan2 = new JPanel(); pan2.setLayout(new BorderLayout()); pan2.add((abcComboBox = new JComboBox<>(new ABCComboBoxModel(new ArrayList()))), BorderLayout.NORTH); @@ -473,32 +515,10 @@ public class ABCPanel extends JPanel implements ItemListener, ActionListener, Se }); Main.startWork(AppStrings.translate("work.buildingscripttree") + "..."); - - /* splitPaneTreeVSNavigator = new JSplitPane(JSplitPane.VERTICAL_SPLIT, - treePanel, - navPanel); - splitPaneTreeVSNavigator.setResizeWeight(0.5); - splitPaneTreeVSNavigator.setContinuousLayout(true);*/ + tabbedPane = new JTabbedPane(); tabbedPane.addTab(AppStrings.translate("traits"), navPanel); - //tabbedPane.setTabPlacement(JTabbedPane.BOTTOM); - - //pan2.add(tabbedPane, BorderLayout.CENTER); abcComboBox.addItemListener(this); - /* - - splitPaneTreeNavVSDecompiledDetail = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, - pan2, - splitPaneDecompiledVSDetail); - splitPaneTreeNavVSDecompiledDetail.setResizeWeight(0); - splitPaneTreeNavVSDecompiledDetail.setContinuousLayout(true); - //pan2.setPreferredSize(new Dimension(300, 200)); - - - - - - add(splitPaneTreeNavVSDecompiledDetail, BorderLayout.CENTER);*/ add(splitPane, BorderLayout.CENTER); JPanel panConstants = new JPanel(); @@ -523,7 +543,7 @@ public class ABCPanel extends JPanel implements ItemListener, ActionListener, Se } int multinameIndex = constantTable.convertRowIndexToModel(rowIndex); if (multinameIndex > 0) { - UsageFrame usageFrame = new UsageFrame(t.swf.abcList, abc, multinameIndex, t); + UsageFrame usageFrame = new UsageFrame(t.swf.abcList, abc, multinameIndex, t, false); usageFrame.setVisible(true); } } @@ -535,6 +555,99 @@ public class ABCPanel extends JPanel implements ItemListener, ActionListener, Se panConstants.add(new JScrollPane(constantTable), BorderLayout.CENTER); tabbedPane.addTab(AppStrings.translate("constants"), panConstants); } + + private void gotoDeclaration(){ + int multinameIndex = decompiledTextArea.getMultinameUnderCursor(); + if(multinameIndex>-1){ + List usages = abc.findMultinameDefinition(swf.abcList,multinameIndex); + + Multiname m = abc.constants.constant_multiname.get(multinameIndex); + //search other ABC tags if this is not private multiname + if(m.namespace_index>0 && abc.constants.constant_namespace.get(m.namespace_index).kind != Namespace.KIND_PRIVATE) + { + for(ABCContainerTag at:swf.abcList){ + ABC a = at.getABC(); + if(a == abc){ + continue; + } + int mid=a.constants.getMultinameId(m,false); + if(mid>0){ + usages.addAll(a.findMultinameDefinition(swf.abcList, mid)); + } + } + } + + //more than one? display list + if(usages.size()>1){ + UsageFrame usageFrame = new UsageFrame(swf.abcList, abc, multinameIndex, ABCPanel.this,true); + usageFrame.setVisible(true); + }else if(!usages.isEmpty()){ //one + UsageFrame.gotoUsage(ABCPanel.this, usages.get(0)); + } + } + } + + private class CtrlClickHandler extends KeyAdapter implements MouseListener, MouseMotionListener { + + private boolean ctrlDown = false; + + @Override + public void keyPressed(KeyEvent e) { + if(e.getKeyCode() == 17 && !decompiledTextArea.isEditable()){ + ctrlDown = true; + decompiledTextArea.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + } + } + + @Override + public void keyReleased(KeyEvent e) { + if(e.getKeyCode() == 17){ + ctrlDown = false; + decompiledTextArea.setCursor(Cursor.getDefaultCursor()); + } + } + + @Override + public void mouseClicked(MouseEvent e) { + if(ctrlDown && e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 1 && !decompiledTextArea.isEditable()){ + ctrlDown = false; + decompiledTextArea.setCursor(Cursor.getDefaultCursor()); + gotoDeclaration(); + } + } + + @Override + public void mousePressed(MouseEvent e) { + + } + + @Override + public void mouseReleased(MouseEvent e) { + } + + @Override + public void mouseEntered(MouseEvent e) { + } + + @Override + public void mouseExited(MouseEvent e) { + ctrlDown = false; + decompiledTextArea.setCursor(Cursor.getDefaultCursor()); + } + + @Override + public void mouseDragged(MouseEvent e) { + } + + @Override + public void mouseMoved(MouseEvent e) { + if(ctrlDown && decompiledTextArea.isEditable()){ + ctrlDown = false; + decompiledTextArea.setCursor(Cursor.getDefaultCursor()); + } + } + + } public void reload() { switchAbc(listIndex); @@ -732,12 +845,10 @@ public class ABCPanel extends JPanel implements ItemListener, ActionListener, Se //reload(); } catch (ParseException ex) { abc.script_info.get(oldIndex).delete(abc, false); - ex.printStackTrace(); View.showMessageDialog(this, AppStrings.translate("error.action.save").replace("%error%", ex.text).replace("%line%", "" + ex.line), AppStrings.translate("error"), JOptionPane.ERROR_MESSAGE); decompiledTextArea.gotoLine((int) ex.line); } catch (CompilationException ex) { abc.script_info.get(oldIndex).delete(abc, false); - ex.printStackTrace(); View.showMessageDialog(this, AppStrings.translate("error.action.save").replace("%error%", ex.text).replace("%line%", "" + ex.line), AppStrings.translate("error"), JOptionPane.ERROR_MESSAGE); decompiledTextArea.gotoLine((int) ex.line); } catch (IOException | InterruptedException ex) { @@ -847,4 +958,6 @@ public class ABCPanel extends JPanel implements ItemListener, ActionListener, Se break; } } + + } diff --git a/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java b/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java index a3fd4929c..593757514 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java @@ -61,7 +61,23 @@ public class DecompiledEditorPane extends LineMarkedEditorPane implements CaretL private boolean isStatic = false; private final Cache cache = Cache.getInstance(true); private Trait currentTrait = null; + + private List scriptListeners = new ArrayList(); + + public void addScriptListener(Runnable l){ + scriptListeners.add(l); + } + + public void removeScriptListener(Runnable l){ + scriptListeners.remove(l); + } + public void fireScript(){ + for(int i=0;i abcTags, ABC abc, int multinameIndex, ABCPanel abcPanel) { + public UsageFrame(List abcTags, ABC abc, int multinameIndex, ABCPanel abcPanel, boolean definitions) { this.abcPanel = abcPanel; - List usages = abc.findMultinameUsage(multinameIndex); - this.abc = abc; - usageListModel = new UsageListModel(abcTags, abc); + List usages = definitions?abc.findMultinameDefinition(abcTags,multinameIndex):abc.findMultinameUsage(abcTags,multinameIndex); + Multiname m = abc.constants.constant_multiname.get(multinameIndex); + if(m.namespace_index>0 && abc.constants.constant_namespace.get(m.namespace_index).kind != Namespace.KIND_PRIVATE) + { + for(ABCContainerTag at:abcTags){ + ABC a = at.getABC(); + if(a == abc){ + continue; + } + int mid=a.constants.getMultinameId(m,false); + if(mid>0){ + usages.addAll(definitions?a.findMultinameDefinition(abcTags, mid):a.findMultinameUsage(abcTags, mid)); + } + } + } + usageListModel = new UsageListModel(); for (MultinameUsage u : usages) { usageListModel.addElement(u); } @@ -79,40 +93,57 @@ public class UsageFrame extends AppFrame implements ActionListener, MouseListene cont.add(new JScrollPane(usageList), BorderLayout.CENTER); cont.add(buttonsPanel, BorderLayout.SOUTH); setSize(400, 300); - setTitle(translate("dialog.title") + abc.constants.getMultiname(multinameIndex).getNameWithNamespace(abc.constants)); + setTitle((definitions?translate("dialog.title.declaration"):translate("dialog.title")) + abc.constants.getMultiname(multinameIndex).getNameWithNamespace(abc.constants)); View.centerScreen(this); View.setWindowIcon(this); } + public static void gotoUsage(final ABCPanel abcPanel,final MultinameUsage usage){ + if (usage instanceof InsideClassMultinameUsage) { + final InsideClassMultinameUsage icu = (InsideClassMultinameUsage) usage; + + Runnable settrait = new Runnable() { + + @Override + public void run() { + abcPanel.decompiledTextArea.removeScriptListener(this); + abcPanel.decompiledTextArea.setClassIndex(icu.classIndex); + if (usage instanceof TraitMultinameUsage) { + TraitMultinameUsage tmu = (TraitMultinameUsage) usage; + int traitIndex; + if (tmu.parentTraitIndex > -1) { + traitIndex = tmu.parentTraitIndex; + } else { + traitIndex = tmu.traitIndex; + } + if (!tmu.isStatic) { + traitIndex += abcPanel.abc.class_info.get(tmu.classIndex).static_traits.traits.size(); + } + if (tmu instanceof MethodMultinameUsage) { + MethodMultinameUsage mmu = (MethodMultinameUsage) usage; + if (mmu.isInitializer == true) { + traitIndex = abcPanel.abc.class_info.get(mmu.classIndex).static_traits.traits.size() + abcPanel.abc.instance_info.get(mmu.classIndex).instance_traits.traits.size() + (mmu.isStatic ? 1 : 0); + } + } + abcPanel.decompiledTextArea.gotoTrait(traitIndex); + } + } + }; + + + if(abcPanel.decompiledTextArea.getClassIndex() == icu.classIndex && abcPanel.abc == icu.abc){ + settrait.run(); + }else{ + abcPanel.decompiledTextArea.addScriptListener(settrait); + abcPanel.hilightScript(abcPanel.swf, abcPanel.abc.instance_info.get(icu.classIndex).getName(abcPanel.abc.constants).getNameWithNamespace(abcPanel.abc.constants)); + } + } + } + private void gotoUsage() { if (usageList.getSelectedIndex() != -1) { MultinameUsage usage = usageListModel.getUsage(usageList.getSelectedIndex()); - if (usage instanceof InsideClassMultinameUsage) { - InsideClassMultinameUsage icu = (InsideClassMultinameUsage) usage; - try { - Thread.sleep(100); - } catch (InterruptedException ex) { - } - if (usage instanceof TraitMultinameUsage) { - TraitMultinameUsage tmu = (TraitMultinameUsage) usage; - int traitIndex; - if (tmu.parentTraitIndex > -1) { - traitIndex = tmu.parentTraitIndex; - } else { - traitIndex = tmu.traitIndex; - } - if (!tmu.isStatic) { - traitIndex += abc.class_info.get(tmu.classIndex).static_traits.traits.size(); - } - if (tmu instanceof MethodMultinameUsage) { - MethodMultinameUsage mmu = (MethodMultinameUsage) usage; - if (mmu.isInitializer == true) { - traitIndex = abc.class_info.get(mmu.classIndex).static_traits.traits.size() + abc.instance_info.get(mmu.classIndex).instance_traits.traits.size() + (mmu.isStatic ? 1 : 0); - } - } - abcPanel.decompiledTextArea.gotoTrait(traitIndex); - } - } + gotoUsage(abcPanel,usage); } } diff --git a/src/com/jpexs/decompiler/flash/gui/abc/UsageListModel.java b/src/com/jpexs/decompiler/flash/gui/abc/UsageListModel.java index a602459cb..439cfe145 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/UsageListModel.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/UsageListModel.java @@ -30,32 +30,14 @@ import javax.swing.DefaultListModel; */ public class UsageListModel extends DefaultListModel { - private final ABC abc; - private final List abcTags; - - public UsageListModel(List abcTags, ABC abc) { - this.abc = abc; - this.abcTags = abcTags; - } - @Override public Object get(int index) { - try { - return ((MultinameUsage) super.get(index)).toString(abcTags, abc); - } catch (InterruptedException ex) { - Logger.getLogger(UsageListModel.class.getName()).log(Level.SEVERE, null, ex); - } - return null; + return ((MultinameUsage) super.get(index)).toString(); } @Override public Object getElementAt(int index) { - try { - return ((MultinameUsage) super.getElementAt(index)).toString(abcTags, abc); - } catch (InterruptedException ex) { - Logger.getLogger(UsageListModel.class.getName()).log(Level.SEVERE, null, ex); - } - return null; + return ((MultinameUsage) super.getElementAt(index)).toString(); } public MultinameUsage getUsage(int index) { diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties index c55f06ee9..d0f0e900c 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties @@ -478,3 +478,6 @@ import.select.directory = Select directory to import error.text.import = Error during text import. Do you want to continue? contextmenu.removeWithDependencies = Remove with dependencies + +abc.action.find-usages = Find usages +abc.action.find-declaration = Find declaration \ No newline at end of file diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties index 43605982a..926992593 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties @@ -466,4 +466,7 @@ message.action.playerglobal.needed = Pro p\u0159\u00edmou editaci ActionScriptu message.action.playerglobal.place = St\u00e1hn\u011bte knihovnu nazvanou PlayerGlobal(.swc), a um\u00edst\u011bte j\u00ed do adres\u00e1\u0159e\r\n%libpath%\r\n Stiskn\u011bte OK pro pokra\u010dov\u00e1n\u00ed. message.confirm.experimental.function = Tato funkce je EXPERIMENT\u00c1LN\u00cd. To znamen\u00e1, \u017ee byste nem\u011bli v\u011b\u0159it jej\u00edm v\u00fdsledk\u016fm a SWF soubor m\u016f\u017ee po ulo\u017een\u00ed p\u0159estat fungovat. -message.confirm.donotshowagain = P\u0159\u00ed\u0161t\u011b nezobrazovat \ No newline at end of file +message.confirm.donotshowagain = P\u0159\u00ed\u0161t\u011b nezobrazovat + +abc.action.find-usages = Naj\u00edt pou\u017eit\u00ed +abc.action.find-declaration = Naj\u00edt deklaraci \ No newline at end of file diff --git a/src/com/jpexs/decompiler/flash/gui/locales/abc/UsageFrame.properties b/src/com/jpexs/decompiler/flash/gui/locales/abc/UsageFrame.properties index 3c7675e5d..bbadc3a71 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/abc/UsageFrame.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/abc/UsageFrame.properties @@ -16,3 +16,4 @@ button.goto = Go to button.cancel = Cancel dialog.title = Usages: +dialog.title.declaration = Declaration: diff --git a/src/com/jpexs/decompiler/flash/gui/locales/abc/UsageFrame_cs.properties b/src/com/jpexs/decompiler/flash/gui/locales/abc/UsageFrame_cs.properties index e4a8ae300..5a27243a2 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/abc/UsageFrame_cs.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/abc/UsageFrame_cs.properties @@ -16,3 +16,4 @@ button.goto = P\u0159ej\u00edt na button.cancel = Storno dialog.title = Pou\u017eit\u00ed: +dialog.title.declaration = Deklarace: \ No newline at end of file