From 0724b4a3f0dba6f3c863a2298fa158e9814825e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 6 Dec 2015 06:29:08 +0100 Subject: [PATCH] Debug (breakpoints, step) P-code for both AS1/2 and AS3 --- lib/jsyntaxpane-0.9.5.jar | Bin 568036 -> 568403 bytes .../src/com/jpexs/decompiler/flash/SWF.java | 132 ++++++++++++++++-- .../decompiler/flash/abc/ScriptPack.java | 92 ++++++++++++ .../decompiler/flash/abc/avm2/AVM2Code.java | 2 +- .../avm2/instructions/AVM2Instruction.java | 5 + .../jpexs/decompiler/flash/action/Action.java | 7 +- .../flash/action/swf4/ActionPush.java | 2 +- .../flash/helpers/FileTextWriter.java | 2 +- .../flash/helpers/GraphTextWriter.java | 2 +- .../flash/helpers/HighlightedTextWriter.java | 4 +- .../decompiler/flash/helpers/NulWriter.java | 2 +- .../flash/helpers/hilight/HighlightData.java | 8 +- .../flash/helpers/hilight/Highlighting.java | 2 +- .../decompiler/graph/GraphSourceItem.java | 2 + .../config.properties | 2 +- .../config_ca.properties | 2 +- .../config_cs.properties | 2 +- .../config_de.properties | 2 +- .../config_es.properties | 2 +- .../config_fr.properties | 2 +- .../config_hu.properties | 2 +- .../config_it.properties | 2 +- .../config_nl.properties | 2 +- .../config_pl.properties | 2 +- .../config_pt.properties | 2 +- .../config_pt_BR.properties | 2 +- .../config_ru.properties | 4 +- .../config_sv.properties | 2 +- .../config_uk.properties | 4 +- .../config_zh.properties | 2 +- .../flasm3syntaxkit/config.properties | 2 +- .../flasm3syntaxkit/config_ca.properties | 2 +- .../flasm3syntaxkit/config_cs.properties | 2 +- .../flasm3syntaxkit/config_de.properties | 2 +- .../flasm3syntaxkit/config_es.properties | 90 ++++++------ .../flasm3syntaxkit/config_fr.properties | 2 +- .../flasm3syntaxkit/config_hu.properties | 2 +- .../flasm3syntaxkit/config_it.properties | 2 +- .../flasm3syntaxkit/config_nl.properties | 2 +- .../flasm3syntaxkit/config_pl.properties | 2 +- .../flasm3syntaxkit/config_pt.properties | 90 ++++++------ .../flasm3syntaxkit/config_pt_BR.properties | 2 +- .../flasm3syntaxkit/config_ru.properties | 2 +- .../flasm3syntaxkit/config_sv.properties | 2 +- .../flasm3syntaxkit/config_uk.properties | 2 +- .../flasm3syntaxkit/config_zh.properties | 2 +- .../flasmsyntaxkit/config.properties | 2 +- .../flasmsyntaxkit/config_ca.properties | 2 +- .../flasmsyntaxkit/config_cs.properties | 2 +- .../flasmsyntaxkit/config_de.properties | 2 +- .../flasmsyntaxkit/config_es.properties | 2 +- .../flasmsyntaxkit/config_fr.properties | 2 +- .../flasmsyntaxkit/config_hu.properties | 2 +- .../flasmsyntaxkit/config_it.properties | 2 +- .../flasmsyntaxkit/config_nl.properties | 2 +- .../flasmsyntaxkit/config_pl.properties | 2 +- .../flasmsyntaxkit/config_pt.properties | 2 +- .../flasmsyntaxkit/config_pt_BR.properties | 2 +- .../flasmsyntaxkit/config_ru.properties | 4 +- .../flasmsyntaxkit/config_sv.properties | 2 +- .../flasmsyntaxkit/config_uk.properties | 4 +- .../flasmsyntaxkit/config_zh.properties | 2 +- .../console/CommandLineArgumentParser.java | 57 +++++++- .../decompiler/flash/gui/DebugPanel.java | 2 +- .../decompiler/flash/gui/DebuggerHandler.java | 70 +++++++--- src/com/jpexs/decompiler/flash/gui/Main.java | 37 +++-- .../decompiler/flash/gui/MainFrameMenu.java | 8 +- .../jpexs/decompiler/flash/gui/MainPanel.java | 51 +++++-- .../flash/gui/abc/ASMSourceEditorPane.java | 47 ++++++- .../flash/gui/abc/DecompiledEditorPane.java | 2 +- .../flash/gui/abc/MethodCodePanel.java | 20 ++- .../flash/gui/action/ActionPanel.java | 65 +++------ .../gui/editor/DebuggableEditorPane.java | 12 +- .../gui/editor/LineMarkedEditorPane.java | 17 ++- .../flash/gui/locales/MainFrame.properties | 4 +- 75 files changed, 670 insertions(+), 264 deletions(-) diff --git a/lib/jsyntaxpane-0.9.5.jar b/lib/jsyntaxpane-0.9.5.jar index 2af05d4b8ddcb97b3967db74e83df68fee87e945..dfec0b48870e3695f2c8069a81f440ab137420e4 100644 GIT binary patch delta 43761 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 packs = getAS3Packs(); + for (ScriptPack s : packs) { + int abcIndex = s.allABCs.indexOf(s.abc); + if (s.isSimple) { + s.injectPCodeDebugInfo(abcIndex); + } + } + } + + /** + * Injects debugline and debugfile instructions to AS3 code + * + * @param decompileDir Directory to set file information paths + */ + public void injectAS3DebugInfo(File decompileDir) { + List packs = getAS3Packs(); + for (ScriptPack s : packs) { + if (s.isSimple) { + s.injectDebugInfo(decompileDir); + } + } + } + + /** + * Enables debugging. Adds tags to enable debugging and injects debugline + * and debugfile instructions to AS3 code. Optionally enables Telemetry + * + * @param injectAS3Code Modify AS3 code with debugfile / debugline ? + * @param decompileDir Directory to virtual decompile (will affect + * debugfile) + * @param telemetry Enable telemetry info? + * @param pcodeLevel inject Pcode lines instead of decompiled lines + */ + public void enableDebugging(boolean injectAS3Code, File decompileDir, boolean telemetry, boolean pcodeLevel) { if (injectAS3Code) { - List packs = getAS3Packs(); - for (ScriptPack s : packs) { - if (s.isSimple) { - s.injectDebugInfo(decompileDir); - } + if (pcodeLevel) { + injectAS3PcodeDebugInfo(); + } else { + injectAS3DebugInfo(decompileDir); } } @@ -3233,6 +3274,82 @@ public final class SWF implements SWFContainerItem, Timelined { return r; } + public boolean generatePCodeSwdFile(File file, Map> breakpoints) throws IOException { + DebugIDTag dit = getDebugId(); + if (dit == null) { + return false; + } + List items = new ArrayList<>(); + Map asms = getASMs(true); + + try { + items.add(new SWD.DebugId(dit.debugId)); + + } catch (Throwable t) { + Logger.getLogger(SWF.class.getName()).log(Level.SEVERE, "message", t); + return false; + } + + int moduleId = 0; + List names = new ArrayList<>(asms.keySet()); + Collections.sort(names); + for (String name : names) { + moduleId++; + String sname = "#PCODE " + name; + int bitmap = SWD.bitmapAction; + items.add(new SWD.DebugScript(moduleId, bitmap, sname, "")); + + HighlightedTextWriter writer = new HighlightedTextWriter(Configuration.getCodeFormatting(), true); + try { + asms.get(name).getASMSource(ScriptExportMode.PCODE, writer, asms.get(name).getActions()); + } catch (InterruptedException ex) { + logger.log(Level.SEVERE, null, ex); + } + List hls = writer.instructionHilights; + + Map offsetToLine = new TreeMap<>(); + String txt = writer.toString(); + txt = txt.replace("\r", ""); + int line = 1; + for (int i = 0; i < txt.length(); i++) { + Highlighting h = Highlighting.searchPos(hls, i); + if (h != null) { + int of = (int) h.getProperties().fileOffset; + if (of > -1 && !offsetToLine.containsKey(of) && !offsetToLine.containsValue(line)) { + offsetToLine.put(of, line); + } + } + if (txt.charAt(i) == '\n') { + line++; + } + } + + for (int ofs : offsetToLine.keySet()) { + items.add(new SWD.DebugOffset(moduleId, offsetToLine.get(ofs), ofs)); + } + + if (breakpoints.containsKey(sname)) { + Set bplines = breakpoints.get(sname); + for (int bpline : bplines) { + if (offsetToLine.containsValue(bpline)) { + try { + SWD.DebugBreakpoint dbp = new SWD.DebugBreakpoint(moduleId, bpline); + items.add(dbp); + } catch (IllegalArgumentException iex) { + Logger.getLogger(SWF.class.getName()).log(Level.WARNING, "Cannot generate breakpoint to SWD: {0}", iex.getMessage()); + } + } + } + } + } + + SWD swd = new SWD(7, items); + try (FileOutputStream fis = new FileOutputStream(file)) { + swd.saveTo(fis); + } + return true; + } + public boolean generateSwdFile(File file, Map> breakpoints) throws IOException { DebugIDTag dit = getDebugId(); if (dit == null) { @@ -3243,15 +3360,10 @@ public final class SWF implements SWFContainerItem, Timelined { try { items.add(new SWD.DebugId(dit.debugId)); - Random rnd = new Random(); - //Map moduleIds = new HashMap<>(); - List swdOffsets = new ArrayList<>(); - List swfBps = new ArrayList<>(); int moduleId = 0; List names = new ArrayList<>(asms.keySet()); Collections.sort(names); - //Collections.reverse(names); for (String name : names) { List regitems = new ArrayList<>(); moduleId++; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java index 86a174697..0828fbba6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/ScriptPack.java @@ -37,6 +37,8 @@ import com.jpexs.decompiler.flash.exporters.modes.ScriptExportMode; import com.jpexs.decompiler.flash.exporters.settings.ScriptExportSettings; import com.jpexs.decompiler.flash.helpers.FileTextWriter; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; +import com.jpexs.decompiler.flash.helpers.HighlightedText; +import com.jpexs.decompiler.flash.helpers.HighlightedTextWriter; import com.jpexs.decompiler.flash.helpers.NulWriter; import com.jpexs.decompiler.flash.helpers.hilight.Highlighting; import com.jpexs.decompiler.flash.tags.Tag; @@ -510,4 +512,94 @@ public class ScriptPack extends AS3ClassTreeItem { ((Tag) abc.parentTag).setModified(true); } + + public void injectPCodeDebugInfo(int abcIndex) { + + Map bodyToIdentifier = new HashMap<>(); + + try { + CachedDecompilation decompiled = SWF.getCached(this); + String txt = decompiled.text; + txt = txt.replace("\r", ""); + + for (int i = 0; i < txt.length(); i++) { + blk: + { + Highlighting sh = Highlighting.searchPos(decompiled.specialHilights, i); + + Highlighting cls = Highlighting.searchPos(decompiled.classHilights, i); + Highlighting trt = Highlighting.searchPos(decompiled.traitHilights, i); + Highlighting method = Highlighting.searchPos(decompiled.methodHilights, i); + if (method == null) { + break blk; + } + + int classIndex = cls == null ? -1 : (int) cls.getProperties().index; + int methodIndex = (int) method.getProperties().index; + int bodyIndex = abc.findBodyIndex(methodIndex); + if (bodyIndex == -1) { + break blk; + } + + Trait trait; + int traitIndex = -10; + if (trt != null && cls != null) { + traitIndex = (int) trt.getProperties().index; + + trait = abc.findTraitByTraitId(classIndex, traitIndex); + if (((trait instanceof TraitMethodGetterSetter) && (((TraitMethodGetterSetter) trait).method_info != methodIndex)) + || ((trait instanceof TraitFunction) && (((TraitFunction) trait).method_info != methodIndex))) { + continue; //inner anonymous function - ignore. TODO: make work + } + } + bodyToIdentifier.put(bodyIndex, "abc:" + abcIndex + ",script:" + scriptIndex + ",class:" + classIndex + ",trait:" + traitIndex + ",method:" + methodIndex + ",body:" + bodyIndex); + } + } + } catch (InterruptedException ex) { + Logger.getLogger(ScriptPack.class.getName()).log(Level.SEVERE, "Cannot decompile", ex); + } + + int scriptInitBody = abc.findBodyIndex(abc.script_info.get(scriptIndex).init_index); + + if (!bodyToIdentifier.containsKey(scriptInitBody)) { + bodyToIdentifier.put(scriptInitBody, "abc:" + abcIndex + ",script:" + scriptIndex + ",class:-1,trait:-3,method:" + abc.script_info.get(scriptIndex).init_index); + } + + String pkg = path.packageStr.toString(); + String cls = path.className; + + for (int bodyIndex : bodyToIdentifier.keySet()) { + String bodyName = bodyToIdentifier.get(bodyIndex); + + MethodBody b = abc.bodies.get(bodyIndex); + List list = b.getCode().code; + + int siz = list.size(); + + for (int i = 0; i < siz; i++) { + b.insertInstruction(i * 2, new AVM2Instruction(0, AVM2Instructions.DebugLine, new int[]{i + 1})); + } + for (int i = 1 /*odd, even are new debuglines*/; i < list.size(); i += 2) { + if (list.get(i).definition instanceof DebugLineIns) { + b.removeInstruction(i); + b.removeInstruction(i - 1); //remove its new debugline too + i -= 2; //for loop to work correctly + } else if (list.get(i).definition instanceof DebugFileIns) { + b.removeInstruction(i); + b.removeInstruction(i - 1); + i -= 2; + } else if (list.get(i).definition instanceof DebugIns) { + b.removeInstruction(i); + b.removeInstruction(i - 1); + i -= 2; + } + } + String filename = "#PCODE " + bodyName + ";" + pkg.replace(".", File.separator) + ";" + cls + ".as"; + + b.insertInstruction(0, new AVM2Instruction(0, AVM2Instructions.DebugFile, new int[]{abc.constants.getStringId(filename, true)})); + b.setModified(); + } + + ((Tag) abc.parentTag).setModified(true); + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java index 01416c5df..9e793d649 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java @@ -1263,7 +1263,7 @@ public class AVM2Code implements Cloneable { if (!ins.isIgnored()) { if (markOffsets) { - writer.append("", ofs); + writer.append("", ofs, ins.getFileOffset()); } writer.appendNoHilight(ins.toStringNoAddress(constants, new ArrayList<>())); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/AVM2Instruction.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/AVM2Instruction.java index 667714a6a..7ae4f13cd 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/AVM2Instruction.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/AVM2Instruction.java @@ -57,6 +57,11 @@ public class AVM2Instruction implements Cloneable, GraphSourceItem { private String file; + @Override + public long getFileOffset() { + return -1; + } + @Override public long getLineOffset() { return getOffset(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java index 85e508837..7511d7f4d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java @@ -375,6 +375,11 @@ public abstract class Action implements GraphSourceItem { return baos2.toByteArray(); } + @Override + public long getFileOffset() { + return fileOffset; + } + /** * Converts list of Actions to bytes * @@ -602,7 +607,7 @@ public abstract class Action implements GraphSourceItem { //lastPush = false; } - writer.append("", offset); + writer.append("", offset, a.getFileOffset()); int fixBranch = -1; if (a instanceof ActionIf) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java index d875277e9..00217aaf6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java @@ -337,7 +337,7 @@ public class ActionPush extends Action { if (pos > 0) { writer.appendNoHilight(" "); } - writer.append(toString(i), getAddress() + pos + 1); + writer.append(toString(i), getAddress() + pos + 1, getFileOffset()); pos++; } return writer; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/FileTextWriter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/FileTextWriter.java index 84168cf2f..144a1eb25 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/FileTextWriter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/FileTextWriter.java @@ -65,7 +65,7 @@ public class FileTextWriter extends GraphTextWriter implements AutoCloseable { } @Override - public FileTextWriter append(String str, long offset) { + public FileTextWriter append(String str, long offset, long fileOffset) { writeToFile(str); return this; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/GraphTextWriter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/GraphTextWriter.java index 3c3715559..5c2139820 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/GraphTextWriter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/GraphTextWriter.java @@ -171,7 +171,7 @@ public abstract class GraphTextWriter { public abstract GraphTextWriter append(String str); - public abstract GraphTextWriter append(String str, long offset); + public abstract GraphTextWriter append(String str, long offset, long fileOffset); public abstract GraphTextWriter appendNoHilight(int i); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/HighlightedTextWriter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/HighlightedTextWriter.java index be4f44013..778ca10f2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/HighlightedTextWriter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/HighlightedTextWriter.java @@ -202,6 +202,7 @@ public class HighlightedTextWriter extends GraphTextWriter { ndata.merge(itemPos.data); ndata.merge(data); ndata.offset = src.getOffset() + pos; + ndata.fileOffset = src.getFileOffset(); if (itemPos.startLineItem != null) { ndata.firstLineOffset = itemPos.startLineItem.getLineOffset(); } @@ -217,11 +218,12 @@ public class HighlightedTextWriter extends GraphTextWriter { } @Override - public HighlightedTextWriter append(String str, long offset) { + public HighlightedTextWriter append(String str, long offset, long fileOffset) { Highlighting h = null; if (hilight) { HighlightData data = new HighlightData(); data.offset = offset; + data.fileOffset = fileOffset; h = new Highlighting(sb.length() - newLineCount, data, HighlightType.OFFSET, str); instructionHilights.add(h); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/NulWriter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/NulWriter.java index 6594b74fb..0d0510335 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/NulWriter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/NulWriter.java @@ -132,7 +132,7 @@ public class NulWriter extends GraphTextWriter { } @Override - public NulWriter append(String str, long offset) { + public NulWriter append(String str, long offset, long fileOffset) { stringAdded = true; return this; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/hilight/HighlightData.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/hilight/HighlightData.java index 52fcda66e..a33e301b8 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/hilight/HighlightData.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/hilight/HighlightData.java @@ -39,6 +39,8 @@ public class HighlightData implements Cloneable, Serializable { public long offset; + public long fileOffset = -1; + public long firstLineOffset = -1; public int regIndex = -1; @@ -46,7 +48,8 @@ public class HighlightData implements Cloneable, Serializable { public boolean isEmpty() { return !declaration && declaredType == null && localName == null && subtype == null && specialValue == null - && index == 0 && offset == 0 && regIndex == -1 && firstLineOffset == -1; + && index == 0 && offset == 0 && regIndex == -1 && firstLineOffset == -1 + && fileOffset == -1; } public void merge(HighlightData data) { @@ -80,6 +83,9 @@ public class HighlightData implements Cloneable, Serializable { if (data.firstLineOffset != -1) { firstLineOffset = data.firstLineOffset; } + if (data.fileOffset != -1) { + fileOffset = data.fileOffset; + } } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/hilight/Highlighting.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/hilight/Highlighting.java index 609f7c947..9bf93f11f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/hilight/Highlighting.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/hilight/Highlighting.java @@ -100,7 +100,7 @@ public class Highlighting implements Serializable { continue; } } - if (pos == -1 || (pos >= h.startPos && (pos < h.startPos + h.len))) { + if (pos == -1 || (pos >= h.startPos && ((h.len == 0 && pos == h.startPos) || pos < h.startPos + h.len))) { if (ret == null || h.startPos > ret.startPos) { //get the closest one ret = h; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphSourceItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphSourceItem.java index 7436dfb8c..a56175c1c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphSourceItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphSourceItem.java @@ -29,6 +29,8 @@ public interface GraphSourceItem extends Serializable, Cloneable { public int getStackPushCount(BaseLocalData localData, TranslateStack stack); + public long getFileOffset(); + public boolean isJump(); public boolean isBranch(); diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config.properties index 27fed0148..c4a881035 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config.properties @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = Toggle Token Marker # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_ca.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_ca.properties index cd6d1c625..9fa67bc72 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_ca.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_ca.properties @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = Mostra/Amaga el Marcador Testimoni # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_cs.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_cs.properties index 9e030de20..d89542e71 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_cs.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_cs.properties @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = P\u0159epnout ozna\u010dova\u010d Token\u0 # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_de.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_de.properties index ec81ece51..c3fabc946 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_de.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_de.properties @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = Markierung umschalten # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_es.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_es.properties index ab20dda7a..e9ba71d78 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_es.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_es.properties @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = Alternar marcador de Token # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_fr.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_fr.properties index 5ab9bdc01..ced782bdf 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_fr.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_fr.properties @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = Ajouter / Supprimer un marqueur # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_hu.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_hu.properties index 67b2a9493..eed324bf0 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_hu.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_hu.properties @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = Token Marker megjelen\u00edt\u00e9se/elrej # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_it.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_it.properties index 1cd3d595b..6a746980f 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_it.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_it.properties @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = Marcatore token on/off # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_nl.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_nl.properties index 937ef1ae3..33d49a9da 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_nl.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_nl.properties @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = Token markering inschakelen # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_pl.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_pl.properties index 700dce487..c1d76bdff 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_pl.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_pl.properties @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = Prze\u0142\u0105cz znacznik \u017cetonu # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_pt.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_pt.properties index ab20dda7a..e9ba71d78 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_pt.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_pt.properties @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = Alternar marcador de Token # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_pt_BR.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_pt_BR.properties index e957d1969..d0298a045 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_pt_BR.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_pt_BR.properties @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = Mudar o alternador de Token # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_ru.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_ru.properties index aa277decf..89ffa0b5b 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_ru.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_ru.properties @@ -1,4 +1,4 @@ -Action.toggle-token-marker.MenuText = \u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0442\u043E\u043A\u0435\u043D\u043E\u0432 +Action.toggle-token-marker.MenuText = \u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 # !!!! FFDec translators - please do not edit anything below this line !!! #========================================================================== @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = \u0412\u043A\u043B\u044E\u0447\u0438\u0442 # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_sv.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_sv.properties index dfc024098..f860aaa31 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_sv.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_sv.properties @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = V\u00e4xla Tecken Mark\u00f6r # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_uk.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_uk.properties index de5afdd63..3a2446d2a 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_uk.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_uk.properties @@ -1,4 +1,4 @@ -Action.toggle-token-marker.MenuText = \u0423\u0432\u0456\u043C\u043A\u043D\u0443\u0442\u0438 \u0432\u0438\u0434\u0456\u043B\u0435\u043D\u043D\u044F \u0442\u043E\u043A\u0435\u043D\u0456\u0432 +Action.toggle-token-marker.MenuText = \u0423\u0432\u0456\u043c\u043a\u043d\u0443\u0442\u0438 \u0432\u0438\u0434\u0456\u043b\u0435\u043d\u043d\u044f \u0442\u043e\u043a\u0435\u043d\u0456\u0432 # !!!! FFDec translators - please do not edit anything below this line !!! #========================================================================== @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = \u0423\u0432\u0456\u043C\u043A\u043D\u0443 # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_zh.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_zh.properties index da4f6be66..f76584018 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_zh.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_zh.properties @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = \u5207\u6362\u4ee4\u724c\u6807\u8bb0 # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config.properties index 294e05903..81f1e2473 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config.properties @@ -8,7 +8,7 @@ Action.toggle-token-marker.MenuText = Toggle Token Marker # JavaSyntaxKit Specific properties. # Components = jsyntaxpane.components.PairsMarker, \ - jsyntaxpane.components.LineNumbersRuler, \ + jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_ca.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_ca.properties index 573b1c04b..7b45e74f7 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_ca.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_ca.properties @@ -8,7 +8,7 @@ Action.toggle-token-marker.MenuText = Mostra/Amaga el Marcador Testimoni # JavaSyntaxKit Specific properties. # Components = jsyntaxpane.components.PairsMarker, \ - jsyntaxpane.components.LineNumbersRuler, \ + jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_cs.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_cs.properties index 14f9e3fce..87fd06a6e 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_cs.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_cs.properties @@ -8,7 +8,7 @@ Action.toggle-token-marker.MenuText = P\u0159epnout ozna\u010dova\u010d Token\u0 # JavaSyntaxKit Specific properties. # Components = jsyntaxpane.components.PairsMarker, \ - jsyntaxpane.components.LineNumbersRuler, \ + jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_de.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_de.properties index 47aa46bf3..c3e093d47 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_de.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_de.properties @@ -8,7 +8,7 @@ Action.toggle-token-marker.MenuText = Markierung umschalten # JavaSyntaxKit Specific properties. # Components = jsyntaxpane.components.PairsMarker, \ - jsyntaxpane.components.LineNumbersRuler, \ + jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_es.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_es.properties index 540f6533a..8813e5219 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_es.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_es.properties @@ -1,45 +1,45 @@ -Action.combo-completion.MenuText = Seleccionar una instrucci\u00f3n -Action.toggle-token-marker.MenuText = Alternar marcador de Token - -# !!!! FFDec translators - please do not edit anything below this line !!! -#========================================================================== - -# -# JavaSyntaxKit Specific properties. -# -Components = jsyntaxpane.components.PairsMarker, \ - jsyntaxpane.components.LineNumbersRuler, \ - jsyntaxpane.components.TokenMarker -TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 -# -# Performs single color selection (Default = false) -# -SingleColorSelect = true -RightMarginColumn = 80 -RightMarginColor = 0xdddddd -# -# Java Actions -Action.indent.WordRegex=\\w+|\\/(\\*)+ -#Action.parenthesis = jsyntaxpane.actions.PairAction, typed ( -Action.toggle-token-marker = jsyntaxpane.actions.ToggleComponentAction, control F3 -Action.toggle-token-marker.Component = jsyntaxpane.components.TokenMarker -#Action.brackets = jsyntaxpane.actions.PairAction, typed [ -Action.quotes = jsyntaxpane.actions.PairAction, typed ' -Action.double-quotes = jsyntaxpane.actions.PairAction, typed " -# For completions, you have to define the Action (key to trigger completions): -Action.combo-completion = jsyntaxpane.actions.ComboCompletionAction, control SPACE -Action.combo-completion.ItemsURL=${class_path}/combocompletions.txt -# -# These are the completions to be in the IntelliSense completion dialog -# comma separated values. -# Vertical bars: if there is one, it will position the cursor. If there are -# two, they will be start and end of selection -PopupMenu = \ - ${DEFAULT_EDIT_MENU} , \ - - , \ - toggle-lines , \ - toggle-token-marker - -Style.KEYWORD = 0x0000ff, 1 -Style.KEYWORD2 = 0x007f7f, 1 -Style.OPERATOR = 0x7f007f, 0 +Action.combo-completion.MenuText = Seleccionar una instrucci\u00f3n +Action.toggle-token-marker.MenuText = Alternar marcador de Token + +# !!!! FFDec translators - please do not edit anything below this line !!! +#========================================================================== + +# +# JavaSyntaxKit Specific properties. +# +Components = jsyntaxpane.components.PairsMarker, \ + jsyntaxpane.components.LineNumbersBreakpointsRuler, \ + jsyntaxpane.components.TokenMarker +TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 +# +# Performs single color selection (Default = false) +# +SingleColorSelect = true +RightMarginColumn = 80 +RightMarginColor = 0xdddddd +# +# Java Actions +Action.indent.WordRegex=\\w+|\\/(\\*)+ +#Action.parenthesis = jsyntaxpane.actions.PairAction, typed ( +Action.toggle-token-marker = jsyntaxpane.actions.ToggleComponentAction, control F3 +Action.toggle-token-marker.Component = jsyntaxpane.components.TokenMarker +#Action.brackets = jsyntaxpane.actions.PairAction, typed [ +Action.quotes = jsyntaxpane.actions.PairAction, typed ' +Action.double-quotes = jsyntaxpane.actions.PairAction, typed " +# For completions, you have to define the Action (key to trigger completions): +Action.combo-completion = jsyntaxpane.actions.ComboCompletionAction, control SPACE +Action.combo-completion.ItemsURL=${class_path}/combocompletions.txt +# +# These are the completions to be in the IntelliSense completion dialog +# comma separated values. +# Vertical bars: if there is one, it will position the cursor. If there are +# two, they will be start and end of selection +PopupMenu = \ + ${DEFAULT_EDIT_MENU} , \ + - , \ + toggle-lines , \ + toggle-token-marker + +Style.KEYWORD = 0x0000ff, 1 +Style.KEYWORD2 = 0x007f7f, 1 +Style.OPERATOR = 0x7f007f, 0 diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_fr.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_fr.properties index 9218480d2..b0b933341 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_fr.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_fr.properties @@ -8,7 +8,7 @@ Action.toggle-token-marker.MenuText = Ajouter / Supprimer un marqueur # JavaSyntaxKit Specific properties. # Components = jsyntaxpane.components.PairsMarker, \ - jsyntaxpane.components.LineNumbersRuler, \ + jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_hu.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_hu.properties index 98027a9d7..4e82a94d9 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_hu.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_hu.properties @@ -8,7 +8,7 @@ Action.toggle-token-marker.MenuText = Token Marker megjelen\u00edt\u00e9se/elrej # JavaSyntaxKit Specific properties. # Components = jsyntaxpane.components.PairsMarker, \ - jsyntaxpane.components.LineNumbersRuler, \ + jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_it.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_it.properties index 9019bc14f..4af861aa6 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_it.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_it.properties @@ -8,7 +8,7 @@ Action.toggle-token-marker.MenuText = Marcatore token on/off # JavaSyntaxKit Specific properties. # Components = jsyntaxpane.components.PairsMarker, \ - jsyntaxpane.components.LineNumbersRuler, \ + jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_nl.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_nl.properties index 84b012af7..8eab3bfa1 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_nl.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_nl.properties @@ -8,7 +8,7 @@ Action.toggle-token-marker.MenuText = Token markering inschakelen # JavaSyntaxKit Specific properties. # Components = jsyntaxpane.components.PairsMarker, \ - jsyntaxpane.components.LineNumbersRuler, \ + jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_pl.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_pl.properties index 038072a78..8c36966e7 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_pl.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_pl.properties @@ -8,7 +8,7 @@ Action.toggle-token-marker.MenuText = Prze\u0142\u0105cz znacznik \u017cetonu # JavaSyntaxKit Specific properties. # Components = jsyntaxpane.components.PairsMarker, \ - jsyntaxpane.components.LineNumbersRuler, \ + jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_pt.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_pt.properties index cd88b6c7e..f64722694 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_pt.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_pt.properties @@ -1,45 +1,45 @@ -Action.combo-completion.MenuText = Escolha um instuc\u00e7\u00e3o -Action.toggle-token-marker.MenuText = Alternar marcador de token - -# !!!! FFDec translators - please do not edit anything below this line !!! -#========================================================================== - -# -# JavaSyntaxKit Specific properties. -# -Components = jsyntaxpane.components.PairsMarker, \ - jsyntaxpane.components.LineNumbersRuler, \ - jsyntaxpane.components.TokenMarker -TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 -# -# Performs single color selection (Default = false) -# -SingleColorSelect = true -RightMarginColumn = 80 -RightMarginColor = 0xdddddd -# -# Java Actions -Action.indent.WordRegex=\\w+|\\/(\\*)+ -#Action.parenthesis = jsyntaxpane.actions.PairAction, typed ( -Action.toggle-token-marker = jsyntaxpane.actions.ToggleComponentAction, control F3 -Action.toggle-token-marker.Component = jsyntaxpane.components.TokenMarker -#Action.brackets = jsyntaxpane.actions.PairAction, typed [ -Action.quotes = jsyntaxpane.actions.PairAction, typed ' -Action.double-quotes = jsyntaxpane.actions.PairAction, typed " -# For completions, you have to define the Action (key to trigger completions): -Action.combo-completion = jsyntaxpane.actions.ComboCompletionAction, control SPACE -Action.combo-completion.ItemsURL=${class_path}/combocompletions.txt -# -# These are the completions to be in the IntelliSense completion dialog -# comma separated values. -# Vertical bars: if there is one, it will position the cursor. If there are -# two, they will be start and end of selection -PopupMenu = \ - ${DEFAULT_EDIT_MENU} , \ - - , \ - toggle-lines , \ - toggle-token-marker - -Style.KEYWORD = 0x0000ff, 1 -Style.KEYWORD2 = 0x007f7f, 1 -Style.OPERATOR = 0x7f007f, 0 +Action.combo-completion.MenuText = Escolha um instuc\u00e7\u00e3o +Action.toggle-token-marker.MenuText = Alternar marcador de token + +# !!!! FFDec translators - please do not edit anything below this line !!! +#========================================================================== + +# +# JavaSyntaxKit Specific properties. +# +Components = jsyntaxpane.components.PairsMarker, \ + jsyntaxpane.components.LineNumbersBreakpointsRuler, \ + jsyntaxpane.components.TokenMarker +TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 +# +# Performs single color selection (Default = false) +# +SingleColorSelect = true +RightMarginColumn = 80 +RightMarginColor = 0xdddddd +# +# Java Actions +Action.indent.WordRegex=\\w+|\\/(\\*)+ +#Action.parenthesis = jsyntaxpane.actions.PairAction, typed ( +Action.toggle-token-marker = jsyntaxpane.actions.ToggleComponentAction, control F3 +Action.toggle-token-marker.Component = jsyntaxpane.components.TokenMarker +#Action.brackets = jsyntaxpane.actions.PairAction, typed [ +Action.quotes = jsyntaxpane.actions.PairAction, typed ' +Action.double-quotes = jsyntaxpane.actions.PairAction, typed " +# For completions, you have to define the Action (key to trigger completions): +Action.combo-completion = jsyntaxpane.actions.ComboCompletionAction, control SPACE +Action.combo-completion.ItemsURL=${class_path}/combocompletions.txt +# +# These are the completions to be in the IntelliSense completion dialog +# comma separated values. +# Vertical bars: if there is one, it will position the cursor. If there are +# two, they will be start and end of selection +PopupMenu = \ + ${DEFAULT_EDIT_MENU} , \ + - , \ + toggle-lines , \ + toggle-token-marker + +Style.KEYWORD = 0x0000ff, 1 +Style.KEYWORD2 = 0x007f7f, 1 +Style.OPERATOR = 0x7f007f, 0 diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_pt_BR.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_pt_BR.properties index 5707f3175..8600db268 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_pt_BR.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_pt_BR.properties @@ -8,7 +8,7 @@ Action.toggle-token-marker.MenuText = Mudar o alternador de Token # JavaSyntaxKit Specific properties. # Components = jsyntaxpane.components.PairsMarker, \ - jsyntaxpane.components.LineNumbersRuler, \ + jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_ru.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_ru.properties index e3e01c5b7..3255c6a3d 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_ru.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_ru.properties @@ -8,7 +8,7 @@ Action.toggle-token-marker.MenuText = \u0412\u043a\u043b\u044e\u0447\u0438\u0442 # JavaSyntaxKit Specific properties. # Components = jsyntaxpane.components.PairsMarker, \ - jsyntaxpane.components.LineNumbersRuler, \ + jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_sv.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_sv.properties index 0c17cbe5d..800cd68ff 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_sv.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_sv.properties @@ -8,7 +8,7 @@ Action.toggle-token-marker.MenuText = V\u00e4xla Tecken Mark\u00f6r # JavaSyntaxKit Specific properties. # Components = jsyntaxpane.components.PairsMarker, \ - jsyntaxpane.components.LineNumbersRuler, \ + jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_uk.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_uk.properties index 9dec78fe6..aa42bc4f9 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_uk.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_uk.properties @@ -8,7 +8,7 @@ Action.toggle-token-marker.MenuText = \u0423\u0432\u0456\u043c\u043a\u043d\u0443 # JavaSyntaxKit Specific properties. # Components = jsyntaxpane.components.PairsMarker, \ - jsyntaxpane.components.LineNumbersRuler, \ + jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_zh.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_zh.properties index 96cc1dbed..2ac2e11c5 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_zh.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_zh.properties @@ -8,7 +8,7 @@ Action.toggle-token-marker.MenuText = \u5207\u6362\u4ee4\u724c\u6807\u8bb0 # JavaSyntaxKit Specific properties. # Components = jsyntaxpane.components.PairsMarker, \ - jsyntaxpane.components.LineNumbersRuler, \ + jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config.properties index 40f393f26..cca864c47 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config.properties @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = Toggle Token Marker # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_ca.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_ca.properties index f3b01a55c..993a7c90f 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_ca.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_ca.properties @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = Mostra/Amaga el Marcador Testimoni # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_cs.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_cs.properties index b50e013fb..3dc5e8611 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_cs.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_cs.properties @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = P\u0159epnout ozna\u010dova\u010d Token\u0 # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_de.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_de.properties index 12c43ccc1..7966eacb1 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_de.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_de.properties @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = Markierung umschalten # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_es.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_es.properties index cbab76caf..c460f99f1 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_es.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_es.properties @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = Alternar marcador de Token # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_fr.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_fr.properties index 101ba01a7..9cb5c26a0 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_fr.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_fr.properties @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = Ajouter / Supprimer un marqueur # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_hu.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_hu.properties index 7b9b2b4f1..e928c9204 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_hu.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_hu.properties @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = Token Marker megjelen\u00edt\u00e9se/elrej # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_it.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_it.properties index dfb0af57f..a1713ce06 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_it.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_it.properties @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = Marcatore token on/off # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_nl.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_nl.properties index a94639e9f..f98f42c61 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_nl.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_nl.properties @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = Token markering inschakelen # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_pl.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_pl.properties index bb474ca0a..e7847392f 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_pl.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_pl.properties @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = Prze\u0142\u0105cz znacznik \u017cetonu # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_pt.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_pt.properties index 947369a54..80d489c85 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_pt.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_pt.properties @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = Alternar o marcador de token # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_pt_BR.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_pt_BR.properties index d45858b59..1546f435e 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_pt_BR.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_pt_BR.properties @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = Mudar o alternador de Token # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_ru.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_ru.properties index 9ac727cc2..a4eb87187 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_ru.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_ru.properties @@ -1,4 +1,4 @@ -Action.toggle-token-marker.MenuText = \u0412\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u0442\u043E\u043A\u0435\u043D\u043E\u0432 +Action.toggle-token-marker.MenuText = \u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 # !!!! FFDec translators - please do not edit anything below this line !!! #========================================================================== @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = \u0412\u043A\u043B\u044E\u0447\u0438\u0442 # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_sv.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_sv.properties index e2aac3d0a..40eb094be 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_sv.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_sv.properties @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = V\u00e4xla Tecken Mark\u00f6r # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_uk.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_uk.properties index 961bde81c..8fe97baea 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_uk.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_uk.properties @@ -1,4 +1,4 @@ -Action.toggle-token-marker.MenuText = \u0423\u0432\u0456\u043C\u043A\u043D\u0443\u0442\u0438 \u0432\u0438\u0434\u0456\u043B\u0435\u043D\u043D\u044F \u0442\u043E\u043A\u0435\u043D\u0456\u0432 +Action.toggle-token-marker.MenuText = \u0423\u0432\u0456\u043c\u043a\u043d\u0443\u0442\u0438 \u0432\u0438\u0434\u0456\u043b\u0435\u043d\u043d\u044f \u0442\u043e\u043a\u0435\u043d\u0456\u0432 # !!!! FFDec translators - please do not edit anything below this line !!! #========================================================================== @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = \u0423\u0432\u0456\u043C\u043A\u043D\u0443 # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_zh.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_zh.properties index dbccdff70..27c8ee23b 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_zh.properties +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_zh.properties @@ -6,7 +6,7 @@ Action.toggle-token-marker.MenuText = \u5207\u6362\u4ee4\u724c\u6807\u8bb0 # # JavaSyntaxKit Specific properties. # -Components = jsyntaxpane.components.LineNumbersRuler, \ +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ jsyntaxpane.components.TokenMarker TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 # diff --git a/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java b/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java index 7e6d5560f..d99c12301 100644 --- a/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java +++ b/src/com/jpexs/decompiler/flash/console/CommandLineArgumentParser.java @@ -459,10 +459,12 @@ public class CommandLineArgumentParser { } if (filter == null || filter.equals("enabledebugging")) { - out.println(" " + (cnt++) + ") -enabledebugging [-injectas3] "); + out.println(" " + (cnt++) + ") -enabledebugging [-injectas3|-generateswd] [-pcode] "); out.println(" ...Enables debugging for and saves result to "); - out.println(" ...When optional -injectas3 parameter specified, debugfile and debugline instructions are injected into the code to match decompiled source."); - out.println(" ...WARNING: not everything works yet"); + out.println(" ...-injectas3 (optional) causes debugfile and debugline instructions to be injected into the code to match decompiled/pcode source."); + out.println(" ...-generateswd (optional) parameter creates SWD file needed for AS1/2 debugging. for , is generated"); + out.println(" ...-pcode (optional) parameter specified after -injectas3 or -generateswd causes lines to be handled as lines in P-code => All P-code lines are injected, etc."); + out.println(" ...WARNING: Injected/SWD script filenames may be different than from standard compiler"); } printCmdLineUsageExamples(out, filter); @@ -522,6 +524,7 @@ public class CommandLineArgumentParser { if (filter == null || filter.equals("enabledebugging")) { out.println("java -jar ffdec.jar -enabledebugging -injectas3 myas3file.swf myas3file_debug.swf"); + out.println("java -jar ffdec.jar -enabledebugging -generateswd myas2file.swf myas2file_debug.swf"); exampleFound = true; } @@ -2788,7 +2791,16 @@ public class CommandLineArgumentParser { } boolean injectas3 = false; + boolean doPCode = false; + boolean generateSwd = false; String file = args.pop(); + if (file.equals("-generateswd")) { + if (args.size() < 2) { + badArguments("enabledebugging"); + } + file = args.pop(); + generateSwd = true; + } if (file.equals("-injectas3")) { if (args.size() < 2) { badArguments("enabledebugging"); @@ -2796,16 +2808,53 @@ public class CommandLineArgumentParser { file = args.pop(); injectas3 = true; } + if (file.equals("-pcode")) { + if (args.size() < 2) { + badArguments("enabledebugging"); + } + doPCode = true; + file = args.pop(); + } String outfile = args.pop(); try { System.out.print("Working..."); FileInputStream fis = new FileInputStream(file); SWF swf = new SWF(fis, Configuration.parallelSpeedUp.get()); fis.close(); - swf.enableDebugging(injectas3, new File(outfile).getParentFile()); + if (swf.isAS3()) { + swf.enableDebugging(injectas3, new File(outfile).getParentFile(), doPCode); + } else { + swf.enableDebugging(); + } FileOutputStream fos = new FileOutputStream(outfile); swf.saveTo(fos); fos.close(); + if (!swf.isAS3()) { + if (generateSwd) { + fis = new FileInputStream(outfile); + swf = new SWF(fis, Configuration.parallelSpeedUp.get()); + fis.close(); + String outSwd = outfile; + if (outSwd.toLowerCase().endsWith(".swf")) { + outSwd = outSwd.substring(0, outSwd.length() - 4) + ".swd"; + } else { + outSwd = outSwd + ".swd"; + } + if (doPCode) { + if (!swf.generatePCodeSwdFile(new File(outSwd), new HashMap<>())) { + System.err.println("Generating SWD failed"); + } + } else { + if (!swf.generateSwdFile(new File(outSwd), new HashMap<>())) { + System.err.println("Generating SWD failed"); + } + } + } + } else { + if (generateSwd) { + System.err.println("WARNING: Cannot generate SWD for AS3 file"); + } + } System.out.println("OK"); } catch (FileNotFoundException ex) { Logger.getLogger(CommandLineArgumentParser.class.getName()).log(Level.SEVERE, "Cannot read " + file); diff --git a/src/com/jpexs/decompiler/flash/gui/DebugPanel.java b/src/com/jpexs/decompiler/flash/gui/DebugPanel.java index ac1866fd6..cef9729fb 100644 --- a/src/com/jpexs/decompiler/flash/gui/DebugPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/DebugPanel.java @@ -143,7 +143,7 @@ public class DebugPanel extends JPanel { } @Override - public void breakAt(String scriptName, int line) { + public void breakAt(String scriptName, int line, int classIndex, int traitIndex, int methodIndex) { View.execInEventDispatch(new Runnable() { @Override diff --git a/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java b/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java index 270a2c56a..84c913381 100644 --- a/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java +++ b/src/com/jpexs/decompiler/flash/gui/DebuggerHandler.java @@ -73,7 +73,11 @@ public class DebuggerHandler implements DebugConnectionListener { private Map modulePaths = new HashMap<>(); - private Map classToModule = new HashMap<>(); + private Map scriptToModule = new HashMap<>(); + + private Map moduleToTraitIndex = new HashMap<>(); + private Map moduleToClassIndex = new HashMap<>(); + private Map moduleToMethodIndex = new HashMap<>(); private Map> toAddBPointMap = new HashMap<>(); @@ -127,7 +131,7 @@ public class DebuggerHandler implements DebugConnectionListener { } } - public synchronized Set getBreakPoints(String scriptName) { + public synchronized Set getBreakPoints(String scriptName, boolean onlyValid) { Set lines = new TreeSet<>(); if (confirmedPointMap.containsKey(scriptName)) { lines.addAll(confirmedPointMap.get(scriptName)); @@ -135,6 +139,9 @@ public class DebuggerHandler implements DebugConnectionListener { if (toAddBPointMap.containsKey(scriptName)) { lines.addAll(toAddBPointMap.get(scriptName)); } + if (!onlyValid && invalidBreakPointMap.containsKey(scriptName)) { + lines.addAll(invalidBreakPointMap.get(scriptName)); + } return lines; } @@ -145,6 +152,12 @@ public class DebuggerHandler implements DebugConnectionListener { } toAddBPointMap.get(scriptName).addAll(confirmedPointMap.get(scriptName)); } + for (String scriptName : invalidBreakPointMap.keySet()) { + if (!toAddBPointMap.containsKey(scriptName)) { + toAddBPointMap.put(scriptName, new TreeSet<>()); + } + toAddBPointMap.get(scriptName).addAll(invalidBreakPointMap.get(scriptName)); + } confirmedPointMap.clear(); invalidBreakPointMap.clear(); } @@ -276,7 +289,7 @@ public class DebuggerHandler implements DebugConnectionListener { public static interface BreakListener { - public void breakAt(String scriptName, int line); + public void breakAt(String scriptName, int line, int classIndex, int traitIndex, int methodIndex); public void doContinue(); } @@ -313,8 +326,8 @@ public class DebuggerHandler implements DebugConnectionListener { } public synchronized int moduleIdOf(String pack) { - if (classToModule.containsKey(pack)) { - return classToModule.get(pack); + if (scriptToModule.containsKey(pack)) { + return scriptToModule.get(pack); } return -1; } @@ -349,13 +362,17 @@ public class DebuggerHandler implements DebugConnectionListener { toAddBPointMap.get(scriptName).addAll(confirmedPointMap.get(scriptName)); } confirmedPointMap.clear(); + for (String scriptName : invalidBreakPointMap.keySet()) { + if (!toAddBPointMap.containsKey(scriptName)) { + toAddBPointMap.put(scriptName, new TreeSet<>()); + } + toAddBPointMap.get(scriptName).addAll(invalidBreakPointMap.get(scriptName)); + } + invalidBreakPointMap.clear(); } for (ConnectionListener l : clisteners) { l.disconnected(); } - /*for (BreakListener l : breakListeners) { - l.breakAt(); - }*/ } public synchronized boolean isConnected() { @@ -440,30 +457,36 @@ public class DebuggerHandler implements DebugConnectionListener { } modulePaths = new HashMap<>(); - classToModule = new HashMap<>(); + scriptToModule = new HashMap<>(); //Pattern patMainFrame = Pattern.compile("^Actions for Scene ([0-9]+): Frame ([0-9]+) of Layer Name .*$"); //Pattern patSymbol = Pattern.compile("^Actions for Symbol ([0-9]+): Frame ([0-9]+) of Layer Name .*$"); //Pattern patAS2 = Pattern.compile("^([^:]+): .*\\.as$"); Pattern patAS3 = Pattern.compile("^(.*);(.*);(.*)\\.as$"); + //"abc:" + abcIndex + ",script:" + scriptIndex + ",class:" + classIndex + ",trait:" + traitIndex + ",method:" + Pattern patAS3PCode = Pattern.compile("^#PCODE abc:([0-9]+),script:([0-9]+),class:(-?[0-9]+),trait:(-?[0-9]+),method:([0-9]+),body:([0-9]+);(.*)$"); + for (int file : moduleNames.keySet()) { String name = moduleNames.get(file); String[] parts = name.split(";"); Matcher m; - /*if ((m = patMainFrame.matcher(name)).matches()) { - name = "\\frame_" + m.group(2) + "\\DoAction"; - } else if ((m = patSymbol.matcher(name)).matches()) { - name = "\\DefineSprite(" + m.group(1) + ")\\frame_" + m.group(2) + "\\DoAction"; - } else if ((m = patAS2.matcher(name)).matches()) { - name = "\\_Packages\\" + m.group(1).replace(".", "\\"); - } else*/ if ((m = patAS3.matcher(name)).matches()) { String clsName = m.group(3); String pkg = m.group(2).replace("\\", "."); - name = DottedChain.parse(pkg).add(clsName).toString(); + m = patAS3PCode.matcher(name); + + if (m.matches()) { + moduleToClassIndex.put(file, Integer.parseInt(m.group(3))); + moduleToTraitIndex.put(file, Integer.parseInt(m.group(4))); + moduleToMethodIndex.put(file, Integer.parseInt(m.group(5))); + name = DottedChain.parse(pkg).add(clsName).toString(); + name = "#PCODE abc:" + m.group(1) + ",body:" + m.group(6) + ";" + name; + } else { + name = DottedChain.parse(pkg).add(clsName).toString(); + } } modulePaths.put(file, name); - classToModule.put(name, file); + scriptToModule.put(name, file); } //con.getMessage(InSetBreakpoint.class); @@ -577,7 +600,11 @@ public class DebuggerHandler implements DebugConnectionListener { frame = commands.getFrame(0); for (BreakListener l : breakListeners) { - l.breakAt(newBreakScriptName, message.line); + l.breakAt(newBreakScriptName, message.line, + moduleToClassIndex.containsKey(message.file) ? moduleToClassIndex.get(message.file) : -1, + moduleToTraitIndex.containsKey(message.file) ? moduleToTraitIndex.get(message.file) : -1, + moduleToMethodIndex.containsKey(message.file) ? moduleToMethodIndex.get(message.file) : -1 + ); } } catch (IOException ex) { @@ -654,9 +681,14 @@ public class DebuggerHandler implements DebugConnectionListener { markBreakPointInvalid(scriptName, line); } } + } else { + for (int line : toAddBPointMap.get(scriptName)) { + markBreakPointInvalid(scriptName, line); + } } } toAddBPointMap.clear(); + } Logger.getLogger(DebuggerHandler.class.getName()).log(Level.FINEST, "sending bps finished"); diff --git a/src/com/jpexs/decompiler/flash/gui/Main.java b/src/com/jpexs/decompiler/flash/gui/Main.java index 2d4cb7b9a..3a9496c74 100644 --- a/src/com/jpexs/decompiler/flash/gui/Main.java +++ b/src/com/jpexs/decompiler/flash/gui/Main.java @@ -81,6 +81,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; @@ -151,6 +152,8 @@ public class Main { private static boolean runProcessDebug; + private static boolean runProcessDebugPCode; + private static boolean inited = false; private static File runTempFile; @@ -180,6 +183,10 @@ public class Main { return runProcess != null && runProcessDebug; } + public static synchronized boolean isDebugPCode() { + return runProcessDebugPCode; + } + public static synchronized boolean isDebugConnected() { return getDebugHandler().isConnected(); } @@ -326,7 +333,7 @@ public class Main { } } - public static void runDebug(SWF swf) { + public static void runDebug(SWF swf, final boolean doPCode) { String flashVars = "";//key=val&key2=val2 String playerLocation = Configuration.playerDebugLocation.get(); if (playerLocation.isEmpty() || (!new File(playerLocation).exists())) { @@ -344,6 +351,7 @@ public class Main { } catch (Exception ex) { } + if (tempFile != null) { final File fTempFile = tempFile; CancellableWorker instrumentWorker = new CancellableWorker() { @@ -364,7 +372,7 @@ public class Main { if (instrSWF.isAS3() && Configuration.autoOpenLoadedSWFs.get()) { DebuggerTools.injectDebugLoader(instrSWF); } - instrSWF.enableDebugging(true, new File(".")); + instrSWF.enableDebugging(true, new File("."), true, doPCode); try (OutputStream fos = new BufferedOutputStream(new FileOutputStream(fTempFile))) { instrSWF.saveTo(fos); } @@ -378,8 +386,18 @@ public class Main { Logger.getLogger(MainFrameMenu.class.getName()).log(Level.SEVERE, null, ex); } if (instrSWF != null) { - File swdFile = new File(fTempFile.getAbsolutePath().replace(".swf", ".swd")); - instrSWF.generateSwdFile(swdFile, getPackBreakPoints(true)); + String swfFileName = fTempFile.getAbsolutePath(); + if (swfFileName.toLowerCase().endsWith(".swf")) { + swfFileName = swfFileName.substring(0, swfFileName.length() - 4) + ".swd"; + } else { + swfFileName = swfFileName + ".swd"; + } + File swdFile = new File(swfFileName); + if (doPCode) { + instrSWF.generatePCodeSwdFile(swdFile, getPackBreakPoints(true)); + } else { + instrSWF.generateSwdFile(swdFile, getPackBreakPoints(true)); + } } } } @@ -396,6 +414,7 @@ public class Main { synchronized (Main.class) { runTempFile = fTempFile; runProcessDebug = true; + runProcessDebugPCode = doPCode; } Main.stopWork(); Main.startDebugger(); @@ -450,8 +469,8 @@ public class Main { return getDebugHandler().getAllBreakPoints(validOnly); } - public synchronized static Set getScriptBreakPoints(String pack) { - return getDebugHandler().getBreakPoints(pack); + public synchronized static Set getScriptBreakPoints(String pack, boolean onlyValid) { + return getDebugHandler().getBreakPoints(pack, onlyValid); } public static DebuggerHandler getDebugHandler() { @@ -1349,12 +1368,12 @@ public class Main { } @Override - public void breakAt(String scriptName, int line) { + public void breakAt(String scriptName, int line, final int classIndex, final int traitIndex, final int methodIndex) { View.execInEventDispatch(new Runnable() { @Override public void run() { - mainFrame.getPanel().gotoClassLine(getMainFrame().getPanel().getCurrentSwf(), scriptName, line); + mainFrame.getPanel().gotoScriptLine(getMainFrame().getPanel().getCurrentSwf(), scriptName, line, classIndex, traitIndex, methodIndex); } }); } @@ -1368,7 +1387,7 @@ public class Main { @Override public void disconnected() { - + Main.mainFrame.getPanel().refreshBreakPoints(); } }); flashDebugger.addConnectionListener(debugHandler); diff --git a/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java b/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java index 64853e871..508f10dc7 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java +++ b/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java @@ -701,6 +701,7 @@ public abstract class MainFrameMenu implements MenuBuilder { setMenuEnabled("/file/start/run", swfSelected && !isRunningOrDebugging); setMenuEnabled("/file/start/debug", swfSelected && !isRunningOrDebugging); + setMenuEnabled("/file/start/debugpcode", swfSelected && !isRunningOrDebugging); setMenuEnabled("/file/start/stop", isRunningOrDebugging); setMenuEnabled("/debugging/debug/stop", isRunningOrDebugging); //same as previous @@ -779,6 +780,7 @@ public abstract class MainFrameMenu implements MenuBuilder { addMenuItem("/file/start/run", translate("menu.file.start.run"), "play32", this::runActionPerformed, PRIORITY_TOP, null, true, new HotKey("F6"), false); addMenuItem("/file/start/debug", translate("menu.file.start.debug"), "debug32", this::debugActionPerformed, PRIORITY_TOP, null, true, new HotKey("CTRL+F5"), false); addMenuItem("/file/start/stop", translate("menu.file.start.stop"), "stop32", this::stopActionPerformed, PRIORITY_TOP, null, true, null, false); + addMenuItem("/file/start/debugpcode", translate("menu.file.start.debugpcode"), "debug32", this::debugPCodeActionPerformed, PRIORITY_MEDIUM, null, true, null, false); finishMenu("/file/start"); addMenuItem("/file/view", translate("menu.view"), null, null, 0, null, false, null, false); @@ -1093,9 +1095,13 @@ public abstract class MainFrameMenu implements MenuBuilder { } public boolean debugActionPerformed(ActionEvent evt) { - Main.runDebug(swf); + Main.runDebug(swf, false); return true; + } + public boolean debugPCodeActionPerformed(ActionEvent evt) { + Main.runDebug(swf, true); + return true; } public boolean stopActionPerformed(ActionEvent evt) { diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index 1d072b982..f67c1a688 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -1533,12 +1533,30 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } } - public void gotoClassLine(SWF swf, String cls, int line) { - gotoScriptName(swf, cls); + public void gotoScriptLine(SWF swf, String scriptName, int line, int classIndex, int traitIndex, int methodIndex) { + gotoScriptName(swf, scriptName); if (abcPanel != null) { - abcPanel.decompiledTextArea.gotoLine(line); + if (Main.isDebugPCode()) { + if (classIndex != -1) { + boolean classChanged = false; + if (abcPanel.decompiledTextArea.getClassIndex() != classIndex) { + abcPanel.decompiledTextArea.setClassIndex(classIndex); + classChanged = true; + } + if (traitIndex != -10 && (classChanged || abcPanel.decompiledTextArea.lastTraitIndex != traitIndex)) { + abcPanel.decompiledTextArea.gotoTrait(traitIndex); + } + } + abcPanel.detailPanel.methodTraitPanel.methodCodePanel.gotoInstrLine(line); + } else { + abcPanel.decompiledTextArea.gotoLine(line); + } } else if (actionPanel != null) { - actionPanel.decompiledEditor.gotoLine(line); + if (Main.isDebugPCode()) { + actionPanel.editor.gotoLine(line); + } else { + actionPanel.decompiledEditor.gotoLine(line); + } } refreshBreakPoints(); @@ -1547,6 +1565,11 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se public void refreshBreakPoints() { if (abcPanel != null) { abcPanel.decompiledTextArea.refreshMarkers(); + abcPanel.detailPanel.methodTraitPanel.methodCodePanel.refreshMarkers(); + } + if (actionPanel != null) { + actionPanel.decompiledEditor.refreshMarkers(); + actionPanel.editor.refreshMarkers(); } } /* @@ -1569,15 +1592,24 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se return; } if (swf.isAS3()) { + String rawScriptName = scriptName; + if (rawScriptName.startsWith("#PCODE ")) { + rawScriptName = rawScriptName.substring(rawScriptName.indexOf(";") + 1); + } + List abcList = swf.getAbcList(); if (!abcList.isEmpty()) { ABCPanel abcPanel = getABCPanel(); abcPanel.setAbc(abcList.get(0).getABC()); - abcPanel.hilightScript(swf, scriptName); + abcPanel.hilightScript(swf, rawScriptName); } } else { - if (actionPanel != null && asms.containsKey(scriptName)) { - actionPanel.setSource(asms.get(scriptName), true); + String rawScriptName = scriptName; + if (rawScriptName.startsWith("#PCODE ")) { + rawScriptName = rawScriptName.substring("#PCODE ".length()); + } + if (actionPanel != null && asms.containsKey(rawScriptName)) { + actionPanel.setSource(asms.get(rawScriptName), true); } } } @@ -2341,8 +2373,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se boolean isStatic = decompiledTextArea.getIsStatic(); abc.bodies.get(bi).deobfuscate(level, t, scriptIndex, classIndex, isStatic, ""/*FIXME*/); } - - abcPanel.detailPanel.methodTraitPanel.methodCodePanel.setBodyIndex(bi, abc, t, abcPanel.detailPanel.methodTraitPanel.methodCodePanel.getScriptIndex()); + abcPanel.detailPanel.methodTraitPanel.methodCodePanel.setBodyIndex(decompiledTextArea.getScriptLeaf().getPathScriptName(), bi, abc, t, abcPanel.detailPanel.methodTraitPanel.methodCodePanel.getScriptIndex()); } } catch (Exception ex) { logger.log(Level.SEVERE, "Deobfuscation error", ex); @@ -2795,9 +2826,11 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se public void clearDebuggerColors() { if (abcPanel != null) { abcPanel.decompiledTextArea.removeColorMarkerOnAllLines(DecompiledEditorPane.IP_MARKER); + abcPanel.detailPanel.methodTraitPanel.methodCodePanel.clearDebuggerColors(); } if (actionPanel != null) { actionPanel.decompiledEditor.removeColorMarkerOnAllLines(DecompiledEditorPane.IP_MARKER); + actionPanel.editor.removeColorMarkerOnAllLines(DecompiledEditorPane.IP_MARKER); } } diff --git a/src/com/jpexs/decompiler/flash/gui/abc/ASMSourceEditorPane.java b/src/com/jpexs/decompiler/flash/gui/abc/ASMSourceEditorPane.java index a22877367..1db7c2a8d 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/ASMSourceEditorPane.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/ASMSourceEditorPane.java @@ -29,11 +29,13 @@ import com.jpexs.decompiler.flash.configuration.Configuration; import com.jpexs.decompiler.flash.exporters.modes.ScriptExportMode; import com.jpexs.decompiler.flash.gui.GraphDialog; import com.jpexs.decompiler.flash.gui.View; +import com.jpexs.decompiler.flash.gui.editor.DebuggableEditorPane; import com.jpexs.decompiler.flash.gui.editor.LineMarkedEditorPane; import com.jpexs.decompiler.flash.helpers.HighlightedText; import com.jpexs.decompiler.flash.helpers.HighlightedTextWriter; import com.jpexs.decompiler.flash.helpers.hilight.HighlightSpecialType; import com.jpexs.decompiler.flash.helpers.hilight.Highlighting; +import com.jpexs.decompiler.flash.tags.ABCContainerTag; import com.jpexs.decompiler.flash.tags.Tag; import com.jpexs.decompiler.graph.ScopeStack; import com.jpexs.helpers.Helper; @@ -47,7 +49,7 @@ import java.util.logging.Logger; import javax.swing.event.CaretEvent; import javax.swing.event.CaretListener; -public class ASMSourceEditorPane extends LineMarkedEditorPane implements CaretListener { +public class ASMSourceEditorPane extends DebuggableEditorPane implements CaretListener { public ABC abc; @@ -79,6 +81,8 @@ public class ASMSourceEditorPane extends LineMarkedEditorPane implements CaretLi private Trait trait; + private int firstInstrLine = -1; + public ABCPanel getAbcPanel() { return decompiledEditor.getAbcPanel(); } @@ -172,7 +176,7 @@ public class ASMSourceEditorPane extends LineMarkedEditorPane implements CaretLi return super.getName(); } - public void setBodyIndex(int bodyIndex, ABC abc, String name, Trait trait, int scriptIndex) { + public void setBodyIndex(String scriptPathName, int bodyIndex, ABC abc, String name, Trait trait, int scriptIndex) { this.bodyIndex = bodyIndex; this.abc = abc; this.name = name; @@ -184,6 +188,16 @@ public class ASMSourceEditorPane extends LineMarkedEditorPane implements CaretLi textWithHex = null; textNoHex = null; textHexOnly = null; + List cs = abc.getAbcTags(); + int abcIndex = -1; + for (int i = 0; i < cs.size(); i++) { + if (cs.get(i).getABC() == abc) { + abcIndex = i; + break; + } + } + String aname = "#PCODE abc:" + abcIndex + ",body:" + bodyIndex + ";" + scriptPathName; + setScriptName(aname); setHex(exportMode, true); } @@ -266,13 +280,34 @@ public class ASMSourceEditorPane extends LineMarkedEditorPane implements CaretLi setCaretPosition(0); } - public void setText(HighlightedText HighlightedText) { - disassembledHilights = HighlightedText.instructionHilights; - specialHilights = HighlightedText.specialHilights; - super.setText(HighlightedText.text); + public void setText(HighlightedText highlightedText) { + disassembledHilights = highlightedText.instructionHilights; + if (!disassembledHilights.isEmpty()) { + int firstPos = disassembledHilights.get(0).startPos; + String txt = highlightedText.text; + txt = txt.replace("\r", ""); + int line = 0; + for (int i = 0; i < firstPos; i++) { + if (txt.charAt(i) == '\n') { + line++; + } + } + firstInstrLine = line; + } + specialHilights = highlightedText.specialHilights; + super.setText(highlightedText.text); setCaretPosition(0); } + @Override + public int firstLineOffset() { + return firstInstrLine; + } + + public void gotoInstrLine(int line) { + super.gotoLine(firstInstrLine + line); + } + public void clear() { setText(""); bodyIndex = -1; diff --git a/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java b/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java index 4cbba59c0..06f6fe07a 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java @@ -221,7 +221,7 @@ public class DecompiledEditorPane extends DebuggableEditorPane implements CaretL abcPanel.detailPanel.showCard(DetailPanel.METHOD_TRAIT_CARD, trait); MethodCodePanel methodCodePanel = abcPanel.detailPanel.methodTraitPanel.methodCodePanel; if (reset || (methodCodePanel.getBodyIndex() != bi)) { - methodCodePanel.setBodyIndex(bi, abc, name, trait, script.scriptIndex); + methodCodePanel.setBodyIndex(scriptName, bi, abc, name, trait, script.scriptIndex); abcPanel.detailPanel.setEditMode(false); this.isStatic = isStatic; } diff --git a/src/com/jpexs/decompiler/flash/gui/abc/MethodCodePanel.java b/src/com/jpexs/decompiler/flash/gui/abc/MethodCodePanel.java index fd6e906fa..218779d8c 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/MethodCodePanel.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/MethodCodePanel.java @@ -50,6 +50,18 @@ public class MethodCodePanel extends JPanel { private final JToggleButton hexOnlyButton; + public void refreshMarkers() { + sourceTextArea.refreshMarkers(); + } + + public void clearDebuggerColors() { + sourceTextArea.removeColorMarkerOnAllLines(DecompiledEditorPane.IP_MARKER); + } + + public void gotoInstrLine(int line) { + sourceTextArea.gotoInstrLine(line); + } + public void focusEditor() { sourceTextArea.requestFocusInWindow(); } @@ -74,12 +86,12 @@ public class MethodCodePanel extends JPanel { sourceTextArea.hilighSpecial(type, specialValue); } - public void setBodyIndex(int bodyIndex, ABC abc, Trait trait, int scriptIndex) { - sourceTextArea.setBodyIndex(bodyIndex, abc, sourceTextArea.getName(), trait, scriptIndex); + public void setBodyIndex(String scriptPathName, int bodyIndex, ABC abc, Trait trait, int scriptIndex) { + sourceTextArea.setBodyIndex(scriptPathName, bodyIndex, abc, sourceTextArea.getName(), trait, scriptIndex); } - public void setBodyIndex(int bodyIndex, ABC abc, String name, Trait trait, int scriptIndex) { - sourceTextArea.setBodyIndex(bodyIndex, abc, name, trait, scriptIndex); + public void setBodyIndex(String scriptPathName, int bodyIndex, ABC abc, String name, Trait trait, int scriptIndex) { + sourceTextArea.setBodyIndex(scriptPathName, bodyIndex, abc, name, trait, scriptIndex); } public int getBodyIndex() { diff --git a/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java b/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java index 1750b3c03..bfe54c990 100644 --- a/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java @@ -103,7 +103,7 @@ public class ActionPanel extends JPanel implements SearchListener bkptLines = Main.getScriptBreakPoints(sc); - - for (int line : bkptLines) { - if (Main.isBreakPointValid(lastASM, line)) { - decompiledEditor.addColorMarker(line, FG_BREAKPOINT_COLOR, BG_BREAKPOINT_COLOR, PRIORITY_BREAKPOINT); - } else { - decompiledEditor.addColorMarker(line, FG_INVALID_BREAKPOINT_COLOR, BG_INVALID_BREAKPOINT_COLOR, PRIORITY_INVALID_BREAKPOINT); - } - } - int ip = Main.getIp(lastASM); - String ipPath = Main.getIpClass(); - if (ip > 0 && ipPath != null && lastASM.getSwf().getASMs(false).get(ipPath) == lastASM) { - decompiledEditor.addColorMarker(ip, FG_IP_COLOR, BG_IP_COLOR, PRIORITY_IP); - } - }*/ public String getStringUnderCursor() { int pos = decompiledEditor.getCaretPosition(); @@ -315,16 +295,17 @@ public class ActionPanel extends JPanel implements SearchListener { ignoreCarret = true; + editor.setScriptName("#PCODE " + scriptName); editor.changeContentType(contentType); editor.setText(text); ignoreCarret = false; }); } - private void setText(final HighlightedText text, final String contentType) { + private void setText(final HighlightedText text, final String contentType, final String scriptName) { View.execInEventDispatch(() -> { int pos = editor.getCaretPosition(); Highlighting lastH = null; @@ -337,7 +318,7 @@ public class ActionPanel extends JPanel implements SearchListener { if (val) { if (hexOnlyButton.isSelected()) { - setHex(ScriptExportMode.HEX); + setHex(ScriptExportMode.HEX, src.getScriptName()); } else if (constantsViewButton.isSelected()) { - setHex(ScriptExportMode.CONSTANTS); + setHex(ScriptExportMode.CONSTANTS, src.getScriptName()); } else { - setHex(ScriptExportMode.PCODE); + setHex(ScriptExportMode.PCODE, src.getScriptName()); } } @@ -900,15 +881,15 @@ public class ActionPanel extends JPanel implements SearchListener bkptLines = Main.getScriptBreakPoints(scriptName); + Set bkptLines = Main.getScriptBreakPoints(scriptName, false); for (int line : bkptLines) { if (Main.isBreakPointValid(scriptName, line)) { - addColorMarker(line, BREAKPOINT_MARKER); + addColorMarker(line + firstLineOffset(), BREAKPOINT_MARKER); } else { - addColorMarker(line, INVALID_BREAKPOINT_MARKER); + addColorMarker(line + firstLineOffset(), INVALID_BREAKPOINT_MARKER); } } int ip = Main.getIp(scriptName); String ipPath = Main.getIpClass(); if (ip > 0 && ipPath != null && ipPath.equals(scriptName)) { - addColorMarker(ip, IP_MARKER); + addColorMarker(ip + firstLineOffset(), IP_MARKER); } } diff --git a/src/com/jpexs/decompiler/flash/gui/editor/LineMarkedEditorPane.java b/src/com/jpexs/decompiler/flash/gui/editor/LineMarkedEditorPane.java index fb98ef537..5ac0cdfe9 100644 --- a/src/com/jpexs/decompiler/flash/gui/editor/LineMarkedEditorPane.java +++ b/src/com/jpexs/decompiler/flash/gui/editor/LineMarkedEditorPane.java @@ -159,6 +159,7 @@ public class LineMarkedEditorPane extends UndoFixedEditorPane implements LinkHan } public boolean hasColorMarker(int line, LineMarker lm) { + line -= firstLineOffset(); if (lineMarkers.containsKey(line)) { return lineMarkers.get(line).contains(lm); } @@ -166,6 +167,7 @@ public class LineMarkedEditorPane extends UndoFixedEditorPane implements LinkHan } public void removeColorMarker(int line, LineMarker lm) { + line -= firstLineOffset(); if (lineMarkers.containsKey(line)) { lineMarkers.get(line).remove(lm); } @@ -174,15 +176,20 @@ public class LineMarkedEditorPane extends UndoFixedEditorPane implements LinkHan public void removeColorMarkerOnAllLines(LineMarker lm) { for (int line : lineMarkers.keySet()) { + line += firstLineOffset(); removeColorMarker(line, lm); } } + public int firstLineOffset() { + return 0; + } + public void toggleColorMarker(int line, LineMarker lm) { - if (!lineMarkers.containsKey(line)) { + if (!lineMarkers.containsKey(line - firstLineOffset())) { addColorMarker(line, lm); } else { - if (lineMarkers.get(line).contains(lm)) { + if (lineMarkers.get(line - firstLineOffset()).contains(lm)) { removeColorMarker(line, lm); } else { addColorMarker(line, lm); @@ -192,6 +199,7 @@ public class LineMarkedEditorPane extends UndoFixedEditorPane implements LinkHan } public void addColorMarker(int line, LineMarker lm) { + line -= firstLineOffset(); if (!lineMarkers.containsKey(line)) { lineMarkers.put(line, Collections.synchronizedSortedSet(new TreeSet<>())); } @@ -621,16 +629,21 @@ public class LineMarkedEditorPane extends UndoFixedEditorPane implements LinkHan continue; } g.setColor(lastMarker.getBgColor()); + line += firstLineOffset(); g.fillRect(0, d + lh * (line - 1), getWidth(), lh); } super.paint(g); for (int line : lineMarkers.keySet()) { + SortedSet cs = lineMarkers.get(line); if (cs.isEmpty()) { continue; } + line += firstLineOffset(); + Reference lineStart = new Reference<>(0); Reference lineEnd = new Reference<>(0); + getLineBounds(line, lineStart, lineEnd); FgPainter fgp = cs.first().getForegroundPainter(); if (fgp != null) { diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties index 64643794e..5c829ab73 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties @@ -692,4 +692,6 @@ debug.break.reason.fault = (Fault) debug.break.reason.stopRequest = (Stop request) debug.break.reason.step = (Step) debug.break.reason.halt = (Halt) -debug.break.reason.scriptLoaded = (Script loaded) \ No newline at end of file +debug.break.reason.scriptLoaded = (Script loaded) + +menu.file.start.debugpcode = Debug P-code \ No newline at end of file