From c4e1879b793be091852f6f9fe2c126872bda3f97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Tue, 16 Aug 2016 23:31:12 +0200 Subject: [PATCH] As3ScriptReplacer as interface Better handling missing directories Tip for directories in advanced setting refactored - link to Flex SDK Use Flex SDK switch in Advanced settings --- .../com/jpexs/decompiler/flash/abc/ABC.java | 65 ++--------------- .../flash/configuration/Configuration.java | 4 ++ ...lacer.java => MxmlcAs3ScriptReplacer.java} | 60 ++++++++++------ .../decompiler/flash/flexsdk/MxmlcRunner.java | 4 +- .../flash/importers/AS3ScriptImporter.java | 4 +- .../importers/As3ScriptReplacerFactory.java | 24 +++++++ .../importers/As3ScriptReplacerInterface.java | 13 ++++ .../importers/FFDecAs3ScriptReplacer.java | 72 +++++++++++++++++++ .../decompiler/flash/DirectEditingTest.java | 3 +- .../flash/flexsdk/As3ScriptReplacerTest.java | 6 +- .../console/CommandLineArgumentParser.java | 35 ++++++--- .../flash/gui/AdvancedSettingsDialog.java | 20 +++--- .../jpexs/decompiler/flash/gui/HtmlLabel.java | 63 ++++++++++++++++ .../jpexs/decompiler/flash/gui/MainPanel.java | 41 +++++++---- .../decompiler/flash/gui/abc/ABCPanel.java | 15 +--- .../locales/AdvancedSettingsDialog.properties | 8 ++- .../AdvancedSettingsDialog_cs.properties | 5 +- .../AdvancedSettingsDialog_es.properties | 7 +- .../AdvancedSettingsDialog_fr.properties | 7 +- .../AdvancedSettingsDialog_hu.properties | 7 +- .../AdvancedSettingsDialog_it.properties | 7 +- 21 files changed, 316 insertions(+), 154 deletions(-) rename libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/flexsdk/{As3ScriptReplacer.java => MxmlcAs3ScriptReplacer.java} (79%) create mode 100644 libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/As3ScriptReplacerFactory.java create mode 100644 libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/As3ScriptReplacerInterface.java create mode 100644 libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/FFDecAs3ScriptReplacer.java create mode 100644 src/com/jpexs/decompiler/flash/gui/HtmlLabel.java diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ABC.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ABC.java index 99425e1ab..6a9ffdacf 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ABC.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ABC.java @@ -61,9 +61,10 @@ import com.jpexs.decompiler.flash.dumpview.DumpInfo; import com.jpexs.decompiler.flash.dumpview.DumpInfoSpecial; import com.jpexs.decompiler.flash.dumpview.DumpInfoSpecialType; import com.jpexs.decompiler.flash.exporters.script.LinkReportExporter; -import com.jpexs.decompiler.flash.flexsdk.As3ScriptReplacer; +import com.jpexs.decompiler.flash.flexsdk.MxmlcAs3ScriptReplacer; import com.jpexs.decompiler.flash.flexsdk.MxmlcException; import com.jpexs.decompiler.flash.helpers.SWFDecompilerPlugin; +import com.jpexs.decompiler.flash.importers.As3ScriptReplacerInterface; import com.jpexs.decompiler.flash.tags.ABCContainerTag; import com.jpexs.decompiler.flash.tags.Tag; import com.jpexs.decompiler.flash.types.annotations.Internal; @@ -1404,66 +1405,10 @@ public class ABC { method_info.remove(index); } - public boolean replaceScriptPack(ScriptPack pack, String as) throws AVM2ParseException, CompilationException, IOException, InterruptedException { - - final boolean USE_FLEX = true; - - boolean isSimple = pack.isSimple; - - if (USE_FLEX) { - if (!pack.isSimple) { - return false; - } - As3ScriptReplacer asr = new As3ScriptReplacer(Configuration.flexSdkLocation.get(), new LinkReportExporter()); - try { - asr.replaceScript(pack.getSwf(), pack, as); - } catch (MxmlcException ex) { - throw new AVM2ParseException(ex.getMxmlcErrorOutput(), 0); - } - } else { - String scriptName = pack.getPathScriptName() + ".as"; - int oldIndex = pack.scriptIndex; - int newIndex = script_info.size(); - String documentClass = getSwf().getDocumentClass(); - boolean isDocumentClass = documentClass != null && documentClass.equals(pack.getClassPath().toString()); - - ScriptInfo si = script_info.get(oldIndex); - if (isSimple) { - si.delete(this, true); - } else { - for (int t : pack.traitIndices) { - si.traits.traits.get(t).delete(this, true); - } - } - - int newClassIndex = instance_info.size(); - for (int t : pack.traitIndices) { - if (si.traits.traits.get(t) instanceof TraitClass) { - TraitClass tc = (TraitClass) si.traits.traits.get(t); - newClassIndex = tc.class_info + 1; - } - - } - List otherAbcs = new ArrayList<>(pack.allABCs); - otherAbcs.remove(this); - ActionScript3Parser.compile(as, this, otherAbcs, isDocumentClass, scriptName, newClassIndex, oldIndex); - - if (isSimple) { - // Move newly added script to its position - script_info.set(oldIndex, script_info.get(newIndex)); - script_info.remove(newIndex); - } else { - script_info.get(newIndex).setModified(true); - //Note: Is deleting traits safe? - List todel = new ArrayList<>(new TreeSet<>(pack.traitIndices)); - for (int i = todel.size() - 1; i >= 0; i--) { - si.traits.traits.remove((int) todel.get(i)); - } - } - script_info.get(oldIndex).setModified(true); - } + public boolean replaceScriptPack(As3ScriptReplacerInterface replacer, ScriptPack pack, String as) throws AVM2ParseException, CompilationException, IOException, InterruptedException { + replacer.replaceScript(pack, as); ((Tag) parentTag).setModified(true); - return !isSimple; + return pack.isSimple; } private void packMethods() { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java index 069800f3c..b23c62052 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java @@ -613,6 +613,10 @@ public class Configuration { @ConfigurationInternal public static final ConfigurationItem guiAvm2DocsSplitPaneDividerLocationPercent = null; + @ConfigurationDefaultBoolean(false) + @ConfigurationCategory("script") + public static final ConfigurationItem useFlexAs3Compiler = null; + private enum OSId { WINDOWS, OSX, UNIX diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/flexsdk/As3ScriptReplacer.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/flexsdk/MxmlcAs3ScriptReplacer.java similarity index 79% rename from libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/flexsdk/As3ScriptReplacer.java rename to libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/flexsdk/MxmlcAs3ScriptReplacer.java index 7751f3cc9..d0048d253 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/flexsdk/As3ScriptReplacer.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/flexsdk/MxmlcAs3ScriptReplacer.java @@ -3,6 +3,7 @@ package com.jpexs.decompiler.flash.flexsdk; import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.ScriptPack; +import com.jpexs.decompiler.flash.abc.avm2.parser.AVM2ParseException; import com.jpexs.decompiler.flash.abc.types.InstanceInfo; import com.jpexs.decompiler.flash.abc.types.ScriptInfo; import com.jpexs.decompiler.flash.abc.types.traits.Trait; @@ -15,6 +16,7 @@ import com.jpexs.decompiler.flash.exporters.settings.ScriptExportSettings; import com.jpexs.decompiler.flash.exporters.swf.SwfToSwcExporter; import com.jpexs.decompiler.flash.tags.ABCContainerTag; import com.jpexs.decompiler.flash.tags.Tag; +import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.helpers.Helper; import java.io.ByteArrayInputStream; @@ -28,12 +30,13 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import com.jpexs.decompiler.flash.importers.As3ScriptReplacerInterface; -public class As3ScriptReplacer extends MxmlcRunner { +public class MxmlcAs3ScriptReplacer extends MxmlcRunner implements As3ScriptReplacerInterface { private LinkReportExporter linkReporter; - public As3ScriptReplacer(String flexSdkPath, LinkReportExporter linkReporter) { + public MxmlcAs3ScriptReplacer(String flexSdkPath, LinkReportExporter linkReporter) { super(flexSdkPath); this.linkReporter = linkReporter; } @@ -87,8 +90,9 @@ public class As3ScriptReplacer extends MxmlcRunner { return false; } - public void replaceScript(SWF swf, ScriptPack oldPack, String txt) throws IOException, MxmlcException, InterruptedException { - if (!oldPack.isSimple) { + @Override + public void replaceScript(ScriptPack pack, String text) throws AVM2ParseException, CompilationException, IOException, InterruptedException { + if (!pack.isSimple) { throw new IOException("Cannot compile such file"); //Alchemy, etc. } @@ -96,23 +100,23 @@ public class As3ScriptReplacer extends MxmlcRunner { try { tempDir = Files.createTempDirectory("ffdec-mxmlc-replace").toFile(); File pkgDir = tempDir; - for (String pkgPart : oldPack.getClassPath().packageStr.toList()) { + for (String pkgPart : pack.getClassPath().packageStr.toList()) { if (!pkgPart.isEmpty()) { pkgDir = new File(pkgDir, pkgPart); } } pkgDir.mkdirs(); - File scriptFileToCompile = new File(pkgDir, oldPack.getClassPath().className + ".as"); + File scriptFileToCompile = new File(pkgDir, pack.getClassPath().className + ".as"); File compiledSwfFile = new File(pkgDir, "out.swf"); File swcFile = new File(pkgDir, "out.swc"); //Make copy without the old script - SWF swfCopy = recompileSWF(swf); + SWF swfCopy = recompileSWF(pack.getSwf()); List modAbcs = new ArrayList<>(); List copyPacks = swfCopy.getAS3Packs(); for (ScriptPack sp : copyPacks) { - if (sp.getClassPath().equals(oldPack.getClassPath())) { + if (sp.getClassPath().equals(pack.getClassPath())) { sp.abc.script_info.get(sp.scriptIndex).delete(sp.abc, true); ((Tag) sp.abc.parentTag).setModified(true); modAbcs.add(sp.abc); @@ -151,18 +155,22 @@ public class As3ScriptReplacer extends MxmlcRunner { swcExport.exportSwf(swfCopy, swcFile, true); //Write new script - Helper.writeFile(scriptFileToCompile.getAbsolutePath(), txt.getBytes("UTF-8")); + Helper.writeFile(scriptFileToCompile.getAbsolutePath(), text.getBytes("UTF-8")); - //Compile it (and subclasses stubs) - mxmlc("-strict=false", "-include-inheritance-dependencies-only", "-warnings=false", "-library-path", swcFile.getAbsolutePath(), "-source-path", tempDir.getAbsolutePath(), "-output", compiledSwfFile.getAbsolutePath(), "-debug=true", scriptFileToCompile.getAbsolutePath()); + try { + //Compile it (and subclasses stubs) + mxmlc("-strict=false", "-include-inheritance-dependencies-only", "-warnings=false", "-library-path", swcFile.getAbsolutePath(), "-source-path", tempDir.getAbsolutePath(), "-output", compiledSwfFile.getAbsolutePath(), "-debug=true", scriptFileToCompile.getAbsolutePath()); + } catch (MxmlcException ex1) { + throw new AVM2ParseException(ex1.getMxmlcErrorOutput(), 0); + } try (FileInputStream fis = new FileInputStream(compiledSwfFile)) { SWF newSWF = new SWF(fis, false, false); List newTags = newSWF.getAbcList(); - int oldScriptIndex = oldPack.scriptIndex; + int oldScriptIndex = pack.scriptIndex; int oldClassIndex = -1; - ScriptInfo oldScriptInfo = oldPack.abc.script_info.get(oldPack.scriptIndex); + ScriptInfo oldScriptInfo = pack.abc.script_info.get(pack.scriptIndex); for (Trait t : oldScriptInfo.traits.traits) { if (t instanceof TraitClass) { int traitClassIndex = ((TraitClass) t).class_info; @@ -171,18 +179,18 @@ public class As3ScriptReplacer extends MxmlcRunner { } } } - if (oldPack.isSimple) { - oldScriptInfo.delete(oldPack.abc, true); + if (pack.isSimple) { + oldScriptInfo.delete(pack.abc, true); } else { //NOO } - oldPack.abc.pack(); // removes old classes/methods/scripts + pack.abc.pack(); // removes old classes/methods/scripts ABCContainerTag newTagsLast = newTags.get(newTags.size() - 1); ABC newLastAbc = newTagsLast.getABC(); Map classesMap = new HashMap<>(); Map scriptsMap = new HashMap<>(); - oldPack.abc.mergeABC(newLastAbc, + pack.abc.mergeABC(newLastAbc, new HashMap<>(), new HashMap<>(), new HashMap<>(), @@ -207,10 +215,10 @@ public class As3ScriptReplacer extends MxmlcRunner { List addedScripts = new ArrayList<>(); for (int i = addedScriptIndices.size() - 1; i >= 0; i--) { int newScriptIndex = addedScriptIndices.get(i); - addedScripts.add(0, oldPack.abc.script_info.remove(newScriptIndex)); + addedScripts.add(0, pack.abc.script_info.remove(newScriptIndex)); } for (int i = 0; i < addedScripts.size(); i++) { - oldPack.abc.script_info.add(oldScriptIndex + i, addedScripts.get(i)); + pack.abc.script_info.add(oldScriptIndex + i, addedScripts.get(i)); } //IMPORTANT: Map newly created classes to their position as they @@ -219,7 +227,7 @@ public class As3ScriptReplacer extends MxmlcRunner { if (oldClassIndex > -1) { List addedClassIndices = new ArrayList<>(classesMap.values()); Collections.sort(addedClassIndices); - int totalClassCount = oldPack.abc.class_info.size(); + int totalClassCount = pack.abc.class_info.size(); Map classesRemap = new HashMap<>(); for (int i = 0; i < addedClassIndices.size(); i++) { classesRemap.put(addedClassIndices.get(i), oldClassIndex + i); @@ -236,14 +244,20 @@ public class As3ScriptReplacer extends MxmlcRunner { } } } - oldPack.abc.reorganizeClasses(classesRemap); + pack.abc.reorganizeClasses(classesRemap); } - ((Tag) oldPack.abc.parentTag).setModified(true); + ((Tag) pack.abc.parentTag).setModified(true); } } finally { if (tempDir != null && tempDir.exists()) { - //deleteFolder(tempDir); + deleteFolder(tempDir); } } } + + @Override + public boolean isAvailable() { + String flexLocation = Configuration.flexSdkLocation.get(); + return !(flexLocation.isEmpty() || (!new File(MxmlcRunner.getMxmlcPath(flexLocation)).exists())); + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/flexsdk/MxmlcRunner.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/flexsdk/MxmlcRunner.java index 63a709e74..8d47fadb6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/flexsdk/MxmlcRunner.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/flexsdk/MxmlcRunner.java @@ -15,14 +15,14 @@ public class MxmlcRunner { this.flexSdkPath = flexSdkPath; } - public String getMxmlcPath() { + public static String getMxmlcPath(String flexSdkPath) { boolean isWin = System.getProperty("os.name").toLowerCase().contains("win"); return flexSdkPath + File.separator + "bin" + File.separator + "mxmlc" + (isWin ? ".exe" : ""); } public void mxmlc(String... arguments) throws MxmlcException, InterruptedException, IOException { String runArgs[] = new String[arguments.length + 1]; - runArgs[0] = getMxmlcPath(); + runArgs[0] = getMxmlcPath(flexSdkPath); System.arraycopy(arguments, 0, runArgs, 1, arguments.length); System.out.println("" + String.join(" ", runArgs)); Process proc = null; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/AS3ScriptImporter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/AS3ScriptImporter.java index c00596ff9..e43ed93c2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/AS3ScriptImporter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/AS3ScriptImporter.java @@ -36,7 +36,7 @@ public class AS3ScriptImporter { private static final Logger logger = Logger.getLogger(AS3ScriptImporter.class.getName()); - public int importScripts(String scriptsFolder, List packs) { + public int importScripts(As3ScriptReplacerInterface scriptReplacer, String scriptsFolder, List packs) { if (!scriptsFolder.endsWith(File.separator)) { scriptsFolder += File.separator; } @@ -50,7 +50,7 @@ public class AS3ScriptImporter { String txt = Helper.readTextFile(fileName); try { - pack.abc.replaceScriptPack(pack, txt); + pack.abc.replaceScriptPack(scriptReplacer, pack, txt); } catch (AVM2ParseException ex) { logger.log(Level.SEVERE, "%error% on line %line%, file: %file%".replace("%error%", ex.text).replace("%line%", Long.toString(ex.line)).replace("%file%", fileName)); } catch (CompilationException ex) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/As3ScriptReplacerFactory.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/As3ScriptReplacerFactory.java new file mode 100644 index 000000000..d28c38213 --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/As3ScriptReplacerFactory.java @@ -0,0 +1,24 @@ +package com.jpexs.decompiler.flash.importers; + +import com.jpexs.decompiler.flash.configuration.Configuration; +import com.jpexs.decompiler.flash.exporters.script.LinkReportExporter; +import com.jpexs.decompiler.flash.flexsdk.MxmlcAs3ScriptReplacer; + +public class As3ScriptReplacerFactory { + + public static As3ScriptReplacerInterface createByConfig() { + if (Configuration.useFlexAs3Compiler.get()) { + return createFlex(); + } else { + return createFFDec(); + } + } + + public static As3ScriptReplacerInterface createFlex() { + return new MxmlcAs3ScriptReplacer(Configuration.flexSdkLocation.get(), new LinkReportExporter()); + } + + public static As3ScriptReplacerInterface createFFDec() { + return new FFDecAs3ScriptReplacer(); + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/As3ScriptReplacerInterface.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/As3ScriptReplacerInterface.java new file mode 100644 index 000000000..d14863048 --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/As3ScriptReplacerInterface.java @@ -0,0 +1,13 @@ +package com.jpexs.decompiler.flash.importers; + +import com.jpexs.decompiler.flash.abc.ScriptPack; +import com.jpexs.decompiler.flash.abc.avm2.parser.AVM2ParseException; +import com.jpexs.decompiler.graph.CompilationException; +import java.io.IOException; + +public interface As3ScriptReplacerInterface { + + public boolean isAvailable(); + + public void replaceScript(ScriptPack pack, String text) throws AVM2ParseException, CompilationException, IOException, InterruptedException; +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/FFDecAs3ScriptReplacer.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/FFDecAs3ScriptReplacer.java new file mode 100644 index 000000000..cf3c2ca9a --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/FFDecAs3ScriptReplacer.java @@ -0,0 +1,72 @@ +package com.jpexs.decompiler.flash.importers; + +import com.jpexs.decompiler.flash.SWF; +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.ScriptPack; +import com.jpexs.decompiler.flash.abc.avm2.parser.AVM2ParseException; +import com.jpexs.decompiler.flash.abc.avm2.parser.script.ActionScript3Parser; +import com.jpexs.decompiler.flash.abc.types.ScriptInfo; +import com.jpexs.decompiler.flash.abc.types.traits.TraitClass; +import com.jpexs.decompiler.flash.configuration.Configuration; +import com.jpexs.decompiler.graph.CompilationException; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.TreeSet; +import javax.swing.JOptionPane; + +public class FFDecAs3ScriptReplacer implements As3ScriptReplacerInterface { + + @Override + public void replaceScript(ScriptPack pack, String text) throws AVM2ParseException, CompilationException, IOException, InterruptedException { + ABC abc = pack.abc; + SWF swf = pack.abc.getSwf(); + String scriptName = pack.getPathScriptName() + ".as"; + int oldIndex = pack.scriptIndex; + int newIndex = abc.script_info.size(); + String documentClass = swf.getDocumentClass(); + boolean isDocumentClass = documentClass != null && documentClass.equals(pack.getClassPath().toString()); + + ScriptInfo si = abc.script_info.get(oldIndex); + if (pack.isSimple) { + si.delete(abc, true); + } else { + for (int t : pack.traitIndices) { + si.traits.traits.get(t).delete(abc, true); + } + } + + int newClassIndex = abc.instance_info.size(); + for (int t : pack.traitIndices) { + if (si.traits.traits.get(t) instanceof TraitClass) { + TraitClass tc = (TraitClass) si.traits.traits.get(t); + newClassIndex = tc.class_info + 1; + } + + } + List otherAbcs = new ArrayList<>(pack.allABCs); + otherAbcs.remove(abc); + ActionScript3Parser.compile(text, abc, otherAbcs, isDocumentClass, scriptName, newClassIndex, oldIndex); + if (pack.isSimple) { + // Move newly added script to its position + abc.script_info.set(oldIndex, abc.script_info.get(newIndex)); + abc.script_info.remove(newIndex); + } else { + abc.script_info.get(newIndex).setModified(true); + //Note: Is deleting traits safe? + List todel = new ArrayList<>(new TreeSet<>(pack.traitIndices)); + for (int i = todel.size() - 1; i >= 0; i--) { + si.traits.traits.remove((int) todel.get(i)); + } + } + abc.script_info.get(oldIndex).setModified(true); + } + + @Override + public boolean isAvailable() { + File swc = Configuration.getPlayerSWC(); + return !(swc == null || !swc.exists()); + } + +} diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/DirectEditingTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/DirectEditingTest.java index becd84602..70319b3db 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/DirectEditingTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/DirectEditingTest.java @@ -27,6 +27,7 @@ import com.jpexs.decompiler.flash.configuration.Configuration; import com.jpexs.decompiler.flash.exporters.modes.ScriptExportMode; import com.jpexs.decompiler.flash.helpers.CodeFormatting; import com.jpexs.decompiler.flash.helpers.HighlightedTextWriter; +import com.jpexs.decompiler.flash.importers.FFDecAs3ScriptReplacer; import com.jpexs.decompiler.flash.tags.ABCContainerTag; import com.jpexs.decompiler.flash.tags.base.ASMSource; import com.jpexs.decompiler.graph.CompilationException; @@ -90,7 +91,7 @@ public class DirectEditingTest extends FileTestBase { try { en.toSource(htw, abc.script_info.get(s).traits.traits, new ConvertData(), ScriptExportMode.AS, false); String original = htw.toString(); - abc.replaceScriptPack(en, original); + abc.replaceScriptPack(new FFDecAs3ScriptReplacer() /*TODO: test the otherone*/, en, original); } catch (Exception ex) { fail("Exception during decompilation - file: " + filePath + " class: " + classPathString, ex); throw ex; diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/flexsdk/As3ScriptReplacerTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/flexsdk/As3ScriptReplacerTest.java index 40dcb7677..c966864cd 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/flexsdk/As3ScriptReplacerTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/flexsdk/As3ScriptReplacerTest.java @@ -9,15 +9,13 @@ import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; import org.testng.annotations.Test; public class As3ScriptReplacerTest { @Test public void testReplace() throws IOException, InterruptedException, Exception { - As3ScriptReplacer replacer = new As3ScriptReplacer(Configuration.flexSdkLocation.get(), new LinkReportExporter()); + MxmlcAs3ScriptReplacer replacer = new MxmlcAs3ScriptReplacer(Configuration.flexSdkLocation.get(), new LinkReportExporter()); SWF swf = new SWF(new BufferedInputStream(new FileInputStream("testdata/as3/as3.swf")), false); String replacement = "package classes\n" + "{\n" @@ -43,7 +41,7 @@ public class As3ScriptReplacerTest { classNames.add("classes.TestClass1"); List packs = swf.getScriptPacksByClassNames(classNames); for (ScriptPack sp : packs) { - replacer.replaceScript(swf, sp, replacement); + replacer.replaceScript(sp, replacement); return; } } diff --git a/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java b/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java index 7c97ca182..cc5bbea58 100644 --- a/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java +++ b/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java @@ -90,6 +90,7 @@ import com.jpexs.decompiler.flash.exporters.settings.SpriteExportSettings; import com.jpexs.decompiler.flash.exporters.settings.TextExportSettings; import com.jpexs.decompiler.flash.exporters.swf.SwfToSwcExporter; import com.jpexs.decompiler.flash.exporters.swf.SwfXmlExporter; +import com.jpexs.decompiler.flash.flexsdk.MxmlcAs3ScriptReplacer; import com.jpexs.decompiler.flash.gui.AppStrings; import com.jpexs.decompiler.flash.gui.Main; import com.jpexs.decompiler.flash.gui.SearchInMemory; @@ -101,7 +102,10 @@ import com.jpexs.decompiler.flash.helpers.FileTextWriter; import com.jpexs.decompiler.flash.helpers.SWFDecompilerPlugin; import com.jpexs.decompiler.flash.importers.AS2ScriptImporter; import com.jpexs.decompiler.flash.importers.AS3ScriptImporter; +import com.jpexs.decompiler.flash.importers.As3ScriptReplacerFactory; +import com.jpexs.decompiler.flash.importers.As3ScriptReplacerInterface; import com.jpexs.decompiler.flash.importers.BinaryDataImporter; +import com.jpexs.decompiler.flash.importers.FFDecAs3ScriptReplacer; import com.jpexs.decompiler.flash.importers.FontImporter; import com.jpexs.decompiler.flash.importers.ImageImporter; import com.jpexs.decompiler.flash.importers.MorphShapeImporter; @@ -3421,7 +3425,7 @@ public class CommandLineArgumentParser { SWF swf = new SWF(is, Configuration.parallelSpeedUp.get()); String scriptsFolder = Path.combine(args.pop(), ScriptExportSettings.EXPORT_FOLDER_NAME); new AS2ScriptImporter().importScripts(scriptsFolder, swf.getASMs(true)); - new AS3ScriptImporter().importScripts(scriptsFolder, swf.getAS3Packs()); + new AS3ScriptImporter().importScripts(As3ScriptReplacerFactory.createByConfig(), scriptsFolder, swf.getAS3Packs()); try { try (OutputStream fos = new BufferedOutputStream(new FileOutputStream(outFile))) { @@ -3552,18 +3556,31 @@ public class CommandLineArgumentParser { private static void replaceAS3(String as, ScriptPack pack) throws IOException, InterruptedException { System.out.println("Replace AS3"); System.out.println("Warning: This feature is EXPERIMENTAL"); - File swc = Configuration.getPlayerSWC(); - if (swc == null) { - final String adobePage = "http://www.adobe.com/support/flashplayer/downloads.html"; - System.err.println("For ActionScript 3 direct editation, a library called \"PlayerGlobal.swc\" needs to be downloaded from Adobe homepage:"); - System.err.println(adobePage); - System.err.println("Download the library called PlayerGlobal(.swc), and place it to directory"); - System.err.println(Configuration.getFlashLibPath().getAbsolutePath()); + As3ScriptReplacerInterface scriptReplacer = As3ScriptReplacerFactory.createByConfig(); + if (!scriptReplacer.isAvailable()) { + System.err.println("Current script replacer is not available."); + if (scriptReplacer instanceof FFDecAs3ScriptReplacer) { + System.err.println("Current replacer: FFDec"); + final String adobePage = "http://www.adobe.com/support/flashplayer/downloads.html"; + System.err.println("For ActionScript 3 direct editation, a library called \"PlayerGlobal.swc\" needs to be downloaded from Adobe homepage:"); + System.err.println(adobePage); + System.err.println("Download the library called PlayerGlobal(.swc), and place it to directory"); + System.err.println(Configuration.getFlashLibPath().getAbsolutePath()); + } else if (scriptReplacer instanceof MxmlcAs3ScriptReplacer) { + System.err.println("Current replacer: Flex SDK"); + final String flexPage = "http://www.adobe.com/devnet/flex/flex-sdk-download.html"; + System.err.println("For ActionScript 3 direct editation, Flex SDK needs to be download"); + System.err.println(flexPage); + System.err.println("Download FLEX Sdk, unzip it to some directory and set its directory path in the configuration"); + + } else { + + } System.exit(1); } try { - pack.abc.replaceScriptPack(pack, as); + pack.abc.replaceScriptPack(scriptReplacer, pack, as); } catch (AVM2ParseException ex) { System.err.println("%error% on line %line%".replace("%error%", ex.text).replace("%line%", Long.toString(ex.line))); System.exit(1); diff --git a/src/com/jpexs/decompiler/flash/gui/AdvancedSettingsDialog.java b/src/com/jpexs/decompiler/flash/gui/AdvancedSettingsDialog.java index dfe518f9a..8007dcb05 100644 --- a/src/com/jpexs/decompiler/flash/gui/AdvancedSettingsDialog.java +++ b/src/com/jpexs/decompiler/flash/gui/AdvancedSettingsDialog.java @@ -57,6 +57,7 @@ import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; +import javax.swing.JEditorPane; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; @@ -68,6 +69,8 @@ import javax.swing.JTabbedPane; import javax.swing.JTextField; import javax.swing.SpringLayout; import javax.swing.WindowConstants; +import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; import javax.swing.filechooser.FileFilter; import javax.swing.table.DefaultTableModel; import org.pushingpixels.substance.api.ColorSchemeAssociationKind; @@ -479,24 +482,19 @@ public class AdvancedSettingsDialog extends AppDialog { itemCount, 2, //rows, cols 6, 6, //initX, initY 6, 6); //xPad, yPad - //https://www.adobe.com/support/flashplayer/debug_downloads.html if (resourceBundle.containsKey("config.group.tip." + cat)) { String tip = resourceBundle.getString("config.group.tip." + cat); - String url = null; + String urls[] = new String[0]; if (resourceBundle.containsKey("config.group.link." + cat)) { - url = resourceBundle.getString("config.group.link." + cat); + urls = resourceBundle.getString("config.group.link." + cat).split(" "); + } + for (int i = 0; i < urls.length; i++) { + tip = tip.replace("%link" + (i + 1) + "%", urls[i]); } JPanel p = new JPanel(new BorderLayout()); p.add(configPanel, BorderLayout.CENTER); JPanel tipPanel = new JPanel(new FlowLayout()); - tipPanel.add(new JLabel("" + resourceBundle.getString("tip") + "" + tip + "")); - if (url != null) { - String linkText = url; - if (resourceBundle.containsKey("config.group.linkText." + cat)) { - linkText = resourceBundle.getString("config.group.linkText." + cat); - } - tipPanel.add(new LinkLabel(linkText, url)); - } + tipPanel.add(new HtmlLabel("" + resourceBundle.getString("tip") + "" + tip)); p.add(tipPanel, BorderLayout.SOUTH); configPanel = p; } diff --git a/src/com/jpexs/decompiler/flash/gui/HtmlLabel.java b/src/com/jpexs/decompiler/flash/gui/HtmlLabel.java new file mode 100644 index 000000000..8d147156f --- /dev/null +++ b/src/com/jpexs/decompiler/flash/gui/HtmlLabel.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2016 Jindra + * + * 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; + +import java.awt.Color; +import javax.swing.JEditorPane; +import javax.swing.JLabel; +import javax.swing.event.HyperlinkEvent; + +public class HtmlLabel extends JEditorPane { + + private JLabel label = new JLabel(); + private String rawText; + + public HtmlLabel() { + this(""); + } + + public HtmlLabel(String text) { + super("text/html", ""); + setText(text); + setEditable(false); + setFocusable(false); + setOpaque(false); + addHyperlinkListener((HyperlinkEvent hle) -> { + if (HyperlinkEvent.EventType.ACTIVATED.equals(hle.getEventType())) { + View.navigateUrl(hle.getURL().toString()); + } + }); + } + + @Override + public void setText(String t) { + String modText = t; + if (!t.equals("")) { + Color fgColor = label.getForeground(); + + modText = "" + t + ""; + } + this.rawText = t; + super.setText(modText); + } + + @Override + public String getText() { + return rawText; + } + +} diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index bfd69ac4b..1cdc81599 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -73,6 +73,7 @@ import com.jpexs.decompiler.flash.exporters.settings.SpriteExportSettings; import com.jpexs.decompiler.flash.exporters.settings.TextExportSettings; import com.jpexs.decompiler.flash.exporters.swf.SwfJavaExporter; import com.jpexs.decompiler.flash.exporters.swf.SwfXmlExporter; +import com.jpexs.decompiler.flash.flexsdk.MxmlcAs3ScriptReplacer; import com.jpexs.decompiler.flash.gui.abc.ABCPanel; import com.jpexs.decompiler.flash.gui.abc.ABCPanelSearchResult; import com.jpexs.decompiler.flash.gui.abc.ClassesListTreeModel; @@ -94,7 +95,10 @@ import com.jpexs.decompiler.flash.helpers.FileTextWriter; import com.jpexs.decompiler.flash.helpers.Freed; import com.jpexs.decompiler.flash.importers.AS2ScriptImporter; import com.jpexs.decompiler.flash.importers.AS3ScriptImporter; +import com.jpexs.decompiler.flash.importers.As3ScriptReplacerFactory; +import com.jpexs.decompiler.flash.importers.As3ScriptReplacerInterface; import com.jpexs.decompiler.flash.importers.BinaryDataImporter; +import com.jpexs.decompiler.flash.importers.FFDecAs3ScriptReplacer; import com.jpexs.decompiler.flash.importers.ImageImporter; import com.jpexs.decompiler.flash.importers.ShapeImporter; import com.jpexs.decompiler.flash.importers.SwfXmlImporter; @@ -861,11 +865,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se ? translate("message.confirm.closeAll") : translate("message.confirm.close").replace("{swfName}", swfList.toString()); - if (View.showConfirmDialog(this, message, translate("message.warning"), JOptionPane.OK_CANCEL_OPTION, Configuration.showCloseConfirmation, JOptionPane.OK_OPTION) != JOptionPane.OK_OPTION) { - return false; - } - - return true; + return View.showConfirmDialog(this, message, translate("message.warning"), JOptionPane.OK_CANCEL_OPTION, Configuration.showCloseConfirmation, JOptionPane.OK_OPTION) == JOptionPane.OK_OPTION; } public boolean isModified() { @@ -2143,15 +2143,32 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } } - public void importScript(final SWF swf) { + public As3ScriptReplacerInterface getAs3ScriptReplacer() { + As3ScriptReplacerInterface r = As3ScriptReplacerFactory.createByConfig(); + if (!r.isAvailable()) { + if (r instanceof MxmlcAs3ScriptReplacer) { + if (View.showConfirmDialog(null, AppStrings.translate("message.flexpath.notset"), AppStrings.translate("error"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.OK_OPTION) { + Main.advancedSettings("paths"); + } + } else if (r instanceof FFDecAs3ScriptReplacer) { + if (View.showConfirmDialog(this, AppStrings.translate("message.playerpath.lib.notset"), AppStrings.translate("message.action.playerglobal.title"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.OK_OPTION) { + Main.advancedSettings("paths"); + } + } else { + //Not translated yet - just in case there are more Script replacers in the future. Unused now. + View.showConfirmDialog(this, "Current script replacer is not available", "Script replacer not available", JOptionPane.OK_OPTION, JOptionPane.ERROR_MESSAGE); + } + return null; + } + return r; + } - String flexLocation = Configuration.flexSdkLocation.get(); - if (flexLocation.isEmpty() || (!new File(flexLocation).exists())) { - View.showMessageDialog(null, AppStrings.translate("message.flexpath.notset"), AppStrings.translate("error"), JOptionPane.ERROR_MESSAGE); - Main.advancedSettings("paths"); + public void importScript(final SWF swf) { + As3ScriptReplacerInterface as3ScriptReplacer = getAs3ScriptReplacer(); + if (as3ScriptReplacer == null) { return; } - + String flexLocation = Configuration.flexSdkLocation.get(); JFileChooser chooser = new JFileChooser(); chooser.setCurrentDirectory(new File(Configuration.lastExportDir.get())); chooser.setDialogTitle(translate("import.select.directory")); @@ -2162,7 +2179,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se String scriptsFolder = Path.combine(selFile, ScriptExportSettings.EXPORT_FOLDER_NAME); int countAs2 = new AS2ScriptImporter().importScripts(scriptsFolder, swf.getASMs(true)); - int countAs3 = new AS3ScriptImporter().importScripts(scriptsFolder, swf.getAS3Packs()); + int countAs3 = new AS3ScriptImporter().importScripts(as3ScriptReplacer, scriptsFolder, swf.getAS3Packs()); if (countAs3 > 0) { updateClassesList(); diff --git a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java index 083b1238f..3e9d20a93 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java @@ -69,6 +69,7 @@ import com.jpexs.decompiler.flash.gui.abc.tablemodels.UIntTableModel; import com.jpexs.decompiler.flash.gui.controls.JPersistentSplitPane; import com.jpexs.decompiler.flash.gui.editor.LinkHandler; import com.jpexs.decompiler.flash.gui.tagtree.TagTreeModel; +import com.jpexs.decompiler.flash.importers.As3ScriptReplacerFactory; import com.jpexs.decompiler.flash.tags.ABCContainerTag; import com.jpexs.decompiler.flash.tags.Tag; import com.jpexs.decompiler.flash.treeitems.TreeItem; @@ -1150,17 +1151,7 @@ public class ABCPanel extends JPanel implements ItemListener, SearchListeneradobe webpage. Flex SDK can be downloaded on adobe devnet. +config.group.link.paths = https://www.adobe.com/support/flashplayer/debug_downloads.html http://www.adobe.com/devnet/flex/flex-sdk-download.html config.name.playerLocation = 1) Flash Player projector path config.description.playerLocation = Location of standalone flash player executable. Used for Run action. @@ -435,3 +434,6 @@ config.description.resetLetterSpacingOnTextImport = Useful for cyrillic fonts, b config.name.flexSdkLocation = 4) Flex SDK directory path config.description.flexSdkLocation = Location of Adobe Flex SDK. It is used mostly for AS3 compilation. + +config.name.useFlexAs3Compiler = Use Flex SDK AS3 compiler +config.description.useFlexAs3Compiler = Use AS3 compiler from Flex SDK while ActionScript direct editation (Flex SDK directory needs to be set) \ No newline at end of file diff --git a/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog_cs.properties b/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog_cs.properties index 6cb05bc47..81c03232a 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog_cs.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog_cs.properties @@ -363,9 +363,8 @@ config.description.lastSessionFileTitles = Obsahuje titulky souboru z naposledy config.group.name.paths = Cesty config.group.description.paths = Um\u00edst\u011bn\u00ed pot\u0159ebn\u00fdch soubor\u016f -config.group.tip.paths = Tyto soubory m\u016f\u017eete st\u00e1hnout na str\u00e1nk\u00e1ch adobe -config.group.link.paths = https://www.adobe.com/support/flashplayer/debug_downloads.html -config.group.linkText.paths = [nav\u0161t\u00edvit] +config.group.tip.paths = Stahn\u011bte si projector a Playerglobal na str\u00e1nk\u00e1ch adobe. Flex SDK lze stahnout na webu adobe devnet. +config.group.link.paths = https://www.adobe.com/support/flashplayer/debug_downloads.html http://www.adobe.com/devnet/flex/flex-sdk-download.html config.name.playerLocation = 1) Cesta k Flash Player projectoru config.description.playerLocation = Um\u00edst\u011bn\u00ed spustiteln\u00e9ho flash playeru. Pou\u017e\u00edvan\u00e9 pro akci Spustit. diff --git a/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog_es.properties b/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog_es.properties index 745e9ace5..5ea3bbb28 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog_es.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog_es.properties @@ -379,9 +379,10 @@ config.description.lastSessionFileTitles = Contiene los t\u00edtulos de archivoa config.group.name.paths = Rutas config.group.description.paths = Ubicaci\u00f3n de los archivos necesarios -config.group.tip.paths = Usted puede bajar estos archivos desde la p\u00e1gina web de Adobe -config.group.link.paths = https://www.adobe.com/support/flashplayer/debug_downloads.html -config.group.linkText.paths = [visita] +#config.group.tip.paths = Usted puede bajar estos archivos desde la p\u00e1gina web de Adobe +#TODO: translate again: +config.group.tip.paths = Download projector and Playerglobal on adobe webpage. Flex SDK can be downloaded on adobe devnet. +config.group.link.paths = https://www.adobe.com/support/flashplayer/debug_downloads.html http://www.adobe.com/devnet/flex/flex-sdk-download.html config.name.playerLocation = 1) Ruta de Flash Player projector config.description.playerLocation = Ubicaci\u00f3n del ejecutable aut\u00f3nomo de Flash Player. Utilizado para la acci\u00f3n Correr. diff --git a/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog_fr.properties b/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog_fr.properties index aec34d531..02ea745dd 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog_fr.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog_fr.properties @@ -379,9 +379,10 @@ config.description.lastSessionFileTitles = Comprend les titres des fichiers ouve config.group.name.paths = Chemins config.group.description.paths = Location des fichiers demand\u00e9s -config.group.tip.paths = Vous pouvez t\u00e9l\u00e9charger ces fichiers depuis le site web d'Adobe -config.group.link.paths = https://www.adobe.com/support/flashplayer/debug_downloads.html -config.group.linkText.paths = [visiter] +#config.group.tip.paths = Vous pouvez t\u00e9l\u00e9charger ces fichiers depuis le site web d'Adobe +#TODO: translate again: +config.group.tip.paths = Download projector and Playerglobal on adobe webpage. Flex SDK can be downloaded on adobe devnet. +config.group.link.paths = https://www.adobe.com/support/flashplayer/debug_downloads.html http://www.adobe.com/devnet/flex/flex-sdk-download.html config.name.playerLocation = 1) Chemin du lecteur Flash config.description.playerLocation = Location du lecteur autonome de fichier ex\u00e9cutable Flash. Used for Run action. diff --git a/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog_hu.properties b/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog_hu.properties index 203d82ba1..c1106f911 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog_hu.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog_hu.properties @@ -379,9 +379,10 @@ config.description.lastSessionFileTitles = Tartalmazza az utols\u00f3 munkamenet config.group.name.paths = \u00datvonalak config.group.description.paths = A sz\u00fcks\u00e9ges f\u00e1jlok el\u00e9rhet\u0151s\u00e9gei -config.group.tip.paths = Ezeket a f\u00e1jlokat az Adobe honlapj\u00e1r\u00f3l t\u00f6ltheti le -config.group.link.paths = https://www.adobe.com/support/flashplayer/debug_downloads.html -config.group.linkText.paths = [visit] +#config.group.tip.paths = Ezeket a f\u00e1jlokat az Adobe honlapj\u00e1r\u00f3l t\u00f6ltheti le +#TODO: translate again: +config.group.tip.paths = Download projector and Playerglobal on adobe webpage. Flex SDK can be downloaded on adobe devnet. +config.group.link.paths = https://www.adobe.com/support/flashplayer/debug_downloads.html http://www.adobe.com/devnet/flex/flex-sdk-download.html config.name.playerLocation = 1) Flash Player projector \u00fatvonal config.description.playerLocation = Standalone flash player helye. A Futtat\u00e1shoz sz\u00fcks\u00e9ges. diff --git a/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog_it.properties b/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog_it.properties index 7dfb6ca68..174149b9d 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog_it.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog_it.properties @@ -379,9 +379,10 @@ config.description.lastSessionFileTitles = Contiene i titoli dei file aperti nel config.group.name.paths = Percorsi config.group.description.paths = Ubicazione dei file richiesti -config.group.tip.paths = \ufffd possibile ottenere questi file dal sito Adobe -config.group.link.paths = https://www.adobe.com/support/flashplayer/debug_downloads.html -config.group.linkText.paths = [apri] +#config.group.tip.paths = possibile ottenere questi file dal sito Adobe +#TODO: translate again: +config.group.tip.paths = Download projector and Playerglobal on adobe webpage. Flex SDK can be downloaded on adobe devnet. +config.group.link.paths = https://www.adobe.com/support/flashplayer/debug_downloads.html http://www.adobe.com/devnet/flex/flex-sdk-download.html config.name.playerLocation = 1) Percorso Flash Player config.description.playerLocation = Posizione eseguibile Flash Player. Utilizzato per l'azione Esegui.