From 20b416002475baad1820d8bbd7831f05d717edf9 Mon Sep 17 00:00:00 2001 From: "honfika@gmail.com" Date: Fri, 19 Dec 2014 19:45:47 +0100 Subject: [PATCH] allow to copy advance values from system font to swf font --- .../decompiler/flash/tags/DefineFont2Tag.java | 20 + .../decompiler/flash/tags/DefineFont3Tag.java | 22 +- .../decompiler/flash/tags/DefineFontTag.java | 5 + .../decompiler/flash/tags/base/FontTag.java | 2 + .../flash/tags/gfx/DefineCompactedFont.java | 5 + .../decompiler/flash/gui/ErrorLogFrame.java | 632 +++++++++--------- .../jpexs/decompiler/flash/gui/FontPanel.java | 15 + .../flash/gui/locales/MainFrame.properties | 1 + .../flash/gui/locales/MainFrame_hu.properties | 1 + 9 files changed, 388 insertions(+), 315 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineFont2Tag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineFont2Tag.java index 7fbea122f..e2d334433 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineFont2Tag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineFont2Tag.java @@ -433,6 +433,26 @@ public class DefineFont2Tag extends FontTag { setModified(true); } + @Override + public void setAdvanceValues(Font font) { + boolean hasLayout = fontFlagsHasLayout; + fontFlagsHasLayout = true; + fontAdvanceTable = new ArrayList<>(); + if (!hasLayout) { + fontBoundsTable = new ArrayList<>(); + fontKerningTable = new ArrayList<>(); + } + + for (Integer character : codeTable) { + char ch = (char) (int) character; + SHAPE shp = SHAPERECORD.fontCharacterToSHAPE(font, (int) Math.round(getDivider() * 1024), ch); + fontBoundsTable.add(shp.getBounds()); + int fontStyle = getFontStyle(); + Font fnt = new Font(font.getFontName(), fontStyle, 1024); // Not multiplied with divider as it causes problems to create font with height around 20k + fontAdvanceTable.add((int) getDivider() * Math.round(FontHelper.getFontAdvance(fnt, ch))); + } + } + @Override public String getCharacters(List tags) { StringBuilder ret = new StringBuilder(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineFont3Tag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineFont3Tag.java index e5e5aa9e3..58c61d453 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineFont3Tag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineFont3Tag.java @@ -420,7 +420,7 @@ public class DefineFont3Tag extends FontTag { } if (fontFlagsHasLayout) { - Font fnt = new Font(fontName, fontStyle, 1024); //Not multiplied with divider as it causes problems to create font with height around 20k + Font fnt = new Font(fontName, fontStyle, 1024); // Not multiplied with divider as it causes problems to create font with height around 20k if (!exists) { fontBoundsTable.add(pos, shp.getBounds()); fontAdvanceTable.add(pos, (int) getDivider() * Math.round(FontHelper.getFontAdvance(fnt, character))); @@ -436,6 +436,26 @@ public class DefineFont3Tag extends FontTag { setModified(true); } + @Override + public void setAdvanceValues(Font font) { + boolean hasLayout = fontFlagsHasLayout; + fontFlagsHasLayout = true; + fontAdvanceTable = new ArrayList<>(); + if (!hasLayout) { + fontBoundsTable = new ArrayList<>(); + fontKerningTable = new ArrayList<>(); + } + + for (Integer character : codeTable) { + char ch = (char) (int) character; + SHAPE shp = SHAPERECORD.fontCharacterToSHAPE(font, (int) Math.round(getDivider() * 1024), ch); + fontBoundsTable.add(shp.getBounds()); + int fontStyle = getFontStyle(); + Font fnt = new Font(font.getFontName(), fontStyle, 1024); // Not multiplied with divider as it causes problems to create font with height around 20k + fontAdvanceTable.add((int) getDivider() * Math.round(FontHelper.getFontAdvance(fnt, ch))); + } + } + @Override public String getCharacters(List tags) { StringBuilder ret = new StringBuilder(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineFontTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineFontTag.java index 50ba570a3..f53ca88af 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineFontTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineFontTag.java @@ -321,6 +321,11 @@ public class DefineFontTag extends FontTag { setModified(true); } + @Override + public void setAdvanceValues(Font font) { + throw new UnsupportedOperationException("Setting the advance values for DefineFontTag is not supported."); + } + @Override public String getCharacters(List tags) { StringBuilder ret = new StringBuilder(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/FontTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/FontTag.java index a650f209f..af39e92a8 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/FontTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/FontTag.java @@ -67,6 +67,8 @@ public abstract class FontTag extends CharacterTag implements AloneTag, Drawable public abstract void addCharacter(char character, Font font); + public abstract void setAdvanceValues(Font font); + public abstract char glyphToChar(int glyphIndex); public abstract int charToGlyph(char c); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/gfx/DefineCompactedFont.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/gfx/DefineCompactedFont.java index cfbafc118..504d29189 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/gfx/DefineCompactedFont.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/gfx/DefineCompactedFont.java @@ -195,6 +195,11 @@ public final class DefineCompactedFont extends FontTag implements DrawableTag { getSwf().clearImageCache(); } + @Override + public void setAdvanceValues(Font font) { + throw new UnsupportedOperationException("Setting the advance values for DefineCompactedFont is not supported."); + } + @Override public char glyphToChar(int glyphIndex) { return (char) fonts.get(0).glyphInfo.get(glyphIndex).glyphCode; diff --git a/src/com/jpexs/decompiler/flash/gui/ErrorLogFrame.java b/src/com/jpexs/decompiler/flash/gui/ErrorLogFrame.java index 6d0773d4d..bc4850cee 100644 --- a/src/com/jpexs/decompiler/flash/gui/ErrorLogFrame.java +++ b/src/com/jpexs/decompiler/flash/gui/ErrorLogFrame.java @@ -1,314 +1,318 @@ -/* - * Copyright (C) 2010-2014 JPEXS - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.jpexs.decompiler.flash.gui; - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Container; -import java.awt.Cursor; -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.Insets; -import java.awt.Toolkit; -import java.awt.datatransfer.Clipboard; -import java.awt.datatransfer.StringSelection; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.logging.Handler; -import java.util.logging.Level; -import java.util.logging.LogRecord; -import java.util.logging.Logger; -import java.util.logging.SimpleFormatter; -import javax.swing.BorderFactory; -import javax.swing.BoxLayout; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JComponent; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; -import javax.swing.JToggleButton; -import javax.swing.SwingUtilities; - -/** - * - * @author JPEXS - */ -public class ErrorLogFrame extends AppFrame { - - private static ErrorLogFrame instance; - - private final JPanel logView = new JPanel(); - private JPanel logViewInner = new JPanel(); - private final Handler handler; - private final ImageIcon expandIcon; - private final ImageIcon collapseIcon; - private ErrorState errorState = ErrorState.NO_ERROR; - - public Handler getHandler() { - return handler; - } - - public static ErrorLogFrame getInstance() { - if (instance == null) { - instance = new ErrorLogFrame(); - View.execInEventDispatch(new Runnable() { - @Override - public void run() { - Logger logger = Logger.getLogger(""); - logger.addHandler(instance.getHandler()); - } - }); - } - return instance; - } - - public static ErrorLogFrame createNewInstance() { - if (instance != null) { - View.execInEventDispatch(new Runnable() { - @Override - public void run() { - Logger logger = Logger.getLogger(""); - logger.removeHandler(instance.getHandler()); - } - }); - instance.setVisible(false); - instance.dispose(); - instance = null; - } - return getInstance(); - } - - public ErrorState getErrorState() { - return errorState; - } - - public ErrorLogFrame() { - setTitle(translate("dialog.title")); - setSize(700, 400); - setBackground(Color.white); - View.centerScreen(this); - View.setWindowIcon(this); - setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); - Container cnt = getContentPane(); - cnt.setLayout(new BorderLayout()); - logView.setBackground(Color.white); - logView.setLayout(new BorderLayout()); - cnt.setBackground(Color.white); - - logViewInner.setLayout(new BoxLayout(logViewInner, BoxLayout.Y_AXIS)); - logView.add(logViewInner, BorderLayout.NORTH); - JPanel buttonsPanel = new JPanel(new FlowLayout()); - JButton clearButton = new JButton(translate("clear")); - clearButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - logViewInner.removeAll(); - Main.clearLogFile(); - revalidate(); - repaint(); - } - }); - buttonsPanel.add(clearButton); - - expandIcon = View.getIcon("expand16"); - collapseIcon = View.getIcon("collapse16"); - cnt.add(buttonsPanel, BorderLayout.SOUTH); - - cnt.add(new JScrollPane(logView), BorderLayout.CENTER); - handler = new Handler() { - SimpleFormatter formatter = new SimpleFormatter(); - - @Override - public void publish(LogRecord record) { - if (getLevel().intValue() <= record.getLevel().intValue()) { - log(record.getLevel(), formatter.formatMessage(record), record.getThrown()); - } - } - - @Override - public void flush() { - } - - @Override - public void close() throws SecurityException { - } - }; - handler.setLevel(Level.WARNING); - } - - public void clearErrorState() { - errorState = ErrorState.NO_ERROR; - MainFrame mainFrame = Main.getMainFrame(); - if (mainFrame != null) { - mainFrame.getPanel().setErrorState(errorState); - } - } - - private void notifyMainFrame(Level level) { - boolean stateChanged = false; - if (level.intValue() >= Level.SEVERE.intValue()) { - if (errorState != ErrorState.ERROR) { - errorState = ErrorState.ERROR; - stateChanged = true; - } - } else if (level.intValue() >= Level.WARNING.intValue()) { - if (errorState != ErrorState.ERROR && errorState != ErrorState.WARNING) { - errorState = ErrorState.WARNING; - stateChanged = true; - } - } else if (level.intValue() >= Level.INFO.intValue()) { - if (errorState == ErrorState.NO_ERROR) { - errorState = ErrorState.INFO; - stateChanged = true; - } - } - if (stateChanged) { - MainFrame mainFrame = Main.getMainFrame(); - if (mainFrame != null) { - mainFrame.getPanel().setErrorState(errorState); - } - } - } - - private void log(final Level level, final String msg, final String detail) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - notifyMainFrame(level); - - JPanel pan = new JPanel(); - pan.setBackground(Color.white); - pan.setLayout(new BoxLayout(pan, BoxLayout.Y_AXIS)); - - JComponent detailComponent; - if (detail == null) { - detailComponent = null; - } else { - final JTextArea detailTextArea = new JTextArea(detail); - detailTextArea.setEditable(false); - detailTextArea.setOpaque(false); - detailTextArea.setFont(new JLabel().getFont()); - detailTextArea.setBackground(Color.white); - detailComponent = detailTextArea; - } - JPanel header = new JPanel(); - header.setLayout(new BoxLayout(header, BoxLayout.X_AXIS)); - header.setBackground(Color.white); - - SimpleDateFormat format = new SimpleDateFormat("dd/MM/YYYY HH:mm:ss"); - final String dateStr = format.format(new Date()); - - JToggleButton copyButton = new JToggleButton(View.getIcon("copy16")); - copyButton.setFocusPainted(false); - copyButton.setBorderPainted(false); - copyButton.setFocusable(false); - copyButton.setContentAreaFilled(false); - copyButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - copyButton.setMargin(new Insets(2, 2, 2, 2)); - copyButton.setToolTipText(translate("copy")); - copyButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); - StringSelection stringSelection = new StringSelection(dateStr + " " + level.toString() + " " + msg + "\r\n" + detail); - clipboard.setContents(stringSelection, null); - } - }); - - final JToggleButton expandButton = new JToggleButton(collapseIcon); - expandButton.setFocusPainted(false); - expandButton.setBorderPainted(false); - expandButton.setFocusable(false); - expandButton.setContentAreaFilled(false); - expandButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - expandButton.setMargin(new Insets(2, 2, 2, 2)); - expandButton.setToolTipText(translate("details")); - - final JScrollPane scrollPane; - if (detailComponent != null) { - scrollPane = new JScrollPane(detailComponent); - scrollPane.setAlignmentX(0f); - } else { - scrollPane = null; - } - - if (detailComponent != null) { - expandButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - expandButton.setIcon(expandButton.isSelected() ? expandIcon : collapseIcon); - scrollPane.setVisible(expandButton.isSelected()); - revalidate(); - repaint(); - } - }); - } - - if (detailComponent != null) { - header.add(expandButton); - } - JLabel dateLabel = new JLabel(dateStr); - dateLabel.setPreferredSize(new Dimension(200, (int) dateLabel.getPreferredSize().getHeight())); - dateLabel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); - header.add(dateLabel); - - JLabel levelLabel = new JLabel(level.getName()); - levelLabel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); - header.add(levelLabel); - JTextArea msgLabel = new JTextArea(msg); - msgLabel.setEditable(false); - msgLabel.setOpaque(false); - msgLabel.setFont(levelLabel.getFont()); - - msgLabel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); - header.add(msgLabel); - header.setAlignmentX(0f); - - header.add(copyButton); - pan.add(header); - if (detailComponent != null) { - pan.add(scrollPane); - scrollPane.setVisible(false); - } - pan.setAlignmentX(0f); - logViewInner.add(pan); - revalidate(); - repaint(); - } - }); - - } - - public void log(Level level, String msg) { - log(level, msg, (String) null); - } - - public void log(Level level, String msg, Throwable ex) { - StringWriter sw = new StringWriter(); - if (ex != null) { - ex.printStackTrace(new PrintWriter(sw)); - } - log(level, msg, sw.toString()); - } -} +/* + * Copyright (C) 2010-2014 JPEXS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.jpexs.decompiler.flash.gui; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Container; +import java.awt.Cursor; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Insets; +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.StringSelection; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.LogRecord; +import java.util.logging.Logger; +import java.util.logging.SimpleFormatter; +import javax.swing.BorderFactory; +import javax.swing.BoxLayout; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.JToggleButton; +import javax.swing.SwingUtilities; + +/** + * + * @author JPEXS + */ +public class ErrorLogFrame extends AppFrame { + + private static ErrorLogFrame instance; + + private final JPanel logView = new JPanel(); + private JPanel logViewInner = new JPanel(); + private final Handler handler; + private final ImageIcon expandIcon; + private final ImageIcon collapseIcon; + private ErrorState errorState = ErrorState.NO_ERROR; + private static final int MAX_LOG_ITEM_COUNT = 100; + private final AtomicInteger logItemCount = new AtomicInteger(); + + public Handler getHandler() { + return handler; + } + + public static ErrorLogFrame getInstance() { + if (instance == null) { + instance = new ErrorLogFrame(); + View.execInEventDispatch(new Runnable() { + @Override + public void run() { + Logger logger = Logger.getLogger(""); + logger.addHandler(instance.getHandler()); + } + }); + } + return instance; + } + + public static ErrorLogFrame createNewInstance() { + if (instance != null) { + View.execInEventDispatch(new Runnable() { + @Override + public void run() { + Logger logger = Logger.getLogger(""); + logger.removeHandler(instance.getHandler()); + } + }); + instance.setVisible(false); + instance.dispose(); + instance = null; + } + return getInstance(); + } + + public ErrorState getErrorState() { + return errorState; + } + + public ErrorLogFrame() { + setTitle(translate("dialog.title")); + setSize(700, 400); + setBackground(Color.white); + View.centerScreen(this); + View.setWindowIcon(this); + setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); + Container cnt = getContentPane(); + cnt.setLayout(new BorderLayout()); + logView.setBackground(Color.white); + logView.setLayout(new BorderLayout()); + cnt.setBackground(Color.white); + + logViewInner.setLayout(new BoxLayout(logViewInner, BoxLayout.Y_AXIS)); + logView.add(logViewInner, BorderLayout.NORTH); + JPanel buttonsPanel = new JPanel(new FlowLayout()); + JButton clearButton = new JButton(translate("clear")); + clearButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + logViewInner.removeAll(); + Main.clearLogFile(); + revalidate(); + repaint(); + } + }); + buttonsPanel.add(clearButton); + + expandIcon = View.getIcon("expand16"); + collapseIcon = View.getIcon("collapse16"); + cnt.add(buttonsPanel, BorderLayout.SOUTH); + + cnt.add(new JScrollPane(logView), BorderLayout.CENTER); + handler = new Handler() { + SimpleFormatter formatter = new SimpleFormatter(); + + @Override + public void publish(LogRecord record) { + if (getLevel().intValue() <= record.getLevel().intValue()) { + log(record.getLevel(), formatter.formatMessage(record), record.getThrown()); + } + } + + @Override + public void flush() { + } + + @Override + public void close() throws SecurityException { + } + }; + handler.setLevel(Level.WARNING); + } + + public void clearErrorState() { + errorState = ErrorState.NO_ERROR; + MainFrame mainFrame = Main.getMainFrame(); + if (mainFrame != null) { + mainFrame.getPanel().setErrorState(errorState); + } + } + + private void notifyMainFrame(Level level) { + boolean stateChanged = false; + if (level.intValue() >= Level.SEVERE.intValue()) { + if (errorState != ErrorState.ERROR) { + errorState = ErrorState.ERROR; + stateChanged = true; + } + } else if (level.intValue() >= Level.WARNING.intValue()) { + if (errorState != ErrorState.ERROR && errorState != ErrorState.WARNING) { + errorState = ErrorState.WARNING; + stateChanged = true; + } + } else if (level.intValue() >= Level.INFO.intValue()) { + if (errorState == ErrorState.NO_ERROR) { + errorState = ErrorState.INFO; + stateChanged = true; + } + } + if (stateChanged) { + MainFrame mainFrame = Main.getMainFrame(); + if (mainFrame != null) { + mainFrame.getPanel().setErrorState(errorState); + } + } + } + + private void log(final Level level, final String msg, final String detail) { + if (logItemCount.getAndIncrement() < MAX_LOG_ITEM_COUNT) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + notifyMainFrame(level); + + JPanel pan = new JPanel(); + pan.setBackground(Color.white); + pan.setLayout(new BoxLayout(pan, BoxLayout.Y_AXIS)); + + JComponent detailComponent; + if (detail == null) { + detailComponent = null; + } else { + final JTextArea detailTextArea = new JTextArea(detail); + detailTextArea.setEditable(false); + detailTextArea.setOpaque(false); + detailTextArea.setFont(new JLabel().getFont()); + detailTextArea.setBackground(Color.white); + detailComponent = detailTextArea; + } + JPanel header = new JPanel(); + header.setLayout(new BoxLayout(header, BoxLayout.X_AXIS)); + header.setBackground(Color.white); + + SimpleDateFormat format = new SimpleDateFormat("dd/MM/YYYY HH:mm:ss"); + final String dateStr = format.format(new Date()); + + JToggleButton copyButton = new JToggleButton(View.getIcon("copy16")); + copyButton.setFocusPainted(false); + copyButton.setBorderPainted(false); + copyButton.setFocusable(false); + copyButton.setContentAreaFilled(false); + copyButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + copyButton.setMargin(new Insets(2, 2, 2, 2)); + copyButton.setToolTipText(translate("copy")); + copyButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + StringSelection stringSelection = new StringSelection(dateStr + " " + level.toString() + " " + msg + "\r\n" + detail); + clipboard.setContents(stringSelection, null); + } + }); + + final JToggleButton expandButton = new JToggleButton(collapseIcon); + expandButton.setFocusPainted(false); + expandButton.setBorderPainted(false); + expandButton.setFocusable(false); + expandButton.setContentAreaFilled(false); + expandButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + expandButton.setMargin(new Insets(2, 2, 2, 2)); + expandButton.setToolTipText(translate("details")); + + final JScrollPane scrollPane; + if (detailComponent != null) { + scrollPane = new JScrollPane(detailComponent); + scrollPane.setAlignmentX(0f); + } else { + scrollPane = null; + } + + if (detailComponent != null) { + expandButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + expandButton.setIcon(expandButton.isSelected() ? expandIcon : collapseIcon); + scrollPane.setVisible(expandButton.isSelected()); + revalidate(); + repaint(); + } + }); + } + + if (detailComponent != null) { + header.add(expandButton); + } + JLabel dateLabel = new JLabel(dateStr); + dateLabel.setPreferredSize(new Dimension(200, (int) dateLabel.getPreferredSize().getHeight())); + dateLabel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); + header.add(dateLabel); + + JLabel levelLabel = new JLabel(level.getName()); + levelLabel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); + header.add(levelLabel); + JTextArea msgLabel = new JTextArea(msg); + msgLabel.setEditable(false); + msgLabel.setOpaque(false); + msgLabel.setFont(levelLabel.getFont()); + + msgLabel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); + header.add(msgLabel); + header.setAlignmentX(0f); + + header.add(copyButton); + pan.add(header); + if (detailComponent != null) { + pan.add(scrollPane); + scrollPane.setVisible(false); + } + pan.setAlignmentX(0f); + logViewInner.add(pan); + revalidate(); + repaint(); + } + }); + } + } + + public void log(Level level, String msg) { + log(level, msg, (String) null); + } + + public void log(Level level, String msg, Throwable ex) { + StringWriter sw = new StringWriter(); + if (ex != null) { + ex.printStackTrace(new PrintWriter(sw)); + } + log(level, msg, sw.toString()); + } +} diff --git a/src/com/jpexs/decompiler/flash/gui/FontPanel.java b/src/com/jpexs/decompiler/flash/gui/FontPanel.java index e3fc99deb..ec3b7c2cc 100644 --- a/src/com/jpexs/decompiler/flash/gui/FontPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/FontPanel.java @@ -271,6 +271,7 @@ public class FontPanel extends javax.swing.JPanel { buttonSave = new javax.swing.JButton(); buttonCancel = new javax.swing.JButton(); buttonPreviewFont = new javax.swing.JButton(); + buttonSetAdvanceValues = new javax.swing.JButton(); addComponentListener(new java.awt.event.ComponentAdapter() { @Override public void componentResized(java.awt.event.ComponentEvent evt) { @@ -457,6 +458,14 @@ public class FontPanel extends javax.swing.JPanel { } }); + buttonSetAdvanceValues.setText(AppStrings.translate("button.setAdvanceValues")); // NOI18N + buttonSetAdvanceValues.addActionListener(new java.awt.event.ActionListener() { + @Override + public void actionPerformed(java.awt.event.ActionEvent evt) { + buttonSetAdvanceValuesActionPerformed(evt); + } + }); + TableLayout tlAddCharsPanel; addCharsPanel.setLayout(tlAddCharsPanel = new TableLayout(new double[][]{ {TableLayout.PREFERRED, TableLayout.PREFERRED, TableLayout.PREFERRED, TableLayout.PREFERRED, TableLayout.PREFERRED, TableLayout.PREFERRED}, @@ -473,6 +482,7 @@ public class FontPanel extends javax.swing.JPanel { addCharsPanel.add(fontFamilyNameSelection, "1,1"); addCharsPanel.add(fontFaceSelection, "2,1"); addCharsPanel.add(buttonPreviewFont, "3,1"); + addCharsPanel.add(buttonSetAdvanceValues, "4,1"); addCharsPanel.add(updateTextsCheckBox, "0,2,2,2"); @@ -590,6 +600,10 @@ public class FontPanel extends javax.swing.JPanel { new FontPreviewDialog(null, true, ((FontFace) fontFaceSelection.getSelectedItem()).font).setVisible(true); } + private void buttonSetAdvanceValuesActionPerformed(java.awt.event.ActionEvent evt) { + fontTag.setAdvanceValues(((FontFace) fontFaceSelection.getSelectedItem()).font); + } + private void formComponentResized(java.awt.event.ComponentEvent evt) { fontParamsPanel.updateUI(); } @@ -650,6 +664,7 @@ public class FontPanel extends javax.swing.JPanel { private javax.swing.JButton buttonCancel; private javax.swing.JButton buttonEdit; private javax.swing.JButton buttonPreviewFont; + private javax.swing.JButton buttonSetAdvanceValues; private javax.swing.JButton buttonSave; private javax.swing.JTextField fontAddCharactersField; private javax.swing.JButton fontAddCharsButton; diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties index 9eb845014..dea2fddfb 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties @@ -542,3 +542,4 @@ error.text.invalid.continue = Invalid text: %text% on line %line%. Do you want t #after version 4.0.5 contextmenu.copyTag = Copy tag to fit = fit +button.setAdvanceValues = Set advance values diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_hu.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_hu.properties index 6856e224c..8ce2c0981 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_hu.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_hu.properties @@ -542,3 +542,4 @@ error.text.invalid.continue = Hib\u00e1s sz\u00f6veg: %text% a %line%. sorban. F #after version 4.0.5 contextmenu.copyTag = M\u00e1sol\u00e1s ide fit = kit\u00f6lt +button.setAdvanceValues = Halad\u00e1si \u00e9rt\u00e9kek be\u00e1ll\u00edt\u00e1sa