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 e5dbeb78d..53fd8d9cb 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 @@ -344,18 +344,25 @@ public class DefineText2Tag extends TextTag { throw new TextParseException("Font not defined", lexer.yyline()); } + StringBuilder txtSb = new StringBuilder(); for (int i = 0; i < txt.length(); i++) { char c = txt.charAt(i); if (!font.containsChar(c)) { - if (!missingCharHandler.handle(font, c)) { - return false; + if (!missingCharHandler.handle(this, font, c)) { + if (!missingCharHandler.getIgnoreMissingCharacters()) { + return false; + } + } else { + return setFormattedText(missingCharHandler, formattedText, texts); } - - return setFormattedText(missingCharHandler, formattedText, texts); + } else { + txtSb.append(c); } } + txt = txtSb.toString(); + TEXTRECORD tr = new TEXTRECORD(); textRecords.add(tr); if (fontId > -1) { 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 9dfcfbf6e..6bc309f71 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 @@ -350,18 +350,25 @@ public class DefineTextTag extends TextTag { throw new TextParseException("Font not defined", lexer.yyline()); } + StringBuilder txtSb = new StringBuilder(); for (int i = 0; i < txt.length(); i++) { char c = txt.charAt(i); if (!font.containsChar(c)) { - if (!missingCharHandler.handle(font, c)) { - return false; + if (!missingCharHandler.handle(this, font, c)) { + if (!missingCharHandler.getIgnoreMissingCharacters()) { + return false; + } + } else { + return setFormattedText(missingCharHandler, formattedText, texts); } - - return setFormattedText(missingCharHandler, formattedText, texts); + } else { + txtSb.append(c); } } + txt = txtSb.toString(); + TEXTRECORD tr = new TEXTRECORD(); textRecords.add(tr); if (fontId > -1) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/MissingCharacterHandler.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/MissingCharacterHandler.java index c33676fbf..4725b677c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/MissingCharacterHandler.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/MissingCharacterHandler.java @@ -25,7 +25,11 @@ import java.util.Map; */ public class MissingCharacterHandler { - public boolean handle(FontTag font, char character) { + public boolean getIgnoreMissingCharacters() { + return false; + } + + public boolean handle(TextTag textTag, FontTag font, char character) { String fontName = font.getFontNameIntag(); if (!FontTag.installedFontsByFamily.containsKey(fontName)) { return false; diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index 351fefc98..0fec97c42 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -1387,8 +1387,8 @@ public final class MainPanel extends JPanel implements ActionListener, TreeSelec TextImporter textImporter = new TextImporter(getMissingCharacterHandler(), new TextImportErrorHandler() { // "configuration items" for the current replace only - private final ConfigurationItem doNotShowImportError = new ConfigurationItem<>("doNotShowImportError", true, true); - private final ConfigurationItem doNotShowInvalidText = new ConfigurationItem<>("doNotShowInvalidText", true, true); + private final ConfigurationItem showAgainImportError = new ConfigurationItem<>("showAgainImportError", true, true); + private final ConfigurationItem showAgainInvalidText = new ConfigurationItem<>("showAgainInvalidText", true, true); private String getTextTagInfo(TextTag textTag) { String ret = ""; @@ -1403,14 +1403,14 @@ public final class MainPanel extends JPanel implements ActionListener, TreeSelec public boolean handle(TextTag textTag) { String msg = translate("error.text.import"); logger.log(Level.SEVERE, msg + getTextTagInfo(textTag)); - return View.showConfirmDialog(diz, msg, translate("error"), JOptionPane.OK_CANCEL_OPTION, doNotShowImportError, JOptionPane.OK_OPTION) == JOptionPane.CANCEL_OPTION; + return View.showConfirmDialog(diz, msg, translate("error"), JOptionPane.OK_CANCEL_OPTION, showAgainImportError, JOptionPane.OK_OPTION) == JOptionPane.CANCEL_OPTION; } @Override public boolean handle(TextTag textTag, String message, long line) { String msg = translate("error.text.invalid.continue").replace("%text%", message).replace("%line%", Long.toString(line)); logger.log(Level.SEVERE, msg + getTextTagInfo(textTag)); - return View.showConfirmDialog(diz, msg, translate("error"), JOptionPane.OK_CANCEL_OPTION, doNotShowInvalidText, JOptionPane.OK_OPTION) == JOptionPane.CANCEL_OPTION; + return View.showConfirmDialog(diz, msg, translate("error"), JOptionPane.OK_CANCEL_OPTION, showAgainInvalidText, JOptionPane.OK_OPTION) == JOptionPane.CANCEL_OPTION; } }); @@ -1722,8 +1722,18 @@ public final class MainPanel extends JPanel implements ActionListener, TreeSelec private MissingCharacterHandler getMissingCharacterHandler() { return new MissingCharacterHandler() { + + // "configuration items" for the current replace only + private final ConfigurationItem showAgainIgnoreMissingCharacters = new ConfigurationItem<>("showAgainIgnoreMissingCharacters", true, true); + private boolean ignoreMissingCharacters = false; + @Override - public boolean handle(FontTag font, char character) { + public boolean getIgnoreMissingCharacters() { + return ignoreMissingCharacters; + } + + @Override + public boolean handle(TextTag textTag, FontTag font, char character) { String fontName = font.getSwf().sourceFontNamesMap.get(font.getFontId()); if (fontName == null) { fontName = font.getFontName(); @@ -1731,13 +1741,15 @@ public final class MainPanel extends JPanel implements ActionListener, TreeSelec Font f = FontTag.installedFontsByName.get(fontName); if (f == null || !f.canDisplay(character)) { String msg = translate("error.font.nocharacter").replace("%char%", "" + character); - logger.log(Level.SEVERE, msg); - View.showMessageDialog(null, msg, translate("error"), JOptionPane.ERROR_MESSAGE); + logger.log(Level.SEVERE, msg + " FontId: " + font.getCharacterId() + " TextId: " + textTag.getCharacterId()); + ignoreMissingCharacters = View.showConfirmDialog(null, msg, translate("error"), + JOptionPane.OK_CANCEL_OPTION, JOptionPane.ERROR_MESSAGE, + showAgainIgnoreMissingCharacters, + ignoreMissingCharacters ? JOptionPane.OK_OPTION : JOptionPane.CANCEL_OPTION) == JOptionPane.OK_OPTION; return false; } font.addCharacter(character, f); return true; - } }; }