diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/TextExporter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/TextExporter.java index 9034ec462..cb04b35d0 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/TextExporter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/TextExporter.java @@ -121,7 +121,7 @@ public class TextExporter { public void run() throws IOException { fos.write(Utf8Helper.getBytes("ID: " + textTag.getCharacterId() + Helper.newLine)); if (settings.mode == TextExportMode.FORMATTED) { - fos.write(Utf8Helper.getBytes(textTag.getFormattedText())); + fos.write(Utf8Helper.getBytes(textTag.getFormattedText().text)); } else { String separator = Configuration.textExportSingleFileRecordSeparator.get(); separator = Helper.newLine + separator + Helper.newLine; @@ -149,7 +149,7 @@ public class TextExporter { public void run() throws IOException { try (FileOutputStream fos = new FileOutputStream(file)) { if (settings.mode == TextExportMode.FORMATTED) { - fos.write(Utf8Helper.getBytes(textTag.getFormattedText())); + fos.write(Utf8Helper.getBytes(textTag.getFormattedText().text)); } else { String separator = Configuration.textExportSingleFileRecordSeparator.get(); separator = Helper.newLine + separator + Helper.newLine; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/hilight/HighlightSpecialType.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/hilight/HighlightSpecialType.java index 64d553c8e..4f611464b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/hilight/HighlightSpecialType.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/hilight/HighlightSpecialType.java @@ -1,18 +1,19 @@ /* * Copyright (C) 2010-2015 JPEXS, All rights reserved. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3.0 of the License, or (at your option) any later version. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.helpers.hilight; /** @@ -27,5 +28,6 @@ public enum HighlightSpecialType { SLOT_ID, DISP_ID, FLAG_NEED_REST, FLAG_EXPLICIT, FLAG_HAS_OPTIONAL, FLAG_HAS_PARAM_NAMES, FLAG_IGNORE_REST, FLAG_NEED_ACTIVATION, FLAG_NEED_ARGUMENTS, FLAG_SET_DXNS, - TRY_TYPE, TRY_NAME + TRY_TYPE, TRY_NAME, + TEXT } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/TextImporter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/TextImporter.java index d618ad91c..bc888a41f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/TextImporter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/TextImporter.java @@ -77,7 +77,7 @@ public class TextImporter { TextTag textTag = (TextTag) tag; if (textTag.getCharacterId() == characterId) { String[] currentRecords = records.get(characterId); - String text = textTag.getFormattedText(); + String text = textTag.getFormattedText().text; if (!saveText(textTag, text, currentRecords)) { return; } @@ -138,7 +138,7 @@ public class TextImporter { if (tag instanceof TextTag) { TextTag textTag = (TextTag) tag; if (textTag.getCharacterId() == characterId) { - String text = textTag.getFormattedText(); + String text = textTag.getFormattedText().text; if (!saveText(textTag, text, records)) { return; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineEditTextTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineEditTextTag.java index 4e417837f..a7050631c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineEditTextTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineEditTextTag.java @@ -19,9 +19,13 @@ package com.jpexs.decompiler.flash.tags; import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.SWFInputStream; import com.jpexs.decompiler.flash.SWFOutputStream; +import com.jpexs.decompiler.flash.configuration.Configuration; import com.jpexs.decompiler.flash.exporters.commonshape.ExportRectangle; import com.jpexs.decompiler.flash.exporters.commonshape.Matrix; import com.jpexs.decompiler.flash.exporters.commonshape.SVGExporter; +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.tags.base.BoundedTag; import com.jpexs.decompiler.flash.tags.base.FontTag; import com.jpexs.decompiler.flash.tags.base.MissingCharacterHandler; @@ -357,9 +361,9 @@ public class DefineEditTextTag extends TextTag { } @Override - public String getFormattedText() { - String ret = ""; - ret += "["; + public HighlightedText getFormattedText() { + HighlightedTextWriter writer = new HighlightedTextWriter(Configuration.getCodeFormatting(), true); + writer.append("["); String[] alignNames = {"left", "right", "center", "justify"}; String alignment; if (align < alignNames.length) { @@ -367,22 +371,70 @@ public class DefineEditTextTag extends TextTag { } else { alignment = "unknown"; } - ret += "\r\nxmin " + bounds.Xmin + "\r\nymin " + bounds.Ymin + "\r\nxmax " + bounds.Xmax + "\r\nymax " + bounds.Ymax + "\r\n"; - ret += (wordWrap ? "wordwrap 1\r\n" : "") + (multiline ? "multiline 1\r\n" : "") - + (password ? "password 1\r\n" : "") + (readOnly ? "readonly 1\r\n" : "") - + (autoSize ? "autosize 1\r\n" : "") + (noSelect ? "noselect 1\r\n" : "") - + (border ? "border 1\r\n" : "") + (wasStatic ? "wasstatic 1\r\n" : "") - + (html ? "html 1\r\n" : "") + (useOutlines ? "useoutlines 1\r\n" : "") - + (hasFont ? "font " + fontId + "\r\n" + "height " + fontHeight + "\r\n" : "") + (hasTextColor ? "color " + textColor.toHexARGB() + "\r\n" : "") - + (hasFontClass ? "fontclass " + fontClass + "\r\n" : "") + (hasMaxLength ? "maxlength " + maxLength + "\r\n" : "") - + "align " + alignment + "\r\n" - + (hasLayout ? "leftmargin " + leftMargin + "\r\nrightmargin " + rightMargin + "\r\nindent " + indent + "\r\nleading " + leading + "\r\n" : "") - + (!variableName.isEmpty() ? "variablename " + variableName + "\r\n" : ""); - ret += "]"; - if (hasText) { - ret += initialText.replace("\\", "\\\\").replace("[", "\\[").replace("]", "\\]"); + writer.newLine(); + writer.append("xmin " + bounds.Xmin).newLine(); + writer.append("ymin " + bounds.Ymin).newLine(); + writer.append("xmax " + bounds.Xmax).newLine(); + writer.append("ymax " + bounds.Ymax).newLine(); + if (wordWrap) { + writer.append("wordwrap 1").newLine(); } - return ret; + if (multiline) { + writer.append("multiline 1").newLine(); + } + if (password) { + writer.append("password 1").newLine(); + } + if (readOnly) { + writer.append("readonly 1").newLine(); + } + if (autoSize) { + writer.append("autosize 1").newLine(); + } + if (noSelect) { + writer.append("noselect 1").newLine(); + } + if (border) { + writer.append("border 1").newLine(); + } + if (wasStatic) { + writer.append("wasstatic 1").newLine(); + } + if (html) { + writer.append("html 1").newLine(); + } + if (useOutlines) { + writer.append("useoutlines 1").newLine(); + } + if (hasFont) { + writer.append("font " + fontId).newLine(); + writer.append("height " + fontHeight).newLine(); + } + if (hasTextColor) { + writer.append("color " + textColor.toHexARGB()).newLine(); + } + if (hasFontClass) { + writer.append("fontclass " + fontClass).newLine(); + } + if (hasMaxLength) { + writer.append("maxlength " + maxLength).newLine(); + } + writer.append("align " + alignment).newLine(); + if (hasLayout) { + writer.append("leftmargin " + leftMargin).newLine(); + writer.append("rightmargin " + rightMargin).newLine(); + writer.append("indent " + indent).newLine(); + writer.append("leading " + leading).newLine(); + } + if (!variableName.isEmpty()) { + writer.append("variablename " + variableName).newLine(); + } + writer.append("]"); + if (hasText) { + String text = initialText.replace("\\", "\\\\").replace("[", "\\[").replace("]", "\\]"); + writer.hilightSpecial(text, HighlightSpecialType.TEXT); + } + return new HighlightedText(writer); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineText2Tag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineText2Tag.java index 4b7f1f694..e1b4f799d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineText2Tag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineText2Tag.java @@ -23,6 +23,9 @@ import com.jpexs.decompiler.flash.configuration.Configuration; import com.jpexs.decompiler.flash.exporters.commonshape.ExportRectangle; import com.jpexs.decompiler.flash.exporters.commonshape.Matrix; import com.jpexs.decompiler.flash.exporters.commonshape.SVGExporter; +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.tags.base.BoundedTag; import com.jpexs.decompiler.flash.tags.base.FontTag; import com.jpexs.decompiler.flash.tags.base.MissingCharacterHandler; @@ -127,56 +130,58 @@ public class DefineText2Tag extends TextTag { } @Override - public String getFormattedText() { + public HighlightedText getFormattedText() { FontTag fnt = null; - StringBuilder ret = new StringBuilder(); - ret.append("[\r\nxmin ").append(textBounds.Xmin). - append("\r\nymin ").append(textBounds.Ymin). - append("\r\nxmax ").append(textBounds.Xmax). - append("\r\nymax ").append(textBounds.Ymax); + HighlightedTextWriter writer = new HighlightedTextWriter(Configuration.getCodeFormatting(), true); + writer.append("[").newLine(); + writer.append("xmin " + textBounds.Xmin).newLine(); + writer.append("ymin " + textBounds.Ymin).newLine(); + writer.append("xmax " + textBounds.Xmax).newLine(); + writer.append("ymax " + textBounds.Ymax).newLine(); if (textMatrix.translateX != 0) { - ret.append("\r\ntranslatex ").append(textMatrix.translateX); + writer.append("translatex " + textMatrix.translateX).newLine(); } if (textMatrix.translateY != 0) { - ret.append("\r\ntranslatey ").append(textMatrix.translateY); + writer.append("translatey " + textMatrix.translateY).newLine(); } if (textMatrix.hasScale) { - ret.append("\r\nscalex ").append(textMatrix.scaleX); - ret.append("\r\nscaley ").append(textMatrix.scaleY); + writer.append("scalex " + textMatrix.scaleX).newLine(); + writer.append("scaley " + textMatrix.scaleY).newLine(); } if (textMatrix.hasRotate) { - ret.append("\r\nrotateskew0 ").append(textMatrix.rotateSkew0); - ret.append("\r\nrotateskew1 ").append(textMatrix.rotateSkew1); + writer.append("rotateskew0 " + textMatrix.rotateSkew0).newLine(); + writer.append("rotateskew1 " + textMatrix.rotateSkew1).newLine(); } - ret.append("\r\n]"); + writer.append("]"); for (TEXTRECORD rec : textRecords) { - String params = ""; - if (rec.styleFlagsHasFont) { - for (Tag t : swf.tags) { - if (t instanceof FontTag) { - if (((FontTag) t).getFontId() == rec.fontId) { - fnt = ((FontTag) t); - break; + if (rec.styleFlagsHasFont || rec.styleFlagsHasColor || rec.styleFlagsHasXOffset || rec.styleFlagsHasYOffset) { + writer.append("[").newLine(); + if (rec.styleFlagsHasFont) { + for (Tag t : swf.tags) { + if (t instanceof FontTag) { + if (((FontTag) t).getFontId() == rec.fontId) { + fnt = ((FontTag) t); + break; + } } } + writer.append("font " + rec.fontId).newLine(); + writer.append("height " + rec.textHeight).newLine(); } - params += "\r\nfont " + rec.fontId + "\r\nheight " + rec.textHeight; + if (rec.styleFlagsHasColor) { + writer.append("color " + rec.textColorA.toHexARGB()).newLine(); + } + if (rec.styleFlagsHasXOffset) { + writer.append("x " + rec.xOffset).newLine(); + } + if (rec.styleFlagsHasYOffset) { + writer.append("y " + rec.yOffset).newLine(); + } + writer.append("]"); } - if (rec.styleFlagsHasColor) { - params += "\r\ncolor " + rec.textColorA.toHexARGB(); - } - if (rec.styleFlagsHasXOffset) { - params += "\r\nx " + rec.xOffset; - } - if (rec.styleFlagsHasYOffset) { - params += "\r\ny " + rec.yOffset; - } - if (params.length() > 0) { - ret.append("[").append(params).append("\r\n]"); - } - ret.append(Helper.escapeString(rec.getText(fnt)).replace("[", "\\[").replace("]", "\\]")); + writer.hilightSpecial(Helper.escapeString(rec.getText(fnt)).replace("[", "\\[").replace("]", "\\]"), HighlightSpecialType.TEXT); } - return ret.toString(); + return new HighlightedText(writer); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineTextTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineTextTag.java index fd25f7e44..de71fb362 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineTextTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineTextTag.java @@ -24,6 +24,9 @@ import com.jpexs.decompiler.flash.configuration.Configuration; import com.jpexs.decompiler.flash.exporters.commonshape.ExportRectangle; import com.jpexs.decompiler.flash.exporters.commonshape.Matrix; import com.jpexs.decompiler.flash.exporters.commonshape.SVGExporter; +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.tags.base.BoundedTag; import com.jpexs.decompiler.flash.tags.base.FontTag; import com.jpexs.decompiler.flash.tags.base.MissingCharacterHandler; @@ -128,61 +131,63 @@ public class DefineTextTag extends TextTag { } @Override - public String getFormattedText() { + public HighlightedText getFormattedText() { FontTag fnt = null; - StringBuilder ret = new StringBuilder(); - ret.append("[\r\nxmin ").append(textBounds.Xmin). - append("\r\nymin ").append(textBounds.Ymin). - append("\r\nxmax ").append(textBounds.Xmax). - append("\r\nymax ").append(textBounds.Ymax); + HighlightedTextWriter writer = new HighlightedTextWriter(Configuration.getCodeFormatting(), true); + writer.append("[").newLine(); + writer.append("xmin " + textBounds.Xmin).newLine(); + writer.append("ymin " + textBounds.Ymin).newLine(); + writer.append("xmax " + textBounds.Xmax).newLine(); + writer.append("ymax " + textBounds.Ymax).newLine(); if (textMatrix.translateX != 0) { - ret.append("\r\ntranslatex ").append(textMatrix.translateX); + writer.append("translatex " + textMatrix.translateX).newLine(); } if (textMatrix.translateY != 0) { - ret.append("\r\ntranslatey ").append(textMatrix.translateY); + writer.append("translatey " + textMatrix.translateY).newLine(); } if (textMatrix.hasScale) { - ret.append("\r\nscalex ").append(textMatrix.scaleX); - ret.append("\r\nscaley ").append(textMatrix.scaleY); + writer.append("scalex " + textMatrix.scaleX).newLine(); + writer.append("scaley " + textMatrix.scaleY).newLine(); } if (textMatrix.hasRotate) { - ret.append("\r\nrotateskew0 ").append(textMatrix.rotateSkew0); - ret.append("\r\nrotateskew1 ").append(textMatrix.rotateSkew1); + writer.append("rotateskew0 " + textMatrix.rotateSkew0).newLine(); + writer.append("rotateskew1 " + textMatrix.rotateSkew1).newLine(); } - ret.append("\r\n]"); + writer.append("]"); for (TEXTRECORD rec : textRecords) { - String params = ""; - if (rec.styleFlagsHasFont) { - for (Tag t : swf.tags) { - if (t instanceof FontTag) { - if (((FontTag) t).getFontId() == rec.fontId) { - fnt = ((FontTag) t); - break; + if (rec.styleFlagsHasFont || rec.styleFlagsHasColor || rec.styleFlagsHasXOffset || rec.styleFlagsHasYOffset) { + writer.append("[").newLine(); + if (rec.styleFlagsHasFont) { + for (Tag t : swf.tags) { + if (t instanceof FontTag) { + if (((FontTag) t).getFontId() == rec.fontId) { + fnt = ((FontTag) t); + break; + } } } + writer.append("font " + rec.fontId).newLine(); + writer.append("height " + rec.textHeight).newLine(); } - params += "\r\nfont " + rec.fontId + "\r\nheight " + rec.textHeight; - } - if (rec.styleFlagsHasColor) { - params += "\r\ncolor " + rec.textColor.toHexRGB(); - } - if (rec.styleFlagsHasXOffset) { - params += "\r\nx " + rec.xOffset; - } - if (rec.styleFlagsHasYOffset) { - params += "\r\ny " + rec.yOffset; - } - if (params.length() > 0) { - ret.append("[").append(params).append("\r\n]"); + if (rec.styleFlagsHasColor) { + writer.append("color " + rec.textColor.toHexRGB()).newLine(); + } + if (rec.styleFlagsHasXOffset) { + writer.append("x " + rec.xOffset).newLine(); + } + if (rec.styleFlagsHasYOffset) { + writer.append("y " + rec.yOffset).newLine(); + } + writer.append("]"); } if (fnt == null) { - ret.append(AppResources.translate("fontNotFound").replace("%fontId%", Integer.toString(rec.fontId))); + writer.append(AppResources.translate("fontNotFound").replace("%fontId%", Integer.toString(rec.fontId))); } else { - ret.append(Helper.escapeString(rec.getText(fnt)).replace("[", "\\[").replace("]", "\\]")); + writer.hilightSpecial(Helper.escapeString(rec.getText(fnt)).replace("[", "\\[").replace("]", "\\]"), HighlightSpecialType.TEXT); } } - return ret.toString(); + return new HighlightedText(writer); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/TextTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/TextTag.java index 6461b5345..1ad898740 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/TextTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/TextTag.java @@ -26,6 +26,7 @@ import com.jpexs.decompiler.flash.exporters.modes.FontExportMode; import com.jpexs.decompiler.flash.exporters.shape.BitmapExporter; import com.jpexs.decompiler.flash.exporters.shape.CanvasShapeExporter; import com.jpexs.decompiler.flash.exporters.shape.SVGShapeExporter; +import com.jpexs.decompiler.flash.helpers.HighlightedText; import com.jpexs.decompiler.flash.importers.TextImportResizeTextBoundsMode; import com.jpexs.decompiler.flash.tags.text.JustifyAlignGlyphEntry; import com.jpexs.decompiler.flash.tags.text.TextAlign; @@ -81,7 +82,7 @@ public abstract class TextTag extends CharacterTag implements DrawableTag { public abstract List getFontIds(); - public abstract String getFormattedText(); + public abstract HighlightedText getFormattedText(); // use the texts from the "texts" argument when it is not null public abstract boolean setFormattedText(MissingCharacterHandler missingCharHandler, String formattedText, String[] texts) throws TextParseException; diff --git a/libsrc/ffdec_lib/testdata/zipped.zip b/libsrc/ffdec_lib/testdata/zipped.zip index 6ed391c34..77b986589 100644 Binary files a/libsrc/ffdec_lib/testdata/zipped.zip and b/libsrc/ffdec_lib/testdata/zipped.zip differ diff --git a/src/com/jpexs/decompiler/flash/gui/FontPanel.java b/src/com/jpexs/decompiler/flash/gui/FontPanel.java index b9fb14d9d..1388fd259 100644 --- a/src/com/jpexs/decompiler/flash/gui/FontPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/FontPanel.java @@ -173,7 +173,7 @@ public class FontPanel extends javax.swing.JPanel { if (tag instanceof TextTag) { TextTag textTag = (TextTag) tag; if (textTag.getFontIds().contains(fontId)) { - String text = textTag.getFormattedText(); + String text = textTag.getFormattedText().text; mainPanel.saveText(textTag, text, null); } } diff --git a/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java b/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java index 18d905cd7..34783d777 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java +++ b/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java @@ -224,6 +224,14 @@ public abstract class MainFrameMenu { mainFrame.getPanel().refreshDecompiled(); } + protected boolean previousTag() { + return mainFrame.getPanel().previousTag(); + } + + protected boolean nextTag() { + return mainFrame.getPanel().nextTag(); + } + protected void checkResources() { ByteArrayOutputStream os = new ByteArrayOutputStream(); PrintStream stream = new PrintStream(os); @@ -323,7 +331,7 @@ public abstract class MainFrameMenu { @Override public boolean dispatchKeyEvent(KeyEvent e) { - if (((JFrame) mainFrame).isActive()) { + if (((JFrame) mainFrame).isActive() && e.getID() == KeyEvent.KEY_RELEASED) { int code = e.getKeyCode(); if (e.isControlDown() && e.isShiftDown()) { switch (code) { @@ -346,6 +354,13 @@ public abstract class MainFrameMenu { case KeyEvent.VK_E: return export(false); } + } else if (e.isControlDown() && !e.isShiftDown()) { + switch (code) { + case KeyEvent.VK_UP: + return previousTag(); + case KeyEvent.VK_DOWN: + return nextTag(); + } } } diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index 5f3299b57..81d1f6033 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -1361,10 +1361,10 @@ public final class MainPanel extends JPanel implements ActionListener, TreeSelec } if (found) { String[] textArray = texts.toArray(new String[texts.size()]); - textTag.setFormattedText(getMissingCharacterHandler(), textTag.getFormattedText(), textArray); + textTag.setFormattedText(getMissingCharacterHandler(), textTag.getFormattedText().text, textArray); } } else { - String text = textTag.getFormattedText(); + String text = textTag.getFormattedText().text; if (pat.matcher(text).find()) { textTag.setFormattedText(getMissingCharacterHandler(), text.replaceAll(txt, replacement), null); findCount++; @@ -1397,7 +1397,7 @@ public final class MainPanel extends JPanel implements ActionListener, TreeSelec for (Tag tag : swf.tags) { if (tag instanceof TextTag) { TextTag textTag = (TextTag) tag; - if (pat.matcher(textTag.getFormattedText()).find()) { + if (pat.matcher(textTag.getFormattedText().text).find()) { found.add(textTag); } } @@ -2075,6 +2075,34 @@ public final class MainPanel extends JPanel implements ActionListener, TreeSelec return false; } + public boolean previousTag() { + if (getCurrentView() == VIEW_RESOURCES) { + if (tagTree.getSelectionRows().length > 0) { + int row = tagTree.getSelectionRows()[0]; + if (row > 0) { + tagTree.setSelectionRow(row - 1); + previewPanel.focusTextPanel(); + } + } + return true; + } + return false; + } + + public boolean nextTag() { + if (getCurrentView() == VIEW_RESOURCES) { + if (tagTree.getSelectionRows().length > 0) { + int row = tagTree.getSelectionRows()[0]; + if (row < tagTree.getRowCount() - 1) { + tagTree.setSelectionRow(row + 1); + previewPanel.focusTextPanel(); + } + } + return true; + } + return false; + } + @Override public void actionPerformed(ActionEvent e) { switch (e.getActionCommand()) { diff --git a/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java b/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java index 2f821f4c0..572b8e762 100644 --- a/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java @@ -458,6 +458,10 @@ public class PreviewPanel extends JSplitPane implements ActionListener { textPanel.setText(textTag); } + public void focusTextPanel() { + textPanel.focusTextValue(); + } + public void clear() { imagePanel.clearAll(); if (media != null) { diff --git a/src/com/jpexs/decompiler/flash/gui/TextPanel.java b/src/com/jpexs/decompiler/flash/gui/TextPanel.java index 1a19b6d1b..4c6d6b089 100644 --- a/src/com/jpexs/decompiler/flash/gui/TextPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/TextPanel.java @@ -20,6 +20,9 @@ import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.configuration.Configuration; import com.jpexs.decompiler.flash.gui.abc.LineMarkedEditorPane; import com.jpexs.decompiler.flash.gui.controls.JRepeatButton; +import com.jpexs.decompiler.flash.helpers.HighlightedText; +import com.jpexs.decompiler.flash.helpers.hilight.HighlightSpecialType; +import com.jpexs.decompiler.flash.helpers.hilight.Highlighting; import com.jpexs.decompiler.flash.tags.DefineEditTextTag; import com.jpexs.decompiler.flash.tags.base.FontTag; import com.jpexs.decompiler.flash.tags.base.MissingCharacterHandler; @@ -61,6 +64,10 @@ public class TextPanel extends JPanel { private final JButton textCancelButton; + private final JButton selectPrevousTagButton; + + private final JButton selectNextTagButton; + private final JButton textAlignLeftButton; private final JButton textAlignCenterButton; @@ -114,6 +121,8 @@ public class TextPanel extends JPanel { JPanel textButtonsPanel = new JPanel(); textButtonsPanel.setLayout(new FlowLayout(SwingConstants.WEST)); + selectPrevousTagButton = createButton(null, "arrowup16", "selectPreviousTag", e -> mainPanel.previousTag()); + selectNextTagButton = createButton(null, "arrowdown16", "selectNextTag", e -> mainPanel.nextTag()); textAlignLeftButton = createButton(null, "textalignleft16", "text.align.left", e -> textAlign(TextAlign.LEFT)); textAlignCenterButton = createButton(null, "textaligncenter16", "text.align.center", e -> textAlign(TextAlign.CENTER)); textAlignRightButton = createButton(null, "textalignright16", "text.align.right", e -> textAlign(TextAlign.RIGHT)); @@ -122,6 +131,8 @@ public class TextPanel extends JPanel { increaseTranslateXButton = createButton(null, "textindent16", "text.align.translatex.increase", e -> translateX((int) SWF.unitDivisor, ((JRepeatButton) e.getSource()).getRepeatCount()), true); undoChangesButton = createButton(null, "reload16", "text.undo", e -> undoChanges()); + textButtonsPanel.add(selectPrevousTagButton); + textButtonsPanel.add(selectNextTagButton); textButtonsPanel.add(textAlignLeftButton); textButtonsPanel.add(textAlignCenterButton); textButtonsPanel.add(textAlignRightButton); @@ -167,12 +178,25 @@ public class TextPanel extends JPanel { public void setText(TextTag textTag) { this.textTag = textTag; - textValue.setText(textTag.getFormattedText()); + textValue.setText(textTag.getFormattedText().text); textValue.setCaretPosition(0); modified = false; setEditText(false); } + public void focusTextValue() { + textValue.requestFocusInWindow(); + if (!modified) { + HighlightedText text = textTag.getFormattedText(); + for (Highlighting highlight : text.specialHilights) { + if (highlight.getProperties().subtype == HighlightSpecialType.TEXT) { + textValue.select(highlight.startPos, highlight.startPos + highlight.len); + break; + } + } + } + } + public void closeTag() { if (modified && Configuration.autoSaveTagModifications.get()) { saveText(false); diff --git a/src/com/jpexs/decompiler/flash/gui/graphics/arrowdown16.png b/src/com/jpexs/decompiler/flash/gui/graphics/arrowdown16.png new file mode 100644 index 000000000..691f6e0c7 Binary files /dev/null and b/src/com/jpexs/decompiler/flash/gui/graphics/arrowdown16.png differ diff --git a/src/com/jpexs/decompiler/flash/gui/graphics/arrowup16.png b/src/com/jpexs/decompiler/flash/gui/graphics/arrowup16.png new file mode 100644 index 000000000..30d005f25 Binary files /dev/null and b/src/com/jpexs/decompiler/flash/gui/graphics/arrowup16.png differ diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties index 70a439a50..5fd7eddc2 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties @@ -572,3 +572,5 @@ menu.file.export.xml = Export SWF XML #after version 4.1.1 text.align.translatex.decrease = Decrease TranslateX text.align.translatex.increase = Increase TranslateX +selectPreviousTag = Select previous tag +selectNextTag = Select next tag diff --git a/src/com/jpexs/decompiler/flash/gui/locales/ModeFrame_hu.properties b/src/com/jpexs/decompiler/flash/gui/locales/ModeFrame_hu.properties index 00a124c6a..f1714a29b 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/ModeFrame_hu.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/ModeFrame_hu.properties @@ -16,3 +16,5 @@ button.open = Helyi f\u00e1jl megnyit\u00e1sa button.proxy = Megnyit\u00e1s proxyn kereszt\u00fcl button.exit = Kil\u00e9p\u00e9s az alkalmaz\u00e1sb\u00f3l +selectPreviousTag = El\u0151z\u0151 tag kiv\u00e1laszt\u00e1sa +selectNextTag = K\u00f6vetkez\u0151 tag kiv\u00e1laszt\u00e1sa