From bc71301456d440f720ace4b90dd87dda3a77d51c Mon Sep 17 00:00:00 2001 From: Honfika Date: Sun, 2 Feb 2014 18:24:59 +0100 Subject: [PATCH] edit properties in lists and arrays --- .../decompiler/flash/gui/GenericTagPanel.java | 83 +++++++++++-------- .../flash/gui/MainFrameRibbonMenu.java | 9 ++ .../jpexs/decompiler/flash/gui/MainPanel.java | 1 + .../jpexs/decompiler/flash/gui/TagTree.java | 30 ++++--- .../gui/generictageditors/BooleanEditor.java | 2 - .../gui/generictageditors/DoubleEditor.java | 3 +- .../gui/generictageditors/FloatEditor.java | 3 +- .../gui/generictageditors/IntegerEditor.java | 3 +- .../gui/generictageditors/LongEditor.java | 3 +- .../gui/generictageditors/ShortEditor.java | 3 +- 10 files changed, 84 insertions(+), 56 deletions(-) diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/GenericTagPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/GenericTagPanel.java index ac2a7dc7b..19b98d3a3 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/GenericTagPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/GenericTagPanel.java @@ -29,12 +29,12 @@ import com.jpexs.decompiler.flash.helpers.GraphTextWriter; import com.jpexs.decompiler.flash.tags.Tag; import com.jpexs.decompiler.flash.types.RECT; import com.jpexs.decompiler.flash.types.RGB; +import com.jpexs.decompiler.flash.types.ZONEDATA; import com.jpexs.decompiler.flash.types.ZONERECORD; import java.awt.BorderLayout; import java.awt.Component; import java.lang.reflect.Field; import java.lang.reflect.Modifier; -import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JEditorPane; @@ -127,41 +127,20 @@ public class GenericTagPanel extends JPanel { continue; } field.setAccessible(true); - Class type = field.getType(); String name = parent + field.getName(); - Component editor = null; Object value = field.get(obj); - if (type.equals(int.class) || type.equals(Integer.class)) { - editor = new IntegerEditor(obj, field); - } else if (type.equals(short.class) || type.equals(Short.class)) { - editor = new ShortEditor(obj, field); - } else if (type.equals(long.class) || type.equals(Long.class)) { - editor = new LongEditor(obj, field); - } else if (type.equals(double.class) || type.equals(Double.class)) { - editor = new DoubleEditor(obj, field); - } else if (type.equals(float.class) || type.equals(Float.class)) { - editor = new FloatEditor(obj, field); - } else if (type.equals(boolean.class) || type.equals(Boolean.class)) { - editor = new BooleanEditor(obj, field); - } else if (type.equals(String.class)) { - editor = new StringEditor(obj, field); - } else if (type.equals(RECT.class) || type.equals(RGB.class) || type.equals(ZONERECORD.class)) { - // todo: add other swf releated classes - propCount += generateEditControlsRecursive(field.get(obj), field.getName() + "."); - } else if (value instanceof Iterable) { - // todo: add list/array support + if (value instanceof Iterable) { + int i = 0; + for (Object obj1 : (Iterable) value) { + propCount += generateEditControlsRecursive(obj1, name + "[" + i++ + "]"); + } + } else if (value instanceof Object[]) { + Object[] objArr = (Object[]) value; + for (int i = 0; i < objArr.length; i++) { + propCount += generateEditControlsRecursive(objArr[i], name + "[" + i + "]"); + } } else { - JTextArea textArea = new JTextArea(field.get(obj).toString()); - textArea.setLineWrap(true); - textArea.setEditable(false); - editor = textArea; - } - if (editor != null) { - JLabel label = new JLabel(name + ":", JLabel.TRAILING); - genericTagPropertiesEditPanel.add(label); - label.setLabelFor(editor); - genericTagPropertiesEditPanel.add(editor); - propCount++; + propCount += addEditor(name, obj, field); } } catch (IllegalArgumentException | IllegalAccessException ex) { Logger.getLogger(GenericTagPanel.class.getName()).log(Level.SEVERE, null, ex); @@ -170,12 +149,50 @@ public class GenericTagPanel extends JPanel { return propCount; } + private int addEditor(String name, Object obj, Field field) throws IllegalArgumentException, IllegalAccessException { + Component editor; + Class type = field.getType(); + if (type.equals(int.class) || type.equals(Integer.class)) { + editor = new IntegerEditor(obj, field); + } else if (type.equals(short.class) || type.equals(Short.class)) { + editor = new ShortEditor(obj, field); + } else if (type.equals(long.class) || type.equals(Long.class)) { + editor = new LongEditor(obj, field); + } else if (type.equals(double.class) || type.equals(Double.class)) { + editor = new DoubleEditor(obj, field); + } else if (type.equals(float.class) || type.equals(Float.class)) { + editor = new FloatEditor(obj, field); + } else if (type.equals(boolean.class) || type.equals(Boolean.class)) { + editor = new BooleanEditor(obj, field); + } else if (type.equals(String.class)) { + editor = new StringEditor(obj, field); + } else if (type.equals(RECT.class) + || type.equals(RGB.class) + || type.equals(ZONERECORD.class) + || type.equals(ZONEDATA.class)) { + // todo: add other swf releated classes + return generateEditControlsRecursive(field.get(obj), field.getName() + "."); + } else { + JTextArea textArea = new JTextArea(field.get(obj).toString()); + textArea.setLineWrap(true); + textArea.setEditable(false); + editor = textArea; + } + + JLabel label = new JLabel(name + ":", JLabel.TRAILING); + genericTagPropertiesEditPanel.add(label); + label.setLabelFor(editor); + genericTagPropertiesEditPanel.add(editor); + return 1; + } + public void save() { for (Object component : genericTagPropertiesEditPanel.getComponents()) { if (component instanceof GenericTagEditor) { ((GenericTagEditor) component).save(); } } + tag.setModified(true); setTagText(tag); } } diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/MainFrameRibbonMenu.java b/trunk/src/com/jpexs/decompiler/flash/gui/MainFrameRibbonMenu.java index 50b152654..0977d6151 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/MainFrameRibbonMenu.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/MainFrameRibbonMenu.java @@ -22,6 +22,7 @@ import com.jpexs.decompiler.flash.configuration.Configuration; import com.jpexs.decompiler.flash.console.ContextMenuTools; import com.jpexs.decompiler.flash.gui.helpers.CheckResources; import com.jpexs.decompiler.flash.tags.ABCContainerTag; +import com.jpexs.decompiler.flash.tags.Tag; import com.jpexs.helpers.Cache; import com.jpexs.helpers.utf8.Utf8Helper; import com.jpexs.process.ProcessTools; @@ -518,6 +519,12 @@ public class MainFrameRibbonMenu implements MainFrameMenu, ActionListener { saveCommandButton.setEnabled(mainFrame.panel.getCurrentSwf() != null); } } + + private void clearModified(SWF swf) { + for (Tag tag : swf.tags) { + tag.setModified(false); + } + } @Override public void actionPerformed(ActionEvent e) { @@ -647,11 +654,13 @@ public class MainFrameRibbonMenu implements MainFrameMenu, ActionListener { View.showMessageDialog(null, translate("error.file.save"), translate("error"), JOptionPane.ERROR_MESSAGE); } } + clearModified(swf); } break; case ACTION_SAVE_AS: { SWF swf = mainFrame.panel.getCurrentSwf(); saveAs(swf, SaveFileMode.SAVEAS); + clearModified(swf); } break; case ACTION_SAVE_AS_EXE: { diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/MainPanel.java index f3c2af6b7..08ed3e697 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -2143,6 +2143,7 @@ public final class MainPanel extends JPanel implements ActionListener, TreeSelec break; case ACTION_SAVE_GENERIC_TAG: { genericTagPanel.save(); + tagTree.repaint(); genericEditButton.setVisible(true); genericSaveButton.setVisible(false); genericCancelButton.setVisible(false); diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/TagTree.java b/trunk/src/com/jpexs/decompiler/flash/gui/TagTree.java index 3e88a026a..6c9c185bd 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/TagTree.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/TagTree.java @@ -59,6 +59,7 @@ import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Font; +import java.awt.FontMetrics; import java.awt.Graphics; import java.util.ArrayList; import java.util.List; @@ -104,23 +105,30 @@ public class TagTree extends JTree { //setToolTipText(null); //no tool tip } - String tos = value.toString(); - int sw = getFontMetrics(getFont()).stringWidth(tos); - setPreferredSize(new Dimension(18 + sw, getPreferredSize().height)); + Font font = getFont(); + boolean isModified = false; + if (treeNode instanceof TreeNode) { + if (treeNode.getItem() instanceof Tag) { + Tag tag = (Tag) treeNode.getItem(); + if (tag.isModified()) { + isModified = true; + } + } + } + + if (isModified) { + font = font.deriveFont(Font.BOLD); + } else { + font = font.deriveFont(Font.PLAIN); + } + setFont(font); + setUI(new BasicLabelUI()); setOpaque(false); //setBackground(Color.green); setBackgroundNonSelectionColor(Color.white); //setBackgroundSelectionColor(Color.ORANGE); - if (treeNode instanceof TreeNode) { - if (treeNode.getItem() instanceof Tag) { - Tag tag = (Tag) treeNode.getItem(); - if (tag.isModified()) { - setFont(getFont().deriveFont(Font.BOLD)); - } - } - } return this; } } diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/generictageditors/BooleanEditor.java b/trunk/src/com/jpexs/decompiler/flash/gui/generictageditors/BooleanEditor.java index ed25b8a43..5126f24a3 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/generictageditors/BooleanEditor.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/generictageditors/BooleanEditor.java @@ -18,8 +18,6 @@ package com.jpexs.decompiler.flash.gui.generictageditors; import java.awt.Color; import java.lang.reflect.Field; -import java.util.logging.Level; -import java.util.logging.Logger; import javax.swing.JCheckBox; /** diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/generictageditors/DoubleEditor.java b/trunk/src/com/jpexs/decompiler/flash/gui/generictageditors/DoubleEditor.java index 034f9b4c6..374d4e55e 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/generictageditors/DoubleEditor.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/generictageditors/DoubleEditor.java @@ -18,8 +18,6 @@ package com.jpexs.decompiler.flash.gui.generictageditors; import java.awt.Color; import java.lang.reflect.Field; -import java.util.logging.Level; -import java.util.logging.Logger; import javax.swing.JTextArea; /** @@ -34,6 +32,7 @@ public class DoubleEditor extends JTextArea implements GenericTagEditor { public DoubleEditor(Object obj, Field field) { setBackground(Color.white); setSize(100, getSize().height); + setMaximumSize(getSize()); setWrapStyleWord(true); this.obj = obj; this.field = field; diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/generictageditors/FloatEditor.java b/trunk/src/com/jpexs/decompiler/flash/gui/generictageditors/FloatEditor.java index 2342556c2..5ba18e34f 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/generictageditors/FloatEditor.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/generictageditors/FloatEditor.java @@ -18,8 +18,6 @@ package com.jpexs.decompiler.flash.gui.generictageditors; import java.awt.Color; import java.lang.reflect.Field; -import java.util.logging.Level; -import java.util.logging.Logger; import javax.swing.JTextArea; /** @@ -34,6 +32,7 @@ public class FloatEditor extends JTextArea implements GenericTagEditor { public FloatEditor(Object obj, Field field) { setBackground(Color.white); setSize(100, getSize().height); + setMaximumSize(getSize()); setWrapStyleWord(true); this.obj = obj; this.field = field; diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/generictageditors/IntegerEditor.java b/trunk/src/com/jpexs/decompiler/flash/gui/generictageditors/IntegerEditor.java index 90212e596..c33c330b5 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/generictageditors/IntegerEditor.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/generictageditors/IntegerEditor.java @@ -18,8 +18,6 @@ package com.jpexs.decompiler.flash.gui.generictageditors; import java.awt.Color; import java.lang.reflect.Field; -import java.util.logging.Level; -import java.util.logging.Logger; import javax.swing.JTextArea; /** @@ -34,6 +32,7 @@ public class IntegerEditor extends JTextArea implements GenericTagEditor { public IntegerEditor(Object obj, Field field) { setBackground(Color.white); setSize(100, getSize().height); + setMaximumSize(getSize()); setWrapStyleWord(true); this.obj = obj; this.field = field; diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/generictageditors/LongEditor.java b/trunk/src/com/jpexs/decompiler/flash/gui/generictageditors/LongEditor.java index a6e3b904f..be9217b0e 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/generictageditors/LongEditor.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/generictageditors/LongEditor.java @@ -18,8 +18,6 @@ package com.jpexs.decompiler.flash.gui.generictageditors; import java.awt.Color; import java.lang.reflect.Field; -import java.util.logging.Level; -import java.util.logging.Logger; import javax.swing.JTextArea; /** @@ -34,6 +32,7 @@ public class LongEditor extends JTextArea implements GenericTagEditor { public LongEditor(Object obj, Field field) { setBackground(Color.white); setSize(100, getSize().height); + setMaximumSize(getSize()); setWrapStyleWord(true); this.obj = obj; this.field = field; diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/generictageditors/ShortEditor.java b/trunk/src/com/jpexs/decompiler/flash/gui/generictageditors/ShortEditor.java index 78581cf88..b08922c9f 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/generictageditors/ShortEditor.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/generictageditors/ShortEditor.java @@ -18,8 +18,6 @@ package com.jpexs.decompiler.flash.gui.generictageditors; import java.awt.Color; import java.lang.reflect.Field; -import java.util.logging.Level; -import java.util.logging.Logger; import javax.swing.JTextArea; /** @@ -34,6 +32,7 @@ public class ShortEditor extends JTextArea implements GenericTagEditor { public ShortEditor(Object obj, Field field) { setBackground(Color.white); setSize(100, getSize().height); + setMaximumSize(getSize()); setWrapStyleWord(true); this.obj = obj; this.field = field;