From 727d7a74e50af2ae29f8d4773274f3402824375d Mon Sep 17 00:00:00 2001 From: Honfika Date: Fri, 20 Dec 2013 16:27:25 +0100 Subject: [PATCH] prepare for Issue #350 (Allow to open multiple SWF files into the same ffdec instance), some action commands moved to constants --- .../com/jpexs/decompiler/flash/FrameNode.java | 8 +- trunk/src/com/jpexs/decompiler/flash/SWF.java | 2 +- .../decompiler/flash/SWFInputStream.java | 16 +- .../decompiler/flash/gui/FontEmbedDialog.java | 11 +- .../decompiler/flash/gui/ImagePanel.java | 6 +- .../flash/gui/LoadFromCacheFrame.java | 16 +- .../flash/gui/LoadFromMemoryFrame.java | 21 +- .../jpexs/decompiler/flash/gui/MainFrame.java | 689 +++--------------- .../decompiler/flash/gui/MainFrameRibbon.java | 12 +- .../jpexs/decompiler/flash/gui/ModeFrame.java | 38 +- .../flash/gui/NewVersionDialog.java | 9 +- .../decompiler/flash/gui/RenameDialog.java | 11 +- .../jpexs/decompiler/flash/gui/SWFRoot.java | 9 +- .../decompiler/flash/gui/SearchDialog.java | 9 +- .../flash/gui/SelectLanguageDialog.java | 11 +- .../decompiler/flash/gui/TagTreeModel.java | 178 ++++- .../jpexs/decompiler/flash/gui/TagType.java | 41 ++ .../decompiler/flash/gui/abc/ABCPanel.java | 10 +- .../flash/gui/abc/DeobfuscationDialog.java | 23 +- .../decompiler/flash/gui/abc/DetailPanel.java | 65 +- .../flash/gui/abc/MethodCodePanel.java | 33 +- .../flash/gui/abc/NewTraitDialog.java | 11 +- .../decompiler/flash/gui/abc/UsageFrame.java | 22 +- .../flash/gui/action/ActionPanel.java | 57 +- .../flash/gui/player/PlayerControls.java | 11 +- .../flash/gui/proxy/ProxyFrame.java | 108 +-- .../flash/tags/DefineButton2Tag.java | 2 +- .../flash/tags/PlaceObject2Tag.java | 2 +- .../flash/tags/PlaceObject3Tag.java | 2 +- .../flash/tags/PlaceObject4Tag.java | 2 +- .../com/jpexs/decompiler/flash/tags/Tag.java | 4 + .../flash/tags/base/ContainerItem.java | 4 + .../flash/types/BUTTONCONDACTION.java | 10 +- .../flash/types/CLIPACTIONRECORD.java | 11 +- trunk/src/com/jpexs/helpers/Helper.java | 24 +- 35 files changed, 660 insertions(+), 828 deletions(-) create mode 100644 trunk/src/com/jpexs/decompiler/flash/gui/TagType.java diff --git a/trunk/src/com/jpexs/decompiler/flash/FrameNode.java b/trunk/src/com/jpexs/decompiler/flash/FrameNode.java index 908bbd632..54f7e209d 100644 --- a/trunk/src/com/jpexs/decompiler/flash/FrameNode.java +++ b/trunk/src/com/jpexs/decompiler/flash/FrameNode.java @@ -22,16 +22,22 @@ package com.jpexs.decompiler.flash; */ public class FrameNode { + private SWF swf; private int frame; private Object parent; private boolean display; - public FrameNode(int frame, Object parent, boolean display) { + public FrameNode(SWF swf, int frame, Object parent, boolean display) { + this.swf = swf; this.frame = frame; this.parent = parent; this.display = display; } + public SWF getSwf() { + return swf; + } + public boolean isDisplayed() { return display; } diff --git a/trunk/src/com/jpexs/decompiler/flash/SWF.java b/trunk/src/com/jpexs/decompiler/flash/SWF.java index c3f0fc373..bde7218b7 100644 --- a/trunk/src/com/jpexs/decompiler/flash/SWF.java +++ b/trunk/src/com/jpexs/decompiler/flash/SWF.java @@ -781,7 +781,7 @@ public final class SWF { } TagNode addNode = null; if (t instanceof ShowFrameTag) { - TagNode tti = new TagNode(new FrameNode(frame, parent, false)); + TagNode tti = new TagNode(new FrameNode(t.getSwf(), frame, parent, false)); for (int r = ret.size() - 1; r >= 0; r--) { if (!(ret.get(r).tag instanceof DefineSpriteTag)) { diff --git a/trunk/src/com/jpexs/decompiler/flash/SWFInputStream.java b/trunk/src/com/jpexs/decompiler/flash/SWFInputStream.java index 2affedd3f..ba4eb640c 100644 --- a/trunk/src/com/jpexs/decompiler/flash/SWFInputStream.java +++ b/trunk/src/com/jpexs/decompiler/flash/SWFInputStream.java @@ -1444,8 +1444,8 @@ public class SWFInputStream extends InputStream { * @return CLIPACTIONRECORD value * @throws IOException */ - public CLIPACTIONRECORD readCLIPACTIONRECORD() throws IOException { - CLIPACTIONRECORD ret = new CLIPACTIONRECORD(this, version, getPos()); + public CLIPACTIONRECORD readCLIPACTIONRECORD(SWF swf) throws IOException { + CLIPACTIONRECORD ret = new CLIPACTIONRECORD(swf, this, version, getPos()); if (ret.eventFlags.isClear()) { return null; } @@ -1459,13 +1459,13 @@ public class SWFInputStream extends InputStream { * @return CLIPACTIONS value * @throws IOException */ - public CLIPACTIONS readCLIPACTIONS() throws IOException { + public CLIPACTIONS readCLIPACTIONS(SWF swf) throws IOException { CLIPACTIONS ret = new CLIPACTIONS(); readUI16();//reserved ret.allEventFlags = readCLIPEVENTFLAGS(); CLIPACTIONRECORD cr; ret.clipActionRecords = new ArrayList<>(); - while ((cr = readCLIPACTIONRECORD()) != null) { + while ((cr = readCLIPACTIONRECORD(swf)) != null) { ret.clipActionRecords.add(cr); } return ret; @@ -1809,10 +1809,10 @@ public class SWFInputStream extends InputStream { * @return List of BUTTONCONDACTION values * @throws IOException */ - public List readBUTTONCONDACTIONList() throws IOException { + public List readBUTTONCONDACTIONList(SWF swf) throws IOException { List ret = new ArrayList<>(); BUTTONCONDACTION bc; - while (!(bc = readBUTTONCONDACTION()).isLast) { + while (!(bc = readBUTTONCONDACTION(swf)).isLast) { ret.add(bc); } ret.add(bc); @@ -1825,8 +1825,8 @@ public class SWFInputStream extends InputStream { * @return BUTTONCONDACTION value * @throws IOException */ - public BUTTONCONDACTION readBUTTONCONDACTION() throws IOException { - BUTTONCONDACTION ret = new BUTTONCONDACTION(this, version, getPos()); + public BUTTONCONDACTION readBUTTONCONDACTION(SWF swf) throws IOException { + BUTTONCONDACTION ret = new BUTTONCONDACTION(swf, this, version, getPos()); //ret.actions = readActionList(); return ret; } diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/FontEmbedDialog.java b/trunk/src/com/jpexs/decompiler/flash/gui/FontEmbedDialog.java index 3907c0230..09eb66d64 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/FontEmbedDialog.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/FontEmbedDialog.java @@ -47,6 +47,9 @@ import javax.swing.JTextField; */ public class FontEmbedDialog extends AppDialog implements ActionListener { + static final String ACTION_OK = "OK"; + static final String ACTION_CANCEL = "CANCEL"; + private JComboBox sourceFont; private JCheckBox[] rangeCheckboxes; private String rangeNames[]; @@ -130,10 +133,10 @@ public class FontEmbedDialog extends AppDialog implements ActionListener { JPanel buttonsPanel = new JPanel(new FlowLayout()); JButton okButton = new JButton(AppStrings.translate("button.ok")); - okButton.setActionCommand("OK"); + okButton.setActionCommand(ACTION_OK); okButton.addActionListener(this); JButton cancelButton = new JButton(AppStrings.translate("button.cancel")); - cancelButton.setActionCommand("CANCEL"); + cancelButton.setActionCommand(ACTION_CANCEL); cancelButton.addActionListener(this); buttonsPanel.add(okButton); buttonsPanel.add(cancelButton); @@ -198,11 +201,11 @@ public class FontEmbedDialog extends AppDialog implements ActionListener { @Override public void actionPerformed(ActionEvent e) { switch (e.getActionCommand()) { - case "OK": + case ACTION_OK: result = true; setVisible(false); break; - case "CANCEL": + case ACTION_CANCEL: result = false; setVisible(false); break; diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/ImagePanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/ImagePanel.java index b1862bf58..0aaaf5ce7 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/ImagePanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/ImagePanel.java @@ -38,6 +38,8 @@ import javax.swing.JPanel; public final class ImagePanel extends JPanel implements ActionListener, FlashDisplay { + static final String ACTION_SELECT_COLOR = "SELECTCOLOR"; + public JLabel label = new JLabel(); public DrawableTag drawable; private Timer timer; @@ -68,7 +70,7 @@ public final class ImagePanel extends JPanel implements ActionListener, FlashDis JPanel buttonsPanel = new JPanel(new FlowLayout()); JButton selectColorButton = new JButton(View.getIcon("color16")); selectColorButton.addActionListener(this); - selectColorButton.setActionCommand("SELECTCOLOR"); + selectColorButton.setActionCommand(ACTION_SELECT_COLOR); selectColorButton.setToolTipText(AppStrings.translate("button.selectcolor.hint")); buttonsPanel.add(selectColorButton); bottomPanel.add(buttonsPanel, BorderLayout.EAST); @@ -77,7 +79,7 @@ public final class ImagePanel extends JPanel implements ActionListener, FlashDis @Override public void actionPerformed(ActionEvent e) { - if ("SELECTCOLOR".equals(e.getActionCommand())) { + if (e.getActionCommand() == ACTION_SELECT_COLOR) { View.execInEventDispatch(new Runnable() { @Override public void run() { diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromCacheFrame.java b/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromCacheFrame.java index 87d794905..bc90e5de1 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromCacheFrame.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromCacheFrame.java @@ -55,6 +55,10 @@ import javax.swing.filechooser.FileFilter; */ public class LoadFromCacheFrame extends AppFrame implements ActionListener { + static final String ACTION_OPEN = "OPEN"; + static final String ACTION_SAVE = "SAVE"; + static final String ACTION_REFRESH = "REFRESH"; + private JList list; private JTextField searchField; private List caches; @@ -105,17 +109,17 @@ public class LoadFromCacheFrame extends AppFrame implements ActionListener { JPanel buttonsPanel = new JPanel(new FlowLayout()); openButton = new JButton(translate("button.open")); - openButton.setActionCommand("OPEN"); + openButton.setActionCommand(ACTION_OPEN); openButton.addActionListener(this); buttonsPanel.add(openButton); saveButton = new JButton(translate("button.save")); - saveButton.setActionCommand("SAVE"); + saveButton.setActionCommand(ACTION_SAVE); saveButton.addActionListener(this); buttonsPanel.add(saveButton); refreshButton = new JButton(translate("button.refresh")); - refreshButton.setActionCommand("REFRESH"); + refreshButton.setActionCommand(ACTION_REFRESH); refreshButton.addActionListener(this); buttonsPanel.add(refreshButton); @@ -228,13 +232,13 @@ public class LoadFromCacheFrame extends AppFrame implements ActionListener { @Override public void actionPerformed(ActionEvent e) { switch (e.getActionCommand()) { - case "REFRESH": + case ACTION_REFRESH: refresh(); break; - case "OPEN": + case ACTION_OPEN: openSWF(); break; - case "SAVE": + case ACTION_SAVE: List selected = list.getSelectedValuesList(); if (!selected.isEmpty()) { JFileChooser fc = new JFileChooser(); diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromMemoryFrame.java b/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromMemoryFrame.java index 0d1f4ade2..4a2e8dba9 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromMemoryFrame.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/LoadFromMemoryFrame.java @@ -73,6 +73,11 @@ import javax.swing.filechooser.FileFilter; */ public class LoadFromMemoryFrame extends AppFrame implements ActionListener { + static final String ACTION_SELECT_PROCESS = "SELECTPROCESS"; + static final String ACTION_REFRESH_PROCESS_LIST = "REFRESHPROCESSLIST"; + static final String ACTION_OPEN_SWF = "OPENSWF"; + static final String ACTION_SAVE = "SAVE"; + private List processlist; private List foundIs; private com.jpexs.process.Process selProcess; @@ -292,10 +297,10 @@ public class LoadFromMemoryFrame extends AppFrame implements ActionListener { leftPanel.add(new JScrollPane(list), BorderLayout.CENTER); JPanel leftButtonsPanel = new JPanel(new FlowLayout()); JButton selectButton = new JButton(translate("button.select")); - selectButton.setActionCommand("SELECTPROCESS"); + selectButton.setActionCommand(ACTION_SELECT_PROCESS); selectButton.addActionListener(this); JButton refreshButton = new JButton(translate("button.refresh")); - refreshButton.setActionCommand("REFRESHPROCESSLIST"); + refreshButton.setActionCommand(ACTION_REFRESH_PROCESS_LIST); refreshButton.addActionListener(this); leftButtonsPanel.add(selectButton); leftButtonsPanel.add(refreshButton); @@ -305,11 +310,11 @@ public class LoadFromMemoryFrame extends AppFrame implements ActionListener { rightPanel.add(new JScrollPane(listRes), BorderLayout.CENTER); JPanel rightButtonsPanel = new JPanel(new FlowLayout()); JButton openButton = new JButton(translate("button.open")); - openButton.setActionCommand("OPENSWF"); + openButton.setActionCommand(ACTION_OPEN_SWF); openButton.addActionListener(this); JButton saveButton = new JButton(translate("button.save")); - saveButton.setActionCommand("SAVE"); + saveButton.setActionCommand(ACTION_SAVE); saveButton.addActionListener(this); rightButtonsPanel.add(openButton); @@ -336,16 +341,16 @@ public class LoadFromMemoryFrame extends AppFrame implements ActionListener { @Override public void actionPerformed(ActionEvent e) { switch (e.getActionCommand()) { - case "SELECTPROCESS": + case ACTION_SELECT_PROCESS: selectProcess(); break; - case "OPENSWF": + case ACTION_OPEN_SWF: openSWF(); break; - case "REFRESHPROCESSLIST": + case ACTION_REFRESH_PROCESS_LIST: refreshList(); break; - case "SAVE": + case ACTION_SAVE: if (foundIs == null) { return; } diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/MainFrame.java b/trunk/src/com/jpexs/decompiler/flash/gui/MainFrame.java index d03ed52bf..e6eb177ff 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/MainFrame.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/MainFrame.java @@ -203,7 +203,7 @@ import org.pushingpixels.flamingo.internal.ui.ribbon.appmenu.JRibbonApplicationM */ public final class MainFrame extends AppRibbonFrame implements ActionListener, TreeSelectionListener, Freed { - private SWF swf; + private List swfs; public ABCPanel abcPanel; public ActionPanel actionPanel; private MainFrameStatusPanel statusPanel; @@ -437,7 +437,7 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T imageButtonsPanel.setVisible(visible); } - public MainFrame(SWF swf) { + public MainFrame(final SWF swf) { super(); List objs = new ArrayList<>(); @@ -523,7 +523,7 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T }); setTitle(ApplicationInfo.applicationVerName + ((swf != null && Configuration.displayFileName.get()) ? " - " + Main.getFileTitle() : "")); - this.swf = swf; + this.swfs = Arrays.asList(swf); java.awt.Container cnt = getContentPane(); cnt.setLayout(new BorderLayout()); cnt.add(getRibbon(), BorderLayout.NORTH); @@ -547,7 +547,7 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T if (swf == null) { tagTree = new JTree((TreeModel) null); } else { - tagTree = new JTree(new TagTreeModel(createTagList(objs, null), new SWFRoot((new File(Main.file)).getName()))); + tagTree = new JTree(new TagTreeModel(this, swfs, abcPanel)); } tagTree.addTreeSelectionListener(this); tagTree.setBackground(Color.white); @@ -598,7 +598,7 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T try { File ftemp = new File(tempDir); - files = exportSelection(errorHandler, tempDir, export); + files = exportSelection(swf, errorHandler, tempDir, export); files.clear(); File[] fs = ftemp.listFiles(); @@ -664,14 +664,15 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T if (val instanceof TagNode) { val = ((TagNode) val).tag; } - String type = getTagType(val); + TagType type = getTagType(val); if (row == 0) { setIcon(View.getIcon("flash16")); } else if (type != null) { - if (type.equals("folder") && expanded) { - type = "folderopen"; + if (type == TagType.FOLDER && expanded) { + type = TagType.FOLDER_OPEN; } - setIcon(View.getIcon(type + "16")); + String tagTypeStr = type.toString().toLowerCase().replace("_", ""); + setIcon(View.getIcon(tagTypeStr + "16")); //setToolTipText("This book is in the Tutorial series."); } else { //setToolTipText(null); //no tool tip @@ -1077,7 +1078,7 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T splitPos = splitPane2.getDividerLocation(); splitsInited = true; if (Configuration.gotoMainClassOnStartup.get()) { - gotoDocumentClass(); + gotoDocumentClass(getCurrentSwf()); } } }); @@ -1211,18 +1212,18 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T return ret; } - public String getTagType(Object t) { + public static TagType getTagType(Object t) { if ((t instanceof DefineFontTag) || (t instanceof DefineFont2Tag) || (t instanceof DefineFont3Tag) || (t instanceof DefineFont4Tag) || (t instanceof DefineCompactedFont)) { - return "font"; + return TagType.FONT; } if ((t instanceof DefineTextTag) || (t instanceof DefineText2Tag) || (t instanceof DefineEditTextTag)) { - return "text"; + return TagType.TEXT; } if ((t instanceof DefineBitsTag) @@ -1231,88 +1232,73 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T || (t instanceof DefineBitsJPEG4Tag) || (t instanceof DefineBitsLosslessTag) || (t instanceof DefineBitsLossless2Tag)) { - return "image"; + return TagType.IMAGE; } if ((t instanceof DefineShapeTag) || (t instanceof DefineShape2Tag) || (t instanceof DefineShape3Tag) || (t instanceof DefineShape4Tag)) { - return "shape"; + return TagType.SHAPE; } if ((t instanceof DefineMorphShapeTag) || (t instanceof DefineMorphShape2Tag)) { - return "morphshape"; + return TagType.MORPH_SHAPE; } if (t instanceof DefineSpriteTag) { - return "sprite"; + return TagType.SPRITE; } if ((t instanceof DefineButtonTag) || (t instanceof DefineButton2Tag)) { - return "button"; + return TagType.BUTTON; } if (t instanceof ASMSource) { - return "as"; + return TagType.AS; } if (t instanceof TreeElement) { TreeElement te = (TreeElement) t; if (te.getItem() instanceof ScriptPack) { - return "as"; + return TagType.AS; } else { - return "package"; + return TagType.PACKAGE; } } if (t instanceof PackageNode) { - return "package"; + return TagType.PACKAGE; } if (t instanceof FrameNode) { - return "frame"; + return TagType.FRAME; } if (t instanceof ShowFrameTag) { - return "showframe"; + return TagType.SHOW_FRAME; } if (t instanceof DefineVideoStreamTag) { - return "movie"; + return TagType.MOVIE; } if ((t instanceof DefineSoundTag) || (t instanceof SoundStreamHeadTag) || (t instanceof SoundStreamHead2Tag)) { - return "sound"; + return TagType.SOUND; } if (t instanceof DefineBinaryDataTag) { - return "binaryData"; + return TagType.BINARY_DATA; } - return "folder"; + return TagType.FOLDER; } - public List getTagsWithType(List list, String type) { + public List getTagsWithType(List list, TagType type) { List ret = new ArrayList<>(); for (Object o : list) { - String ttype = getTagType(o); - if (type.equals(ttype)) { + TagType ttype = getTagType(o); + if (type == ttype) { ret.add(o); } } return ret; } - public List getTagNodesWithType(List list, String type, Object parent, boolean display) { - List ret = new ArrayList<>(); - int frameCnt = 0; - for (ContainerItem o : list) { - String ttype = getTagType(o); - if ("showframe".equals(ttype) && "frame".equals(type)) { - frameCnt++; - ret.add(new TagNode(new FrameNode(frameCnt, parent, display))); - } else if (type.equals(ttype)) { - ret.add(new TagNode(o)); - } - } - return ret; - } - - public void renameIdentifier(String identifier) throws InterruptedException { + public void renameIdentifier(SWF swf, String identifier) throws InterruptedException { String oldName = identifier; String newName = View.showInputDialog(translate("rename.enternew"), oldName); if (newName != null) { @@ -1421,149 +1407,12 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T return null; } - public List createTagList(List list, Object parent) { - List ret = new ArrayList<>(); - List frames = getTagNodesWithType(list, "frame", parent, true); - List shapes = getTagNodesWithType(list, "shape", parent, true); - List morphShapes = getTagNodesWithType(list, "morphshape", parent, true); - List sprites = getTagNodesWithType(list, "sprite", parent, true); - List buttons = getTagNodesWithType(list, "button", parent, true); - List images = getTagNodesWithType(list, "image", parent, true); - List fonts = getTagNodesWithType(list, "font", parent, true); - List texts = getTagNodesWithType(list, "text", parent, true); - List movies = getTagNodesWithType(list, "movie", parent, true); - List sounds = getTagNodesWithType(list, "sound", parent, true); - List binaryData = getTagNodesWithType(list, "binaryData", parent, true); - List actionScript = new ArrayList<>(); - - for (int i = 0; i < sounds.size(); i++) { - if (sounds.get(i).tag instanceof SoundStreamHeadTypeTag) { - List blocks = new ArrayList<>(); - SWF.populateSoundStreamBlocks(list, (Tag) sounds.get(i).tag, blocks); - if (blocks.isEmpty()) { - sounds.remove(i); - i--; - } - } - } - - for (TagNode n : sprites) { - n.subItems = getTagNodesWithType(((DefineSpriteTag) n.tag).subTags, "frame", n.tag, true); - } - - List exportAssetsTags = new ArrayList<>(); - for (Object t : list) { - if (t instanceof ExportAssetsTag) { - exportAssetsTags.add((ExportAssetsTag) t); - } - /*if (t instanceof ASMSource) { - TagNode tti = new TagNode(t); - ret.add(tti); - } else */ - if (t instanceof Container) { - TagNode tti = new TagNode(t); - if (((Container) t).getItemCount() > 0) { - List subItems = ((Container) t).getSubItems(); - tti.subItems = createTagList(subItems, t); - } - //ret.add(tti); - } - } - - actionScript = SWF.createASTagList(list, null); - TagNode textsNode = new TagNode(translate("node.texts")); - textsNode.subItems.addAll(texts); - - TagNode imagesNode = new TagNode(translate("node.images")); - imagesNode.subItems.addAll(images); - - TagNode moviesNode = new TagNode(translate("node.movies")); - moviesNode.subItems.addAll(movies); - - TagNode soundsNode = new TagNode(translate("node.sounds")); - soundsNode.subItems.addAll(sounds); - - - TagNode binaryDataNode = new TagNode(translate("node.binaryData")); - binaryDataNode.subItems.addAll(binaryData); - - TagNode fontsNode = new TagNode(translate("node.fonts")); - fontsNode.subItems.addAll(fonts); - - - TagNode spritesNode = new TagNode(translate("node.sprites")); - spritesNode.subItems.addAll(sprites); - - TagNode shapesNode = new TagNode(translate("node.shapes")); - shapesNode.subItems.addAll(shapes); - - TagNode morphShapesNode = new TagNode(translate("node.morphshapes")); - morphShapesNode.subItems.addAll(morphShapes); - - TagNode buttonsNode = new TagNode(translate("node.buttons")); - buttonsNode.subItems.addAll(buttons); - - TagNode framesNode = new TagNode(translate("node.frames")); - framesNode.subItems.addAll(frames); - - TagNode actionScriptNode = new TagNode(translate("node.scripts")); - actionScriptNode.mark = "scripts"; - actionScriptNode.subItems.addAll(actionScript); - - if (!shapesNode.subItems.isEmpty()) { - ret.add(shapesNode); - } - if (!morphShapesNode.subItems.isEmpty()) { - ret.add(morphShapesNode); - } - if (!spritesNode.subItems.isEmpty()) { - ret.add(spritesNode); - } - if (!textsNode.subItems.isEmpty()) { - ret.add(textsNode); - } - if (!imagesNode.subItems.isEmpty()) { - ret.add(imagesNode); - } - if (!moviesNode.subItems.isEmpty()) { - ret.add(moviesNode); - } - if (!soundsNode.subItems.isEmpty()) { - ret.add(soundsNode); - } - if (!buttonsNode.subItems.isEmpty()) { - ret.add(buttonsNode); - } - if (!fontsNode.subItems.isEmpty()) { - ret.add(fontsNode); - } - if (!binaryDataNode.subItems.isEmpty()) { - ret.add(binaryDataNode); - } - if (!framesNode.subItems.isEmpty()) { - ret.add(framesNode); - } - - - - - if (abcPanel != null) { - actionScriptNode.subItems.clear(); - actionScriptNode.tag = abcPanel.classTree.getModel(); - } - if ((!actionScriptNode.subItems.isEmpty()) || (abcPanel != null)) { - ret.add(actionScriptNode); - } - - return ret; - } - public boolean confirmExperimental() { return View.showConfirmDialog(null, translate("message.confirm.experimental"), translate("message.warning"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.OK_OPTION; } private SearchDialog searchDialog; - public List exportSelection(AbortRetryIgnoreHandler handler, String selFile, ExportDialog export) throws IOException { + public List exportSelection(SWF swf, AbortRetryIgnoreHandler handler, String selFile, ExportDialog export) throws IOException { final ExportMode exportMode = ExportMode.get(export.getOption(ExportDialog.OPTION_ACTIONSCRIPT)); final boolean isMp3OrWav = export.getOption(ExportDialog.OPTION_SOUNDS) == 0; final boolean isFormatted = export.getOption(ExportDialog.OPTION_TEXTS) == 1; @@ -1589,25 +1438,25 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T for (Object d : sel) { if (d instanceof TagNode) { TagNode n = (TagNode) d; - if ("image".equals(getTagType(n.tag))) { + if (getTagType(n.tag) == TagType.IMAGE) { images.add((Tag) n.tag); } - if ("shape".equals(getTagType(n.tag))) { + if (getTagType(n.tag) == TagType.SHAPE) { shapes.add((Tag) n.tag); } - if ("as".equals(getTagType(n.tag))) { + if (getTagType(n.tag) == TagType.AS) { actionNodes.add(n); } - if ("movie".equals(getTagType(n.tag))) { + if (getTagType(n.tag) == TagType.MOVIE) { movies.add((Tag) n.tag); } - if ("sound".equals(getTagType(n.tag))) { + if (getTagType(n.tag) == TagType.SOUND) { sounds.add((Tag) n.tag); } - if ("binaryData".equals(getTagType(n.tag))) { + if (getTagType(n.tag) == TagType.BINARY_DATA) { binaryData.add((Tag) n.tag); } - if ("text".equals(getTagType(n.tag))) { + if (getTagType(n.tag) == TagType.TEXT) { texts.add((Tag) n.tag); } } @@ -1642,6 +1491,10 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T return ret; } + public SWF getCurrentSwf() { + return swfs == null || swfs.isEmpty() ? null : swfs.get(0); + } + private void clearCache() { if (abcPanel != null) { abcPanel.decompiledTextArea.clearScriptCache(); @@ -1651,7 +1504,7 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T } } - public void gotoDocumentClass() { + public void gotoDocumentClass(SWF swf) { if (swf == null) { return; } @@ -1741,7 +1594,7 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T doFilter(); } - public void renameOneIdentifier() { + public void renameOneIdentifier(final SWF swf) { if (swf.fileAttributes.actionScript3) { final int multiName = abcPanel.decompiledTextArea.getMultinameUnderCursor(); if (multiName > 0) { @@ -1770,7 +1623,7 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T public Void doInBackground() throws Exception { Main.startWork(translate("work.renaming") + "..."); try { - renameIdentifier(identifier); + renameIdentifier(swf, identifier); } catch (InterruptedException ex) { Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex); } @@ -1788,7 +1641,7 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T } } - public void exportFla() { + public void exportFla(final SWF swf) { JFileChooser fc = new JFileChooser(); String selDir = Configuration.lastOpenDir.get(); fc.setCurrentDirectory(new File(selDir)); @@ -1863,7 +1716,7 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T } } - public void export(final boolean onlySel) { + public void export(final SWF swf, final boolean onlySel) { final ExportDialog export = new ExportDialog(); export.setVisible(true); if (!export.cancelled) { @@ -1885,7 +1738,7 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T public Void doInBackground() throws Exception { try { if (onlySel) { - exportSelection(errorHandler, selFile, export); + exportSelection(swf, errorHandler, selFile, export); } else { swf.exportImages(errorHandler, selFile + File.separator + "images"); swf.exportShapes(errorHandler, selFile + File.separator + "shapes"); @@ -1961,7 +1814,7 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T } } - public void renameIdentifiers() { + public void renameIdentifiers(final SWF swf) { if (confirmExperimental()) { final RenameType renameType = new RenameDialog().display(); if (renameType != null) { @@ -2065,7 +1918,7 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T } } - public void removeNonScripts() { + public void removeNonScripts(SWF swf) { List tags = new ArrayList<>(swf.tags); for (Tag tag : tags) { System.out.println(tag.getClass()); @@ -2135,7 +1988,7 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T byte[] data = Helper.readFile(selfile.getAbsolutePath()); try { it.setImage(data); - swf.clearImageCache(); + it.getSwf().clearImageCache(); } catch (IOException ex) { Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, "Invalid image", ex); View.showMessageDialog(null, translate("error.image.invalid"), translate("error"), JOptionPane.ERROR_MESSAGE); @@ -2190,14 +2043,14 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T if (tagsToRemove.size() == 1) { Tag tag = tagsToRemove.get(0); if (View.showConfirmDialog(this, translate("message.confirm.remove").replace("%item%", tag.toString()), translate("message.confirm"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) { - swf.removeTag(tag); + tag.getSwf().removeTag(tag); showCard(CARDEMPTYPANEL); refreshTree(); } } else if (tagsToRemove.size() > 1) { if (View.showConfirmDialog(this, translate("message.confirm.removemultiple").replace("%count%", Integer.toString(tagsToRemove.size())), translate("message.confirm"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) { for (Tag tag : tagsToRemove) { - swf.removeTag(tag); + tag.getSwf().removeTag(tag); } showCard(CARDEMPTYPANEL); refreshTree(); @@ -2212,8 +2065,9 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T break; case ACTION_SAVE_TEXT: if (oldValue instanceof TextTag) { + TextTag textTag = (TextTag) oldValue; try { - if (((TextTag) oldValue).setFormattedText(new MissingCharacterHandler() { + if (textTag.setFormattedText(new MissingCharacterHandler() { @Override public boolean handle(FontTag font, List tags, char character) { String fontName = fontPanel.sourceFontsMap.get(font.getFontId()); @@ -2230,7 +2084,7 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T return true; } - }, swf.tags, textValue.getText(), fontPanel.getSelectedFont())) { + }, textTag.getSwf().tags, textValue.getText(), fontPanel.getSelectedFont())) { setEditText(false); } } catch (ParseException ex) { @@ -2247,7 +2101,7 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T switch (e.getActionCommand()) { case MainFrameRibbon.ACTION_EXPORT_SEL: - export(true); + export(getCurrentSwf(), true); break; } } @@ -2387,6 +2241,8 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T if ((tagObj instanceof SWFRoot)) { + SWFRoot swfRoot = (SWFRoot) tagObj; + SWF swf = swfRoot.getSwf(); if (mainRibbon.isInternalFlashViewerSelected()) { showCard(CARDSWFPREVIEWPANEL); swfPreviewPanel.load(swf); @@ -2427,19 +2283,23 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T showCard(CARDACTIONSCRIPTPANEL); actionPanel.setSource((ASMSource) tagObj, !forceReload); } else if (tagObj instanceof ImageTag) { - showHideImageReplaceButton(((ImageTag) tagObj).importSupported()); + ImageTag imageTag = (ImageTag) tagObj; + showHideImageReplaceButton(imageTag.importSupported()); showCard(CARDIMAGEPANEL); - imagePanel.setImage(((ImageTag) tagObj).getImage(swf.tags)); + imagePanel.setImage(imageTag.getImage(imageTag.getSwf().tags)); } else if ((tagObj instanceof DrawableTag) && (!(tagObj instanceof TextTag)) && (!(tagObj instanceof FontTag)) && (mainRibbon.isInternalFlashViewerSelected())) { + Tag tag = (Tag) tagObj; showCard(CARDDRAWPREVIEWPANEL); - previewImagePanel.setDrawable((DrawableTag) tagObj, swf, characters, 50/*FIXME*/); + previewImagePanel.setDrawable((DrawableTag) tag, tag.getSwf(), characters, 50/*FIXME*/); } else if ((tagObj instanceof FontTag) && (mainRibbon.isInternalFlashViewerSelected())) { + Tag tag = (Tag) tagObj; showCard(CARDFLASHPANEL); - previewImagePanel.setDrawable((DrawableTag) tagObj, swf, characters, 50/*FIXME*/); + previewImagePanel.setDrawable((DrawableTag) tag, tag.getSwf(), characters, 50/*FIXME*/); showFontTag((FontTag) tagObj); } else if (tagObj instanceof FrameNode && ((FrameNode) tagObj).isDisplayed() && (mainRibbon.isInternalFlashViewerSelected())) { showCard(CARDDRAWPREVIEWPANEL); FrameNode fn = (FrameNode) tagObj; + SWF swf = fn.getSwf(); List controlTags = swf.tags; int containerId = 0; RECT rect = swf.displayRect; @@ -2455,379 +2315,12 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T ((CardLayout) viewerCards.getLayout()).show(viewerCards, FLASH_VIEWER_CARD); createAndShowTempSwf(tagObj); - try { - if (tempFile != null) { - tempFile.delete(); - } - tempFile = File.createTempFile("temp", ".swf"); - tempFile.deleteOnExit(); - - Color backgroundColor = View.swfBackgroundColor; - if (tagObj instanceof FontTag) { //Fonts are always black on white - backgroundColor = View.DEFAULT_BACKGROUND_COLOR; - } - int frameCount = 1; - int frameRate = swf.frameRate; - HashMap videoFrames = new HashMap<>(); - DefineVideoStreamTag vs = null; - if (tagObj instanceof DefineVideoStreamTag) { - vs = (DefineVideoStreamTag) tagObj; - swf.populateVideoFrames(vs.getCharacterId(), swf.tags, videoFrames); - frameCount = videoFrames.size(); - } - - List soundFrames = new ArrayList<>(); - if (tagObj instanceof SoundStreamHeadTypeTag) { - SWF.populateSoundStreamBlocks(swf.tags, (Tag) tagObj, soundFrames); - frameCount = soundFrames.size(); - } - - if ((tagObj instanceof DefineMorphShapeTag) || (tagObj instanceof DefineMorphShape2Tag)) { - frameCount = 100; - frameRate = 50; - } - - if (tagObj instanceof DefineSoundTag) { - frameCount = 1; - } - - byte[] data; - try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { - SWFOutputStream sos2 = new SWFOutputStream(baos, 10); - int width = swf.displayRect.Xmax - swf.displayRect.Xmin; - int height = swf.displayRect.Ymax - swf.displayRect.Ymin; - sos2.writeRECT(swf.displayRect); - sos2.writeUI8(0); - sos2.writeUI8(frameRate); - sos2.writeUI16(frameCount); //framecnt - - /*FileAttributesTag fa = new FileAttributesTag(); - sos2.writeTag(fa); - */ - if (tagObj instanceof FrameNode) { - FrameNode fn = (FrameNode) tagObj; - if (fn.getParent() == null) { - for (Tag t : swf.tags) { - if (t instanceof SetBackgroundColorTag) { - backgroundColor = ((SetBackgroundColorTag) t).backgroundColor.toColor(); - break; - } - } - } - } - - sos2.writeTag(new SetBackgroundColorTag(null, new RGB(backgroundColor))); - - if (tagObj instanceof FrameNode) { - FrameNode fn = (FrameNode) tagObj; - Object parent = fn.getParent(); - List subs = new ArrayList<>(); - if (parent == null) { - subs.addAll(swf.tags); - } else { - if (parent instanceof Container) { - subs = ((Container) parent).getSubItems(); - } - } - List doneCharacters = new ArrayList<>(); - int frameCnt = 1; - for (Object o : subs) { - if (o instanceof ShowFrameTag) { - frameCnt++; - continue; - } - if (frameCnt > fn.getFrame()) { - break; - } - Tag t = (Tag) o; - Set needed = t.getDeepNeededCharacters(characters, new ArrayList()); - for (int n : needed) { - if (!doneCharacters.contains(n)) { - sos2.writeTag(classicTag(characters.get(n))); - doneCharacters.add(n); - } - } - if (t instanceof CharacterTag) { - doneCharacters.add(((CharacterTag) t).getCharacterId()); - } - sos2.writeTag(classicTag(t)); - - if (parent != null) { - if (t instanceof PlaceObjectTypeTag) { - PlaceObjectTypeTag pot = (PlaceObjectTypeTag) t; - int chid = pot.getCharacterId(); - int depth = pot.getDepth(); - MATRIX mat = pot.getMatrix(); - if (mat == null) { - mat = new MATRIX(); - } - mat = (MATRIX) Helper.deepCopy(mat); - if (parent instanceof BoundedTag) { - RECT r = ((BoundedTag) parent).getRect(characters, new Stack()); - mat.translateX = mat.translateX + width / 2 - r.getWidth() / 2; - mat.translateY = mat.translateY + height / 2 - r.getHeight() / 2; - } else { - mat.translateX += width / 2; - mat.translateY += height / 2; - } - sos2.writeTag(new PlaceObject2Tag(null, false, false, false, false, false, true, false, true, depth, chid, mat, null, 0, null, 0, null)); - - } - } - } - sos2.writeTag(new ShowFrameTag(null)); - } else { - - if (tagObj instanceof DefineBitsTag) { - if (jtt != null) { - sos2.writeTag(jtt); - } - } else if (tagObj instanceof AloneTag) { - } else { - Set needed = ((Tag) tagObj).getDeepNeededCharacters(characters, new ArrayList()); - for (int n : needed) { - sos2.writeTag(classicTag(characters.get(n))); - } - } - - sos2.writeTag(classicTag((Tag) tagObj)); - - int chtId = 0; - if (tagObj instanceof CharacterTag) { - chtId = ((CharacterTag) tagObj).getCharacterId(); - } - - MATRIX mat = new MATRIX(); - mat.hasRotate = false; - mat.hasScale = false; - mat.translateX = 0; - mat.translateY = 0; - if (tagObj instanceof BoundedTag) { - RECT r = ((BoundedTag) tagObj).getRect(characters, new Stack()); - mat.translateX = -r.Xmin; - mat.translateY = -r.Ymin; - mat.translateX = mat.translateX + width / 2 - r.getWidth() / 2; - mat.translateY = mat.translateY + height / 2 - r.getHeight() / 2; - } else { - mat.translateX = width / 4; - mat.translateY = height / 4; - } - if (tagObj instanceof FontTag) { - - int countGlyphs = ((FontTag) tagObj).getGlyphShapeTable().size(); - int fontId = ((FontTag) tagObj).getFontId(); - int sloupcu = (int) Math.ceil(Math.sqrt(countGlyphs)); - int radku = (int) Math.ceil(((float) countGlyphs) / ((float) sloupcu)); - int x = 0; - int y = 1; - for (int f = 0; f < countGlyphs; f++) { - if (x >= sloupcu) { - x = 0; - y++; - } - List rec = new ArrayList<>(); - TEXTRECORD tr = new TEXTRECORD(); - int textHeight = height / radku; - tr.fontId = fontId; - tr.styleFlagsHasFont = true; - tr.textHeight = textHeight; - tr.glyphEntries = new GLYPHENTRY[1]; - tr.styleFlagsHasColor = true; - tr.textColor = new RGB(0, 0, 0); - tr.glyphEntries[0] = new GLYPHENTRY(); - tr.glyphEntries[0].glyphAdvance = 0; - tr.glyphEntries[0].glyphIndex = f; - rec.add(tr); - mat.translateX = x * width / sloupcu; - mat.translateY = y * height / radku; - sos2.writeTag(new DefineTextTag(null, 999 + f, new RECT(0, width, 0, height), new MATRIX(), rec)); - sos2.writeTag(new PlaceObject2Tag(null, false, false, false, true, false, true, true, false, 1 + f, 999 + f, mat, null, 0, null, 0, null)); - x++; - } - sos2.writeTag(new ShowFrameTag(null)); - } else if ((tagObj instanceof DefineMorphShapeTag) || (tagObj instanceof DefineMorphShape2Tag)) { - sos2.writeTag(new PlaceObject2Tag(null, false, false, false, true, false, true, true, false, 1, chtId, mat, null, 0, null, 0, null)); - sos2.writeTag(new ShowFrameTag(null)); - int numFrames = 100; - for (int ratio = 0; ratio < 65536; ratio += 65536 / numFrames) { - sos2.writeTag(new PlaceObject2Tag(null, false, false, false, true, false, true, false, true, 1, chtId, mat, null, ratio, null, 0, null)); - sos2.writeTag(new ShowFrameTag(null)); - } - } else if (tagObj instanceof SoundStreamHeadTypeTag) { - for (SoundStreamBlockTag blk : soundFrames) { - sos2.writeTag(blk); - sos2.writeTag(new ShowFrameTag(null)); - } - } else if (tagObj instanceof DefineSoundTag) { - ExportAssetsTag ea = new ExportAssetsTag(); - DefineSoundTag ds = (DefineSoundTag) tagObj; - ea.tags.add(ds.soundId); - ea.names.add("my_define_sound"); - sos2.writeTag(ea); - List actions; - DoActionTag doa; - - - doa = new DoActionTag(null, new byte[]{}, SWF.DEFAULT_VERSION, 0); - actions = ASMParser.parse(0, 0, false, - "ConstantPool \"_root\" \"my_sound\" \"Sound\" \"my_define_sound\" \"attachSound\"\n" - + "Push \"_root\"\n" - + "GetVariable\n" - + "Push \"my_sound\" 0.0 \"Sound\"\n" - + "NewObject\n" - + "SetMember\n" - + "Push \"my_define_sound\" 1 \"_root\"\n" - + "GetVariable\n" - + "Push \"my_sound\"\n" - + "GetMember\n" - + "Push \"attachSound\"\n" - + "CallMethod\n" - + "Pop\n" - + "Stop", SWF.DEFAULT_VERSION, false); - doa.setActions(actions, SWF.DEFAULT_VERSION); - sos2.writeTag(doa); - sos2.writeTag(new ShowFrameTag(null)); - - - actions = ASMParser.parse(0, 0, false, - "ConstantPool \"_root\" \"my_sound\" \"Sound\" \"my_define_sound\" \"attachSound\" \"start\"\n" - + "StopSounds\n" - + "Push \"_root\"\n" - + "GetVariable\n" - + "Push \"my_sound\" 0.0 \"Sound\"\n" - + "NewObject\n" - + "SetMember\n" - + "Push \"my_define_sound\" 1 \"_root\"\n" - + "GetVariable\n" - + "Push \"my_sound\"\n" - + "GetMember\n" - + "Push \"attachSound\"\n" - + "CallMethod\n" - + "Pop\n" - + "Push 9999 0.0 2 \"_root\"\n" - + "GetVariable\n" - + "Push \"my_sound\"\n" - + "GetMember\n" - + "Push \"start\"\n" - + "CallMethod\n" - + "Pop\n" - + "Stop", SWF.DEFAULT_VERSION, false); - doa.setActions(actions, SWF.DEFAULT_VERSION); - sos2.writeTag(doa); - sos2.writeTag(new ShowFrameTag(null)); - - actions = ASMParser.parse(0, 0, false, - "ConstantPool \"_root\" \"my_sound\" \"Sound\" \"my_define_sound\" \"attachSound\" \"onSoundComplete\" \"start\" \"execParam\"\n" - + "StopSounds\n" - + "Push \"_root\"\n" - + "GetVariable\n" - + "Push \"my_sound\" 0.0 \"Sound\"\n" - + "NewObject\n" - + "SetMember\n" - + "Push \"my_define_sound\" 1 \"_root\"\n" - + "GetVariable\n" - + "Push \"my_sound\"\n" - + "GetMember\n" - + "Push \"attachSound\"\n" - + "CallMethod\n" - + "Pop\n" - + "Push \"_root\"\n" - + "GetVariable\n" - + "Push \"my_sound\"\n" - + "GetMember\n" - + "Push \"onSoundComplete\"\n" - + "DefineFunction2 \"\" 0 2 false true true false true false true false false {\n" - + "Push 0.0 register1 \"my_sound\"\n" - + "GetMember\n" - + "Push \"start\"\n" - + "CallMethod\n" - + "Pop\n" - + "}\n" - + "SetMember\n" - + "Push \"_root\"\n" - + "GetVariable\n" - + "Push \"execParam\"\n" - + "GetMember\n" - + "Push 1 \"_root\"\n" - + "GetVariable\n" - + "Push \"my_sound\"\n" - + "GetMember\n" - + "Push \"start\"\n" - + "CallMethod\n" - + "Pop\n" - + "Stop", SWF.DEFAULT_VERSION, false); - doa.setActions(actions, SWF.DEFAULT_VERSION); - sos2.writeTag(doa); - sos2.writeTag(new ShowFrameTag(null)); - - - actions = ASMParser.parse(0, 0, false, - "StopSounds\n" - + "Stop", SWF.DEFAULT_VERSION, false); - doa.setActions(actions, SWF.DEFAULT_VERSION); - sos2.writeTag(doa); - sos2.writeTag(new ShowFrameTag(null)); - - - sos2.writeTag(new ShowFrameTag(null)); - if (flashPanel != null) { - flashPanel.specialPlayback = true; - } - } else if (tagObj instanceof DefineVideoStreamTag) { - - sos2.writeTag(new PlaceObject2Tag(null, false, false, false, false, false, true, true, false, 1, chtId, mat, null, 0, null, 0, null)); - List frs = new ArrayList<>(videoFrames.values()); - Collections.sort(frs, new Comparator() { - @Override - public int compare(VideoFrameTag o1, VideoFrameTag o2) { - return o1.frameNum - o2.frameNum; - } - }); - boolean first = true; - int ratio = 0; - for (VideoFrameTag f : frs) { - if (!first) { - ratio++; - sos2.writeTag(new PlaceObject2Tag(null, false, false, false, true, false, false, false, true, 1, 0, null, null, ratio, null, 0, null)); - } - sos2.writeTag(f); - sos2.writeTag(new ShowFrameTag(null)); - first = false; - } - } else { - sos2.writeTag(new PlaceObject2Tag(null, false, false, false, true, false, true, true, false, 1, chtId, mat, null, 0, null, 0, null)); - sos2.writeTag(new ShowFrameTag(null)); - } - - - }//not showframe - - sos2.writeTag(new EndTag(null)); - data = baos.toByteArray(); - } - - try (OutputStream fos = new BufferedOutputStream(new FileOutputStream(tempFile))) { - SWFOutputStream sos = new SWFOutputStream(fos, 10); - sos.write("FWS".getBytes()); - sos.write(swf.version); - sos.writeUI32(sos.getPos() + data.length + 4); - sos.write(data); - fos.flush(); - } - showCard(CARDFLASHPANEL); - if (flashPanel != null) { - flashPanel.displaySWF(tempFile.getAbsolutePath(), backgroundColor, frameRate); - } - - } catch (IOException | com.jpexs.decompiler.flash.action.parser.ParseException ex) { - Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex); - } - if (tagObj instanceof TextTag) { + TextTag textTag = (TextTag) tagObj; parametersPanel.setVisible(true); previewSplitPane.setDividerLocation(previewSplitPane.getWidth() / 2); showDetailWithPreview(CARDTEXTPANEL); - textValue.setText(((TextTag) tagObj).getFormattedText(swf.tags)); + textValue.setText(textTag.getFormattedText(textTag.getSwf().tags)); } else if (tagObj instanceof FontTag) { showFontTag((FontTag) tagObj); } else { @@ -2840,6 +2333,7 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T } private void createAndShowTempSwf(Object tagObj) { + SWF swf; try { if (tempFile != null) { tempFile.delete(); @@ -2848,9 +2342,27 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T tempFile.deleteOnExit(); Color backgroundColor = View.swfBackgroundColor; + if (tagObj instanceof FontTag) { //Fonts are always black on white backgroundColor = View.DEFAULT_BACKGROUND_COLOR; } + + if (tagObj instanceof FrameNode) { + FrameNode fn = (FrameNode) tagObj; + swf = fn.getSwf(); + if (fn.getParent() == null) { + for (Tag t : swf.tags) { + if (t instanceof SetBackgroundColorTag) { + backgroundColor = ((SetBackgroundColorTag) t).backgroundColor.toColor(); + break; + } + } + } + } else { + Tag tag = (Tag) tagObj; + swf = tag.getSwf(); + } + int frameCount = 1; int frameRate = swf.frameRate; HashMap videoFrames = new HashMap<>(); @@ -2889,18 +2401,6 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T /*FileAttributesTag fa = new FileAttributesTag(); sos2.writeTag(fa); */ - if (tagObj instanceof FrameNode) { - FrameNode fn = (FrameNode) tagObj; - if (fn.getParent() == null) { - for (Tag t : swf.tags) { - if (t instanceof SetBackgroundColorTag) { - backgroundColor = ((SetBackgroundColorTag) t).backgroundColor.toColor(); - break; - } - } - } - } - sos2.writeTag(new SetBackgroundColorTag(null, new RGB(backgroundColor))); if (tagObj instanceof FrameNode) { @@ -3212,7 +2712,7 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T private void showFontTag(FontTag ft) { if (mainRibbon.isInternalFlashViewerSelected() /*|| ft instanceof GFxDefineCompactedFont*/) { ((CardLayout) viewerCards.getLayout()).show(viewerCards, INTERNAL_VIEWER_CARD); - internelViewerPanel.setDrawable(ft, swf, characters, 1); + internelViewerPanel.setDrawable(ft, ft.getSwf(), characters, 1); } else { ((CardLayout) viewerCards.getLayout()).show(viewerCards, FLASH_VIEWER_CARD); } @@ -3224,12 +2724,9 @@ public final class MainFrame extends AppRibbonFrame implements ActionListener, T } public void refreshTree() { - List objs = new ArrayList<>(); - objs.addAll(swf.tags); - List> expandedNodes = getExpandedNodes(tagTree); - tagTree.setModel(new TagTreeModel(createTagList(objs, null), new SWFRoot((new File(Main.file)).getName()))); + tagTree.setModel(new TagTreeModel(this, swfs, abcPanel)); expandTreeNodes(tagTree, expandedNodes); } diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/MainFrameRibbon.java b/trunk/src/com/jpexs/decompiler/flash/gui/MainFrameRibbon.java index 302230f65..0d8e3dff3 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/MainFrameRibbon.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/MainFrameRibbon.java @@ -644,7 +644,7 @@ public class MainFrameRibbon implements ActionListener { }, 1000); //It takes some time registry change to apply break; case ACTION_GOTO_DOCUMENT_CLASS: - mainFrame.gotoDocumentClass(); + mainFrame.gotoDocumentClass(mainFrame.getCurrentSwf()); break; case ACTION_PARALLEL_SPEED_UP: String confStr = translate("message.confirm.parallel") + "\r\n"; @@ -691,7 +691,7 @@ public class MainFrameRibbon implements ActionListener { switch (e.getActionCommand()) { case ACTION_RENAME_ONE_IDENTIFIER: - mainFrame.renameOneIdentifier(); + mainFrame.renameOneIdentifier(mainFrame.getCurrentSwf()); break; case ACTION_ABOUT: Main.about(); @@ -722,12 +722,12 @@ public class MainFrameRibbon implements ActionListener { Main.openFileDialog(); break; case ACTION_EXPORT_FLA: - mainFrame.exportFla(); + mainFrame.exportFla(mainFrame.getCurrentSwf()); break; case ACTION_EXPORT_SEL: case ACTION_EXPORT: boolean onlySel = e.getActionCommand().endsWith("SEL"); - mainFrame.export(onlySel); + mainFrame.export(mainFrame.getCurrentSwf(), onlySel); break; case ACTION_CHECK_UPDATES: if (!Main.checkForUpdates()) { @@ -766,14 +766,14 @@ public class MainFrameRibbon implements ActionListener { mainFrame.restoreControlFlow(all); break; case ACTION_RENAME_IDENTIFIERS: - mainFrame.renameIdentifiers(); + mainFrame.renameIdentifiers(mainFrame.getCurrentSwf()); break; case ACTION_DEOBFUSCATE: case ACTION_DEOBFUSCATE_ALL: mainFrame.deobfuscate(); break; case ACTION_REMOVE_NON_SCRIPTS: - mainFrame.removeNonScripts(); + mainFrame.removeNonScripts(mainFrame.getCurrentSwf()); break; case ACTION_REFRESH_DECOMPILED: mainFrame.refreshDecompiled(); diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/ModeFrame.java b/trunk/src/com/jpexs/decompiler/flash/gui/ModeFrame.java index f826854b9..20cf196bd 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/ModeFrame.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/ModeFrame.java @@ -33,6 +33,10 @@ import javax.swing.JLabel; */ public class ModeFrame extends AppFrame implements ActionListener { + static final String ACTION_OPEN = "OPEN"; + static final String ACTION_PROXY = "PROXY"; + static final String ACTION_EXIT = "EXIT"; + private JButton openButton = new JButton(translate("button.open")); private JButton proxyButton = new JButton(translate("button.proxy")); private JButton exitButton = new JButton(translate("button.exit")); @@ -43,13 +47,13 @@ public class ModeFrame extends AppFrame implements ActionListener { public ModeFrame() { setSize(350, 200); openButton.addActionListener(this); - openButton.setActionCommand("OPEN"); + openButton.setActionCommand(ACTION_OPEN); openButton.setIcon(View.getIcon("open32")); proxyButton.addActionListener(this); - proxyButton.setActionCommand("PROXY"); + proxyButton.setActionCommand(ACTION_PROXY); proxyButton.setIcon(View.getIcon("proxy32")); exitButton.addActionListener(this); - exitButton.setActionCommand("EXIT"); + exitButton.setActionCommand(ACTION_EXIT); exitButton.setIcon(View.getIcon("exit32")); setResizable(false); Container cont = getContentPane(); @@ -78,19 +82,21 @@ public class ModeFrame extends AppFrame implements ActionListener { */ @Override public void actionPerformed(ActionEvent e) { - if (e.getActionCommand().equals("OPEN")) { - setVisible(false); - if (!Main.openFileDialog()) { - setVisible(true); - } - } - if (e.getActionCommand().equals("PROXY")) { - setVisible(false); - Main.showProxy(); - } - if (e.getActionCommand().equals("EXIT")) { - setVisible(false); - Main.exit(); + switch (e.getActionCommand()) { + case ACTION_OPEN: + setVisible(false); + if (!Main.openFileDialog()) { + setVisible(true); + } + break; + case ACTION_PROXY: + setVisible(false); + Main.showProxy(); + break; + case ACTION_EXIT: + setVisible(false); + Main.exit(); + break; } } } diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/NewVersionDialog.java b/trunk/src/com/jpexs/decompiler/flash/gui/NewVersionDialog.java index 4c47d302c..d2e693eb7 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/NewVersionDialog.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/NewVersionDialog.java @@ -42,6 +42,9 @@ import javax.swing.UIManager; */ public class NewVersionDialog extends AppDialog implements ActionListener { + static final String ACTION_OK = "OK"; + static final String ACTION_CANCEL = "CANCEL"; + Version latestVersion; public NewVersionDialog(List versions) { @@ -82,11 +85,11 @@ public class NewVersionDialog extends AppDialog implements ActionListener { cnt.add(span); JPanel buttonsPanel = new JPanel(new FlowLayout()); JButton buttonOk = new JButton(translate("button.ok")); - buttonOk.setActionCommand("OK"); + buttonOk.setActionCommand(ACTION_OK); buttonOk.addActionListener(this); JButton buttonCancel = new JButton(translate("button.cancel")); - buttonCancel.setActionCommand("CANCEL"); + buttonCancel.setActionCommand(ACTION_CANCEL); buttonCancel.addActionListener(this); buttonsPanel.add(buttonOk); @@ -108,7 +111,7 @@ public class NewVersionDialog extends AppDialog implements ActionListener { @Override public void actionPerformed(ActionEvent e) { - if (e.getActionCommand().equals("OK")) { + if (e.getActionCommand() == ACTION_OK) { java.awt.Desktop desktop = null; if (java.awt.Desktop.isDesktopSupported()) { desktop = java.awt.Desktop.getDesktop(); diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/RenameDialog.java b/trunk/src/com/jpexs/decompiler/flash/gui/RenameDialog.java index 167ff8cbf..b6611464b 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/RenameDialog.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/RenameDialog.java @@ -36,6 +36,9 @@ import javax.swing.JRadioButton; */ public class RenameDialog extends AppDialog implements ActionListener { + static final String ACTION_OK = "OK"; + static final String ACTION_CANCEL = "CANCEL"; + private JRadioButton typeNumberRadioButton = new JRadioButton(translate("rename.type.typenumber")); private JRadioButton randomWordRadioButton = new JRadioButton(translate("rename.type.randomword")); private JButton okButton = new JButton(translate("button.ok")); @@ -70,10 +73,10 @@ public class RenameDialog extends AppDialog implements ActionListener { add(pan, BorderLayout.CENTER); JPanel panButtons = new JPanel(new FlowLayout()); panButtons.add(okButton); - okButton.setActionCommand("OK"); + okButton.setActionCommand(ACTION_OK); okButton.addActionListener(this); panButtons.add(cancelButton); - cancelButton.setActionCommand("CANCEL"); + cancelButton.setActionCommand(ACTION_CANCEL); cancelButton.addActionListener(this); add(panButtons, BorderLayout.SOUTH); setModalityType(ModalityType.APPLICATION_MODAL); @@ -95,12 +98,12 @@ public class RenameDialog extends AppDialog implements ActionListener { @Override public void actionPerformed(ActionEvent e) { switch (e.getActionCommand()) { - case "OK": + case ACTION_OK: confirmed = true; Configuration.lastRenameType.set((Integer) (getRenameType() == RenameType.TYPENUMBER ? 1 : 2)); setVisible(false); break; - case "CANCEL": + case ACTION_CANCEL: confirmed = false; setVisible(false); break; diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/SWFRoot.java b/trunk/src/com/jpexs/decompiler/flash/gui/SWFRoot.java index 1dfad60b8..e172c40a1 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/SWFRoot.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/SWFRoot.java @@ -16,18 +16,25 @@ */ package com.jpexs.decompiler.flash.gui; +import com.jpexs.decompiler.flash.SWF; + /** * * @author JPEXS */ public class SWFRoot { + private SWF swf; private String name; - public SWFRoot(String name) { + public SWFRoot(SWF swf, String name) { this.name = name; } + public SWF getSwf() { + return swf; + } + @Override public String toString() { return name; diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/SearchDialog.java b/trunk/src/com/jpexs/decompiler/flash/gui/SearchDialog.java index 94cfb6db0..6461cd732 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/SearchDialog.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/SearchDialog.java @@ -38,6 +38,9 @@ import javax.swing.JTextField; */ public class SearchDialog extends AppDialog implements ActionListener { + static final String ACTION_OK = "OK"; + static final String ACTION_CANCEL = "CANCEL"; + public JTextField searchField = new MyTextField(); public JCheckBox ignoreCaseCheckBox = new JCheckBox(translate("checkbox.ignorecase")); public JCheckBox regexpCheckBox = new JCheckBox(translate("checkbox.regexp")); @@ -50,10 +53,10 @@ public class SearchDialog extends AppDialog implements ActionListener { cnt.setLayout(new BoxLayout(cnt, BoxLayout.PAGE_AXIS)); JPanel panButtons = new JPanel(new FlowLayout()); JButton okButton = new JButton(translate("button.ok")); - okButton.setActionCommand("OK"); + okButton.setActionCommand(ACTION_OK); okButton.addActionListener(this); JButton cancelButton = new JButton(translate("button.cancel")); - cancelButton.setActionCommand("CANCEL"); + cancelButton.setActionCommand(ACTION_CANCEL); cancelButton.addActionListener(this); panButtons.add(okButton); panButtons.add(cancelButton); @@ -87,7 +90,7 @@ public class SearchDialog extends AppDialog implements ActionListener { @Override public void actionPerformed(ActionEvent e) { - if (e.getActionCommand().equals("OK")) { + if (e.getActionCommand() == ACTION_OK) { if (regexpCheckBox.isSelected()) { try { Pattern pat = Pattern.compile(searchField.getText()); diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/SelectLanguageDialog.java b/trunk/src/com/jpexs/decompiler/flash/gui/SelectLanguageDialog.java index a00f0aede..af3706d11 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/SelectLanguageDialog.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/SelectLanguageDialog.java @@ -38,6 +38,9 @@ import jsyntaxpane.DefaultSyntaxKit; */ public class SelectLanguageDialog extends AppDialog implements ActionListener { + static final String ACTION_OK = "OK"; + static final String ACTION_CANCEL = "CANCEL"; + JComboBox languageCombobox = new JComboBox<>(); public String languageCode = null; private String[] languages = new String[]{"en", "cs", "zh", "de", "es", "hu", "nl", "pt", "ru", "sv", "uk"}; @@ -81,10 +84,10 @@ public class SelectLanguageDialog extends AppDialog implements ActionListener { JPanel buttonsPanel = new JPanel(new FlowLayout()); buttonsPanel.setAlignmentX(0.5f); JButton okButton = new JButton(translate("button.ok")); - okButton.setActionCommand("OK"); + okButton.setActionCommand(ACTION_OK); okButton.addActionListener(this); JButton cancelButton = new JButton(translate("button.cancel")); - cancelButton.setActionCommand("CANCEL"); + cancelButton.setActionCommand(ACTION_CANCEL); cancelButton.addActionListener(this); buttonsPanel.add(okButton); buttonsPanel.add(cancelButton); @@ -103,7 +106,7 @@ public class SelectLanguageDialog extends AppDialog implements ActionListener { @Override public void actionPerformed(ActionEvent e) { switch (e.getActionCommand()) { - case "OK": + case ACTION_OK: if (languageCombobox.getSelectedIndex() == -1) { } else { languageCode = ((Language) languageCombobox.getSelectedItem()).code; @@ -116,7 +119,7 @@ public class SelectLanguageDialog extends AppDialog implements ActionListener { reloadUi(); } break; - case "CANCEL": + case ACTION_CANCEL: setVisible(false); break; } diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/TagTreeModel.java b/trunk/src/com/jpexs/decompiler/flash/gui/TagTreeModel.java index f7c47ff20..6e6ad5962 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/TagTreeModel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/TagTreeModel.java @@ -16,9 +16,20 @@ */ package com.jpexs.decompiler.flash.gui; +import com.jpexs.decompiler.flash.FrameNode; +import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.TagNode; +import com.jpexs.decompiler.flash.gui.abc.ABCPanel; import com.jpexs.decompiler.flash.gui.abc.ClassesListTreeModel; import com.jpexs.decompiler.flash.gui.abc.TreeElement; +import com.jpexs.decompiler.flash.tags.DefineSpriteTag; +import com.jpexs.decompiler.flash.tags.ExportAssetsTag; +import com.jpexs.decompiler.flash.tags.SoundStreamBlockTag; +import com.jpexs.decompiler.flash.tags.Tag; +import com.jpexs.decompiler.flash.tags.base.Container; +import com.jpexs.decompiler.flash.tags.base.ContainerItem; +import com.jpexs.decompiler.flash.tags.base.SoundStreamHeadTypeTag; +import java.io.File; import java.util.ArrayList; import java.util.List; import javax.swing.event.TreeModelListener; @@ -27,12 +38,171 @@ import javax.swing.tree.TreePath; public class TagTreeModel implements TreeModel { - private Object root; + private SWFRoot root; private List list = new ArrayList<>(); + private MainFrame mainFrame; - public TagTreeModel(List list, Object rootName) { - this.root = rootName; - this.list = list; + public TagTreeModel(MainFrame mainFrame, List swfs, ABCPanel abcPanel) { + this.mainFrame = mainFrame; + SWF swf = swfs.get(0); // todo honfika: add multiple swfs + this.root = new SWFRoot(swf, new File(Main.file).getName()); + + List objs = new ArrayList<>(); + objs.addAll(swf.tags); + this.list = createTagList(objs, null, abcPanel); + } + + private String translate(String key) { + return mainFrame.translate(key); + } + + public List getTagNodesWithType(List list, TagType type, Object parent, boolean display) { + List ret = new ArrayList<>(); + int frameCnt = 0; + for (ContainerItem o : list) { + TagType ttype = MainFrame.getTagType(o); + if (ttype == TagType.SHOW_FRAME && type == TagType.FRAME) { + frameCnt++; + ret.add(new TagNode(new FrameNode(o.getSwf(), frameCnt, parent, display))); + } else if (type == ttype) { + ret.add(new TagNode(o)); + } + } + return ret; + } + + private List createTagList(List list, Object parent, ABCPanel abcPanel) { + List ret = new ArrayList<>(); + List frames = getTagNodesWithType(list, TagType.FRAME, parent, true); + List shapes = getTagNodesWithType(list, TagType.SHAPE, parent, true); + List morphShapes = getTagNodesWithType(list, TagType.MORPH_SHAPE, parent, true); + List sprites = getTagNodesWithType(list, TagType.SPRITE, parent, true); + List buttons = getTagNodesWithType(list, TagType.BUTTON, parent, true); + List images = getTagNodesWithType(list, TagType.IMAGE, parent, true); + List fonts = getTagNodesWithType(list, TagType.FONT, parent, true); + List texts = getTagNodesWithType(list, TagType.TEXT, parent, true); + List movies = getTagNodesWithType(list, TagType.MOVIE, parent, true); + List sounds = getTagNodesWithType(list, TagType.SOUND, parent, true); + List binaryData = getTagNodesWithType(list, TagType.BINARY_DATA, parent, true); + List actionScript = new ArrayList<>(); + + for (int i = 0; i < sounds.size(); i++) { + if (sounds.get(i).tag instanceof SoundStreamHeadTypeTag) { + List blocks = new ArrayList<>(); + SWF.populateSoundStreamBlocks(list, (Tag) sounds.get(i).tag, blocks); + if (blocks.isEmpty()) { + sounds.remove(i); + i--; + } + } + } + + for (TagNode n : sprites) { + n.subItems = getTagNodesWithType(((DefineSpriteTag) n.tag).subTags, TagType.FRAME, n.tag, true); + } + + List exportAssetsTags = new ArrayList<>(); + for (Object t : list) { + if (t instanceof ExportAssetsTag) { + exportAssetsTags.add((ExportAssetsTag) t); + } + /*if (t instanceof ASMSource) { + TagNode tti = new TagNode(t); + ret.add(tti); + } else */ + if (t instanceof Container) { + TagNode tti = new TagNode(t); + if (((Container) t).getItemCount() > 0) { + List subItems = ((Container) t).getSubItems(); + tti.subItems = createTagList(subItems, t, abcPanel); + } + //ret.add(tti); + } + } + + actionScript = SWF.createASTagList(list, null); + TagNode textsNode = new TagNode(translate("node.texts")); + textsNode.subItems.addAll(texts); + + TagNode imagesNode = new TagNode(translate("node.images")); + imagesNode.subItems.addAll(images); + + TagNode moviesNode = new TagNode(translate("node.movies")); + moviesNode.subItems.addAll(movies); + + TagNode soundsNode = new TagNode(translate("node.sounds")); + soundsNode.subItems.addAll(sounds); + + + TagNode binaryDataNode = new TagNode(translate("node.binaryData")); + binaryDataNode.subItems.addAll(binaryData); + + TagNode fontsNode = new TagNode(translate("node.fonts")); + fontsNode.subItems.addAll(fonts); + + + TagNode spritesNode = new TagNode(translate("node.sprites")); + spritesNode.subItems.addAll(sprites); + + TagNode shapesNode = new TagNode(translate("node.shapes")); + shapesNode.subItems.addAll(shapes); + + TagNode morphShapesNode = new TagNode(translate("node.morphshapes")); + morphShapesNode.subItems.addAll(morphShapes); + + TagNode buttonsNode = new TagNode(translate("node.buttons")); + buttonsNode.subItems.addAll(buttons); + + TagNode framesNode = new TagNode(translate("node.frames")); + framesNode.subItems.addAll(frames); + + TagNode actionScriptNode = new TagNode(translate("node.scripts")); + actionScriptNode.mark = "scripts"; + actionScriptNode.subItems.addAll(actionScript); + + if (!shapesNode.subItems.isEmpty()) { + ret.add(shapesNode); + } + if (!morphShapesNode.subItems.isEmpty()) { + ret.add(morphShapesNode); + } + if (!spritesNode.subItems.isEmpty()) { + ret.add(spritesNode); + } + if (!textsNode.subItems.isEmpty()) { + ret.add(textsNode); + } + if (!imagesNode.subItems.isEmpty()) { + ret.add(imagesNode); + } + if (!moviesNode.subItems.isEmpty()) { + ret.add(moviesNode); + } + if (!soundsNode.subItems.isEmpty()) { + ret.add(soundsNode); + } + if (!buttonsNode.subItems.isEmpty()) { + ret.add(buttonsNode); + } + if (!fontsNode.subItems.isEmpty()) { + ret.add(fontsNode); + } + if (!binaryDataNode.subItems.isEmpty()) { + ret.add(binaryDataNode); + } + if (!framesNode.subItems.isEmpty()) { + ret.add(framesNode); + } + + if (abcPanel != null) { + actionScriptNode.subItems.clear(); + actionScriptNode.tag = abcPanel.classTree.getModel(); + } + if ((!actionScriptNode.subItems.isEmpty()) || (abcPanel != null)) { + ret.add(actionScriptNode); + } + + return ret; } private List searchTag(Object obj, Object parent, List path) { diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/TagType.java b/trunk/src/com/jpexs/decompiler/flash/gui/TagType.java new file mode 100644 index 000000000..c7457bc08 --- /dev/null +++ b/trunk/src/com/jpexs/decompiler/flash/gui/TagType.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2010-2013 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; + +/** + * + * @author JPEXS + */ +public enum TagType { + + FONT, + TEXT, + IMAGE, + SHAPE, + MORPH_SHAPE, + SPRITE, + BUTTON, + AS, + PACKAGE, + FRAME, + SHOW_FRAME, + MOVIE, + SOUND, + BINARY_DATA, + FOLDER, + FOLDER_OPEN +} diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java index 14b07757c..916110efe 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java @@ -330,7 +330,7 @@ public class ABCPanel extends JPanel implements ItemListener, ActionListener, Fr JButton newTraitButton = new JButton(View.getIcon("traitadd16")); newTraitButton.setMargin(new Insets(5, 5, 5, 5)); newTraitButton.addActionListener(this); - newTraitButton.setActionCommand("ADDTRAIT"); + newTraitButton.setActionCommand(ACTION_ADD_TRAIT); newTraitButton.setToolTipText(AppStrings.translate("button.addtrait")); iconsPanel.add(newTraitButton); @@ -394,7 +394,7 @@ public class ABCPanel extends JPanel implements ItemListener, ActionListener, Fr Main.startWork(AppStrings.translate("work.buildingscripttree") + "..."); - filterField.setActionCommand("FILTERSCRIPT"); + filterField.setActionCommand(ACTION_FILTER_SCRIPT); filterField.addActionListener(this); @@ -428,16 +428,16 @@ public class ABCPanel extends JPanel implements ItemListener, ActionListener, Fr JButton prevSearchButton = new JButton(View.getIcon("prev16")); prevSearchButton.setMargin(new Insets(3, 3, 3, 3)); prevSearchButton.addActionListener(this); - prevSearchButton.setActionCommand("SEARCHPREV"); + prevSearchButton.setActionCommand(ACTION_SEARCH_PREV); JButton nextSearchButton = new JButton(View.getIcon("next16")); nextSearchButton.setMargin(new Insets(3, 3, 3, 3)); nextSearchButton.addActionListener(this); - nextSearchButton.setActionCommand("SEARCHNEXT"); + nextSearchButton.setActionCommand(ACTION_SEARCH_NEXT); JButton cancelSearchButton = new JButton(View.getIcon("cancel16")); cancelSearchButton.setMargin(new Insets(3, 3, 3, 3)); cancelSearchButton.addActionListener(this); - cancelSearchButton.setActionCommand("SEARCHCANCEL"); + cancelSearchButton.setActionCommand(ACTION_SEARCH_CANCEL); searchPos = new JLabel("0/0"); searchForLabel = new JLabel(AppStrings.translate("search.info").replace("%text%", "") + " "); searchPanel.add(searchForLabel); diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/abc/DeobfuscationDialog.java b/trunk/src/com/jpexs/decompiler/flash/gui/abc/DeobfuscationDialog.java index e516e42c1..81939beba 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/abc/DeobfuscationDialog.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/abc/DeobfuscationDialog.java @@ -38,6 +38,9 @@ import javax.swing.JSlider; */ public class DeobfuscationDialog extends AppDialog implements ActionListener { + static final String ACTION_OK = "OK"; + static final String ACTION_CANCEL = "CANCEL"; + public JCheckBox processAllCheckbox = new JCheckBox(translate("processallclasses")); public JSlider codeProcessingLevel; public boolean ok = false; @@ -86,10 +89,10 @@ public class DeobfuscationDialog extends AppDialog implements ActionListener { JButton cancelButton = new JButton(translate("button.cancel")); cancelButton.addActionListener(this); - cancelButton.setActionCommand("CANCEL"); + cancelButton.setActionCommand(ACTION_CANCEL); JButton okButton = new JButton(translate("button.ok")); okButton.addActionListener(this); - okButton.setActionCommand("OK"); + okButton.setActionCommand(ACTION_OK); JPanel buttonsPanel = new JPanel(new FlowLayout()); buttonsPanel.add(okButton); @@ -105,13 +108,15 @@ public class DeobfuscationDialog extends AppDialog implements ActionListener { @Override public void actionPerformed(ActionEvent e) { - if (e.getActionCommand().equals("OK")) { - ok = true; - setVisible(false); - } - if (e.getActionCommand().equals("CANCEL")) { - ok = false; - setVisible(false); + switch (e.getActionCommand()) { + case ACTION_OK: + ok = true; + setVisible(false); + break; + case ACTION_CANCEL: + ok = false; + setVisible(false); + break; } } diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/abc/DetailPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/abc/DetailPanel.java index ad439ec5b..18b49fbce 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/abc/DetailPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/abc/DetailPanel.java @@ -20,6 +20,7 @@ import com.jpexs.decompiler.flash.abc.types.traits.Trait; import com.jpexs.decompiler.flash.gui.AppStrings; import com.jpexs.decompiler.flash.gui.HeaderLabel; import com.jpexs.decompiler.flash.gui.View; +import static com.jpexs.decompiler.flash.gui.abc.DeobfuscationDialog.ACTION_OK; import com.jpexs.helpers.CancellableWorker; import java.awt.BorderLayout; import java.awt.CardLayout; @@ -38,6 +39,10 @@ import javax.swing.border.BevelBorder; */ public class DetailPanel extends JPanel implements ActionListener { + static final String ACTION_SAVE_DETAIL = "SAVEDETAIL"; + static final String ACTION_EDIT_DETAIL = "EDITDETAIL"; + static final String ACTION_CANCEL_DETAIL = "CANCELDETAIL"; + public MethodTraitDetailPanel methodTraitPanel; public JPanel unsupportedTraitPanel; public SlotConstTraitDetailPanel slotConstTraitPanel; @@ -86,11 +91,11 @@ public class DetailPanel extends JPanel implements ActionListener { buttonsPanel = new JPanel(); buttonsPanel.setLayout(new FlowLayout()); - saveButton.setActionCommand("SAVEDETAIL"); + saveButton.setActionCommand(ACTION_SAVE_DETAIL); saveButton.addActionListener(this); - editButton.setActionCommand("EDITDETAIL"); + editButton.setActionCommand(ACTION_EDIT_DETAIL); editButton.addActionListener(this); - cancelButton.setActionCommand("CANCELDETAIL"); + cancelButton.setActionCommand(ACTION_CANCEL_DETAIL); cancelButton.addActionListener(this); buttonsPanel.setBorder(new BevelBorder(BevelBorder.RAISED)); buttonsPanel.add(editButton); @@ -162,35 +167,37 @@ public class DetailPanel extends JPanel implements ActionListener { @Override public void actionPerformed(ActionEvent e) { - if (e.getActionCommand().equals("EDITDETAIL")) { - setEditMode(true); - methodTraitPanel.methodCodePanel.focusEditor(); - } - if (e.getActionCommand().equals("CANCELDETAIL")) { - setEditMode(false); - abcPanel.decompiledTextArea.resetEditing(); - } - if (e.getActionCommand().equals("SAVEDETAIL")) { - if (cardMap.get(selectedCard) instanceof TraitDetail) { - if (((TraitDetail) cardMap.get(selectedCard)).save()) { - CancellableWorker worker = new CancellableWorker() { + switch (e.getActionCommand()) { + case ACTION_EDIT_DETAIL: + setEditMode(true); + methodTraitPanel.methodCodePanel.focusEditor(); + break; + case ACTION_CANCEL_DETAIL: + setEditMode(false); + abcPanel.decompiledTextArea.resetEditing(); + break; + case ACTION_SAVE_DETAIL: + if (cardMap.get(selectedCard) instanceof TraitDetail) { + if (((TraitDetail) cardMap.get(selectedCard)).save()) { + CancellableWorker worker = new CancellableWorker() { - @Override - public Void doInBackground() throws Exception { - int lasttrait = abcPanel.decompiledTextArea.lastTraitIndex; - abcPanel.decompiledTextArea.reloadClass(); - abcPanel.decompiledTextArea.gotoTrait(lasttrait); - return null; - } + @Override + public Void doInBackground() throws Exception { + int lasttrait = abcPanel.decompiledTextArea.lastTraitIndex; + abcPanel.decompiledTextArea.reloadClass(); + abcPanel.decompiledTextArea.gotoTrait(lasttrait); + return null; + } - @Override - protected void done() { - View.showMessageDialog(null, AppStrings.translate("message.trait.saved")); - } - }; - worker.execute(); + @Override + protected void done() { + View.showMessageDialog(null, AppStrings.translate("message.trait.saved")); + } + }; + worker.execute(); + } } - } + break; } } } diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodCodePanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodCodePanel.java index bb30886f5..cb7b4080c 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodCodePanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/abc/MethodCodePanel.java @@ -41,6 +41,10 @@ import javax.swing.JToggleButton; */ public class MethodCodePanel extends JPanel implements ActionListener { + static final String ACTION_GRAPH = "GRAPH"; + static final String ACTION_HEX = "HEX"; + static final String ACTION_HEX_ONLY = "HEXONLY"; + private ASMSourceEditorPane sourceTextArea; public JPanel buttonsPanel; private JToggleButton hexButton; @@ -98,20 +102,20 @@ public class MethodCodePanel extends JPanel implements ActionListener { buttonsPanel.setLayout(new BoxLayout(buttonsPanel, BoxLayout.X_AXIS)); JButton graphButton = new JButton(View.getIcon("graph16")); - graphButton.setActionCommand("GRAPH"); + graphButton.setActionCommand(ACTION_GRAPH); graphButton.addActionListener(this); graphButton.setToolTipText(AppStrings.translate("button.viewgraph")); graphButton.setMargin(new Insets(3, 3, 3, 3)); hexButton = new JToggleButton(View.getIcon("hex16")); - hexButton.setActionCommand("HEX"); + hexButton.setActionCommand(ACTION_HEX); hexButton.addActionListener(this); hexButton.setToolTipText(AppStrings.translate("button.viewhex")); hexButton.setMargin(new Insets(3, 3, 3, 3)); // todo: find icon hexOnlyButton = new JToggleButton(View.getIcon("hex16")); - hexOnlyButton.setActionCommand("HEXONLY"); + hexOnlyButton.setActionCommand(ACTION_HEX_ONLY); hexOnlyButton.addActionListener(this); hexOnlyButton.setToolTipText(AppStrings.translate("button.viewhex")); hexOnlyButton.setMargin(new Insets(3, 3, 3, 3)); @@ -134,17 +138,20 @@ public class MethodCodePanel extends JPanel implements ActionListener { if (Main.isWorking()) { return; } - if (e.getActionCommand().equals("GRAPH")) { - sourceTextArea.graph(); - } - if (e.getActionCommand().equals("HEX") || e.getActionCommand().equals("HEXONLY")) { - if (e.getActionCommand().equals("HEX")) { - hexOnlyButton.setSelected(false); - } else { - hexButton.setSelected(false); - } - sourceTextArea.setHex(getExportMode(), false); + switch (e.getActionCommand()) { + case ACTION_GRAPH: + sourceTextArea.graph(); + break; + case ACTION_HEX: + case ACTION_HEX_ONLY: + if (e.getActionCommand() == ACTION_HEX) { + hexOnlyButton.setSelected(false); + } else { + hexButton.setSelected(false); + } + sourceTextArea.setHex(getExportMode(), false); + break; } } diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/abc/NewTraitDialog.java b/trunk/src/com/jpexs/decompiler/flash/gui/abc/NewTraitDialog.java index 9f2c128c3..7ad26619c 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/abc/NewTraitDialog.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/abc/NewTraitDialog.java @@ -43,6 +43,9 @@ import javax.swing.event.AncestorListener; */ public class NewTraitDialog extends AppDialog implements ActionListener { + static final String ACTION_OK = "OK"; + static final String ACTION_CANCEL = "CANCEL"; + private static int modifiers[] = new int[]{ Namespace.KIND_PACKAGE, Namespace.KIND_PRIVATE, @@ -121,10 +124,10 @@ public class NewTraitDialog extends AppDialog implements ActionListener { cnt.add(optionsPanel, BorderLayout.CENTER); JPanel buttonsPanel = new JPanel(new FlowLayout()); JButton buttonOk = new JButton(AppStrings.translate("button.ok")); - buttonOk.setActionCommand("OK"); + buttonOk.setActionCommand(ACTION_OK); buttonOk.addActionListener(this); JButton buttonCancel = new JButton(AppStrings.translate("button.cancel")); - buttonCancel.setActionCommand("CANCEL"); + buttonCancel.setActionCommand(ACTION_CANCEL); buttonCancel.addActionListener(this); buttonsPanel.add(buttonOk); buttonsPanel.add(buttonCancel); @@ -161,7 +164,7 @@ public class NewTraitDialog extends AppDialog implements ActionListener { @Override public void actionPerformed(ActionEvent e) { switch (e.getActionCommand()) { - case "OK": + case ACTION_OK: if (nameField.getText().trim().isEmpty()) { View.showMessageDialog(null, translate("error.name"), AppStrings.translate("error"), JOptionPane.ERROR_MESSAGE); return; @@ -169,7 +172,7 @@ public class NewTraitDialog extends AppDialog implements ActionListener { result = true; setVisible(false); break; - case "CANCEL": + case ACTION_CANCEL: result = false; setVisible(false); break; diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/abc/UsageFrame.java b/trunk/src/com/jpexs/decompiler/flash/gui/abc/UsageFrame.java index 021bbf360..6fbff8172 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/abc/UsageFrame.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/abc/UsageFrame.java @@ -23,6 +23,7 @@ import com.jpexs.decompiler.flash.abc.usages.MultinameUsage; import com.jpexs.decompiler.flash.abc.usages.TraitMultinameUsage; import com.jpexs.decompiler.flash.gui.AppFrame; import com.jpexs.decompiler.flash.gui.View; +import static com.jpexs.decompiler.flash.gui.abc.NewTraitDialog.ACTION_OK; import com.jpexs.decompiler.flash.tags.ABCContainerTag; import java.awt.BorderLayout; import java.awt.Color; @@ -41,6 +42,9 @@ import javax.swing.*; */ public class UsageFrame extends AppFrame implements ActionListener, MouseListener { + static final String ACTION_GOTO = "GOTO"; + static final String ACTION_CANCEL = "CANCEL"; + private JButton gotoButton = new JButton(translate("button.goto")); private JButton cancelButton = new JButton(translate("button.cancel")); private JList usageList; @@ -59,9 +63,9 @@ public class UsageFrame extends AppFrame implements ActionListener, MouseListene } usageList = new JList(usageListModel); usageList.setBackground(Color.white); - gotoButton.setActionCommand("GOTO"); + gotoButton.setActionCommand(ACTION_GOTO); gotoButton.addActionListener(this); - cancelButton.setActionCommand("CANCEL"); + cancelButton.setActionCommand(ACTION_CANCEL); cancelButton.addActionListener(this); JPanel buttonsPanel = new JPanel(); buttonsPanel.setLayout(new FlowLayout()); @@ -114,12 +118,14 @@ public class UsageFrame extends AppFrame implements ActionListener, MouseListene @Override public void actionPerformed(ActionEvent e) { - if (e.getActionCommand().equals("GOTO")) { - gotoUsage(); - setVisible(false); - } - if (e.getActionCommand().equals("CANCEL")) { - setVisible(false); + switch (e.getActionCommand()) { + case ACTION_GOTO: + gotoUsage(); + setVisible(false); + break; + case ACTION_CANCEL: + setVisible(false); + break; } } diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java index e85585193..6fd77f1a0 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java @@ -80,6 +80,19 @@ import jsyntaxpane.actions.DocumentSearchData; public class ActionPanel extends JPanel implements ActionListener { + static final String ACTION_SEARCH_PREV = "SEARCHPREV"; + static final String ACTION_SEARCH_NEXT = "SEARCHNEXT"; + static final String ACTION_SEARCH_CANCEL = "SEARCHCANCEL"; + static final String ACTION_GRAPH = "GRAPH"; + static final String ACTION_HEX = "HEX"; + static final String ACTION_HEX_ONLY = "HEXONLY"; + static final String ACTION_SAVE_ACTION = "SAVEACTION"; + static final String ACTION_EDIT_ACTION = "EDITACTION"; + static final String ACTION_CANCEL_ACTION = "CANCELACTION"; + static final String ACTION_SAVE_DECOMPILED = "SAVEDECOMPILED"; + static final String ACTION_EDIT_DECOMPILED = "EDITDECOMPILED"; + static final String ACTION_CANCEL_DECOMPILED = "CANCELDECOMPILED"; + public LineMarkedEditorPane editor; public LineMarkedEditorPane decompiledEditor; public List list; @@ -422,15 +435,15 @@ public class ActionPanel extends JPanel implements ActionListener { JButton prevSearchButton = new JButton(View.getIcon("prev16")); prevSearchButton.setMargin(new Insets(3, 3, 3, 3)); prevSearchButton.addActionListener(this); - prevSearchButton.setActionCommand("SEARCHPREV"); + prevSearchButton.setActionCommand(ACTION_SEARCH_PREV); JButton nextSearchButton = new JButton(View.getIcon("next16")); nextSearchButton.setMargin(new Insets(3, 3, 3, 3)); nextSearchButton.addActionListener(this); - nextSearchButton.setActionCommand("SEARCHNEXT"); + nextSearchButton.setActionCommand(ACTION_SEARCH_NEXT); JButton cancelSearchButton = new JButton(View.getIcon("cancel16")); cancelSearchButton.setMargin(new Insets(3, 3, 3, 3)); cancelSearchButton.addActionListener(this); - cancelSearchButton.setActionCommand("SEARCHCANCEL"); + cancelSearchButton.setActionCommand(ACTION_SEARCH_CANCEL); searchPos = new JLabel("0/0"); searchForLabel = new JLabel(AppStrings.translate("search.info").replace("%text%", "")); searchPanel.add(searchForLabel); @@ -442,20 +455,20 @@ public class ActionPanel extends JPanel implements ActionListener { JButton graphButton = new JButton(View.getIcon("graph16")); - graphButton.setActionCommand("GRAPH"); + graphButton.setActionCommand(ACTION_GRAPH); graphButton.addActionListener(this); graphButton.setToolTipText(AppStrings.translate("button.viewgraph")); graphButton.setMargin(new Insets(3, 3, 3, 3)); hexButton = new JToggleButton(View.getIcon("hex16")); - hexButton.setActionCommand("HEX"); + hexButton.setActionCommand(ACTION_HEX); hexButton.addActionListener(this); hexButton.setToolTipText(AppStrings.translate("button.viewhex")); hexButton.setMargin(new Insets(3, 3, 3, 3)); // todo: find icon hexOnlyButton = new JToggleButton(View.getIcon("hex16")); - hexOnlyButton.setActionCommand("HEXONLY"); + hexOnlyButton.setActionCommand(ACTION_HEX_ONLY); hexOnlyButton.addActionListener(this); hexOnlyButton.setToolTipText(AppStrings.translate("button.viewhex")); hexOnlyButton.setMargin(new Insets(3, 3, 3, 3)); @@ -507,23 +520,23 @@ public class ActionPanel extends JPanel implements ActionListener { panB.add(buttonsPan, BorderLayout.SOUTH); saveButton.addActionListener(this); - saveButton.setActionCommand("SAVEACTION"); + saveButton.setActionCommand(ACTION_SAVE_ACTION); editButton.addActionListener(this); - editButton.setActionCommand("EDITACTION"); + editButton.setActionCommand(ACTION_EDIT_ACTION); cancelButton.addActionListener(this); - cancelButton.setActionCommand("CANCELACTION"); + cancelButton.setActionCommand(ACTION_CANCEL_ACTION); saveButton.setVisible(false); cancelButton.setVisible(false); saveDecompiledButton.addActionListener(this); - saveDecompiledButton.setActionCommand("SAVEDECOMPILED"); + saveDecompiledButton.setActionCommand(ACTION_SAVE_DECOMPILED); editDecompiledButton.addActionListener(this); - editDecompiledButton.setActionCommand("EDITDECOMPILED"); + editDecompiledButton.setActionCommand(ACTION_EDIT_DECOMPILED); cancelDecompiledButton.addActionListener(this); - cancelDecompiledButton.setActionCommand("CANCELDECOMPILED"); + cancelDecompiledButton.setActionCommand(ACTION_CANCEL_DECOMPILED); saveDecompiledButton.setVisible(false); cancelDecompiledButton.setVisible(false); @@ -720,7 +733,7 @@ public class ActionPanel extends JPanel implements ActionListener { updateSearchPos(); } switch (e.getActionCommand()) { - case "GRAPH": + case ACTION_GRAPH: if (lastCode != null) { try { GraphFrame gf = new GraphFrame(new ActionGraph(lastCode, new HashMap(), new HashMap(), new HashMap(), SWF.DEFAULT_VERSION), ""); @@ -730,23 +743,23 @@ public class ActionPanel extends JPanel implements ActionListener { } } break; - case "EDITACTION": + case ACTION_EDIT_ACTION: setEditMode(true); break; - case "HEX": - case "HEXONLY": - if (e.getActionCommand().equals("HEX")) { + case ACTION_HEX: + case ACTION_HEX_ONLY: + if (e.getActionCommand() == ACTION_HEX) { hexOnlyButton.setSelected(false); } else { hexButton.setSelected(false); } setHex(getExportMode()); break; - case "CANCELACTION": + case ACTION_CANCEL_ACTION: setEditMode(false); setHex(getExportMode()); break; - case "SAVEACTION": + case ACTION_SAVE_ACTION: try { String text = editor.getText(); if (text.trim().startsWith("#hexdata")) { @@ -766,13 +779,13 @@ public class ActionPanel extends JPanel implements ActionListener { View.showMessageDialog(this, AppStrings.translate("error.action.save").replace("%error%", ex.text).replace("%line%", "" + ex.line), AppStrings.translate("error"), JOptionPane.ERROR_MESSAGE); } break; - case "EDITDECOMPILED": + case ACTION_EDIT_DECOMPILED: setDecompiledEditMode(true); break; - case "CANCELDECOMPILED": + case ACTION_CANCEL_DECOMPILED: setDecompiledEditMode(false); break; - case "SAVEDECOMPILED": + case ACTION_SAVE_DECOMPILED: try { ActionScriptParser par = new ActionScriptParser(); src.setActions(par.actionsFromString(decompiledEditor.getText()), SWF.DEFAULT_VERSION); diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/player/PlayerControls.java b/trunk/src/com/jpexs/decompiler/flash/gui/player/PlayerControls.java index 8f3a37334..726941b93 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/player/PlayerControls.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/player/PlayerControls.java @@ -41,6 +41,9 @@ import javax.swing.JProgressBar; */ public class PlayerControls extends JPanel implements ActionListener { + static final String ACTION_PAUSE = "PAUSE"; + static final String ACTION_STOP = "STOP"; + private JButton pauseButton; private boolean paused = false; private FlashDisplay display; @@ -64,11 +67,11 @@ public class PlayerControls extends JPanel implements ActionListener { pauseButton = new JButton(AppStrings.translate("preview.pause"), pauseIcon); pauseButton.setMargin(new Insets(0, 0, 0, 0)); - pauseButton.setActionCommand("PAUSE"); + pauseButton.setActionCommand(ACTION_PAUSE); pauseButton.addActionListener(this); JButton stopButton = new JButton(AppStrings.translate("preview.stop"), View.getIcon("stop16")); stopButton.setMargin(new Insets(0, 0, 0, 0)); - stopButton.setActionCommand("STOP"); + stopButton.setActionCommand(ACTION_STOP); stopButton.addActionListener(this); buttonsPanel.add(pauseButton); buttonsPanel.add(stopButton); @@ -165,14 +168,14 @@ public class PlayerControls extends JPanel implements ActionListener { @Override public void actionPerformed(ActionEvent e) { switch (e.getActionCommand()) { - case "PAUSE": + case ACTION_PAUSE: if (paused) { display.play(); } else { display.pause(); } break; - case "STOP": + case ACTION_STOP: display.pause(); display.rewind(); break; diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/proxy/ProxyFrame.java b/trunk/src/com/jpexs/decompiler/flash/gui/proxy/ProxyFrame.java index a714bcbf3..279e064dd 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/proxy/ProxyFrame.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/proxy/ProxyFrame.java @@ -48,6 +48,12 @@ import javax.swing.*; */ public class ProxyFrame extends AppFrame implements ActionListener, CatchedListener, MouseListener, ReplacedListener { + static final String ACTION_SWITCH_STATE = "SWITCHSTATE"; + static final String ACTION_OPEN = "OPEN"; + static final String ACTION_CLEAR = "CLEAR"; + static final String ACTION_RENAME = "RENAME"; + static final String ACTION_REMOVE = "REMOVE"; + private JList swfList; private SWFListModel listModel; private JButton switchButton = new JButton(translate("proxy.start")); @@ -87,7 +93,7 @@ public class ProxyFrame extends AppFrame implements ActionListener, CatchedListe swfList.addMouseListener(this); swfList.setFont(new Font("Monospaced", Font.PLAIN, 12)); switchButton.addActionListener(this); - switchButton.setActionCommand("SWITCHSTATE"); + switchButton.setActionCommand(ACTION_SWITCH_STATE); Container cnt = getContentPane(); cnt.setLayout(new BorderLayout()); cnt.add(new JScrollPane(swfList), BorderLayout.CENTER); @@ -108,19 +114,19 @@ public class ProxyFrame extends AppFrame implements ActionListener, CatchedListe JPanel buttonsPanel2 = new JPanel(); buttonsPanel2.setLayout(new FlowLayout()); JButton openButton = new JButton(translate("open")); - openButton.setActionCommand("OPEN"); + openButton.setActionCommand(ACTION_OPEN); openButton.addActionListener(this); buttonsPanel2.add(openButton); JButton clearButton = new JButton(translate("clear")); - clearButton.setActionCommand("CLEAR"); + clearButton.setActionCommand(ACTION_CLEAR); clearButton.addActionListener(this); buttonsPanel2.add(clearButton); JButton renameButton = new JButton(translate("rename")); - renameButton.setActionCommand("RENAME"); + renameButton.setActionCommand(ACTION_RENAME); renameButton.addActionListener(this); buttonsPanel2.add(renameButton); JButton removeButton = new JButton(translate("remove")); - removeButton.setActionCommand("REMOVE"); + removeButton.setActionCommand(ACTION_REMOVE); removeButton.addActionListener(this); buttonsPanel2.add(removeButton); @@ -183,54 +189,56 @@ public class ProxyFrame extends AppFrame implements ActionListener, CatchedListe */ @Override public void actionPerformed(ActionEvent e) { - if (e.getActionCommand().equals("OPEN")) { - open(); - } - if (e.getActionCommand().equals("RENAME")) { - if (swfList.getSelectedIndex() > -1) { - Replacement r = (Replacement) listModel.getElementAt(swfList.getSelectedIndex()); - String s = View.showInputDialog("URL", r.urlPattern); - r.urlPattern = s; - listModel.dataChanged(swfList.getSelectedIndex()); - } - } - if (e.getActionCommand().equals("CLEAR")) { - for (int i = 0; i < listModel.getSize(); i++) { - Replacement r = (Replacement) listModel.getElementAt(i); - File f; - try { - f = (new File(Main.tempFile(r.targetFile))); - if (f.exists()) { - f.delete(); - } - } catch (IOException ex) { - Logger.getLogger(ProxyFrame.class.getName()).log(Level.SEVERE, null, ex); + switch (e.getActionCommand()) { + case ACTION_OPEN: + open(); + break; + case ACTION_RENAME: + if (swfList.getSelectedIndex() > -1) { + Replacement r = (Replacement) listModel.getElementAt(swfList.getSelectedIndex()); + String s = View.showInputDialog("URL", r.urlPattern); + r.urlPattern = s; + listModel.dataChanged(swfList.getSelectedIndex()); } + break; + case ACTION_CLEAR: + for (int i = 0; i < listModel.getSize(); i++) { + Replacement r = (Replacement) listModel.getElementAt(i); + File f; + try { + f = (new File(Main.tempFile(r.targetFile))); + if (f.exists()) { + f.delete(); + } + } catch (IOException ex) { + Logger.getLogger(ProxyFrame.class.getName()).log(Level.SEVERE, null, ex); + } - } - listModel.clear(); - } - if (e.getActionCommand().equals("REMOVE")) { - int lastIndex = -1; - for (int k = listModel.getSize() - 1; k >= 0; k--) { - if (swfList.isSelectedIndex(k)) { - Replacement r = listModel.removeURL(k); - File f = (new File(r.targetFile)); - if (f.exists()) { - f.delete(); - } - lastIndex = k; } - } - if (lastIndex >= listModel.getSize()) { - lastIndex--; - } - if (lastIndex > -1) { - swfList.setSelectedIndex(lastIndex); - } - } - if (e.getActionCommand().equals("SWITCHSTATE")) { - Main.switchProxy(); + listModel.clear(); + break; + case ACTION_REMOVE: + int lastIndex = -1; + for (int k = listModel.getSize() - 1; k >= 0; k--) { + if (swfList.isSelectedIndex(k)) { + Replacement r = listModel.removeURL(k); + File f = (new File(r.targetFile)); + if (f.exists()) { + f.delete(); + } + lastIndex = k; + } + } + if (lastIndex >= listModel.getSize()) { + lastIndex--; + } + if (lastIndex > -1) { + swfList.setSelectedIndex(lastIndex); + } + break; + case ACTION_SWITCH_STATE: + Main.switchProxy(); + break; } } diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/DefineButton2Tag.java b/trunk/src/com/jpexs/decompiler/flash/tags/DefineButton2Tag.java index 693e2d0af..9284361a7 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/DefineButton2Tag.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/DefineButton2Tag.java @@ -101,7 +101,7 @@ public class DefineButton2Tag extends CharacterTag implements Container, Bounded int actionOffset = sis.readUI16(); characters = sis.readBUTTONRECORDList(true); if (actionOffset > 0) { - actions = sis.readBUTTONCONDACTIONList(); + actions = sis.readBUTTONCONDACTIONList(swf); } } diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObject2Tag.java b/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObject2Tag.java index fcd26ffc2..cfd17d837 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObject2Tag.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObject2Tag.java @@ -240,7 +240,7 @@ public class PlaceObject2Tag extends CharacterIdTag implements Container, PlaceO clipDepth = sis.readUI16(); } if (placeFlagHasClipActions) { - clipActions = sis.readCLIPACTIONS(); + clipActions = sis.readCLIPACTIONS(swf); } } diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObject3Tag.java b/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObject3Tag.java index bf4e3c3cd..52e7db539 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObject3Tag.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObject3Tag.java @@ -347,7 +347,7 @@ public class PlaceObject3Tag extends CharacterIdTag implements Container, PlaceO } if (placeFlagHasClipActions) { - clipActions = sis.readCLIPACTIONS(); + clipActions = sis.readCLIPACTIONS(swf); } } diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObject4Tag.java b/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObject4Tag.java index e941221a7..b12c0f650 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObject4Tag.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/PlaceObject4Tag.java @@ -348,7 +348,7 @@ public class PlaceObject4Tag extends CharacterIdTag implements Container, PlaceO } if (placeFlagHasClipActions) { - clipActions = sis.readCLIPACTIONS(); + clipActions = sis.readCLIPACTIONS(swf); } amfData = sis.readBytes(sis.available()); } diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/Tag.java b/trunk/src/com/jpexs/decompiler/flash/tags/Tag.java index 6669ab91c..f3ac95464 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/Tag.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/Tag.java @@ -67,6 +67,10 @@ public class Tag implements NeedsCharacters, Exportable, ContainerItem { return id; } + public SWF getSwf() { + return swf; + } + /** * Constructor * diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/base/ContainerItem.java b/trunk/src/com/jpexs/decompiler/flash/tags/base/ContainerItem.java index 038dfece1..0b28be16a 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/base/ContainerItem.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/base/ContainerItem.java @@ -16,10 +16,14 @@ */ package com.jpexs.decompiler.flash.tags.base; +import com.jpexs.decompiler.flash.SWF; + /** * Object which contains other objects * * @author JPEXS */ public interface ContainerItem { + + SWF getSwf(); } diff --git a/trunk/src/com/jpexs/decompiler/flash/types/BUTTONCONDACTION.java b/trunk/src/com/jpexs/decompiler/flash/types/BUTTONCONDACTION.java index 7965a4d7c..bbab495ed 100644 --- a/trunk/src/com/jpexs/decompiler/flash/types/BUTTONCONDACTION.java +++ b/trunk/src/com/jpexs/decompiler/flash/types/BUTTONCONDACTION.java @@ -17,6 +17,7 @@ package com.jpexs.decompiler.flash.types; import com.jpexs.decompiler.flash.DisassemblyListener; +import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.SWFInputStream; import com.jpexs.decompiler.flash.action.Action; import com.jpexs.decompiler.flash.action.ActionListReader; @@ -42,14 +43,21 @@ import java.util.logging.Logger; */ public class BUTTONCONDACTION implements ASMSource, Exportable, ContainerItem { + private SWF swf; private long pos; + @Override + public SWF getSwf() { + return swf; + } + @Override public long getPos() { return pos; } - public BUTTONCONDACTION(InputStream is, int version, long containerOffset) throws IOException { + public BUTTONCONDACTION(SWF swf, InputStream is, int version, long containerOffset) throws IOException { + this.swf = swf; SWFInputStream sis = new SWFInputStream(is, version); pos = containerOffset; int condActionSize = sis.readUI16(); diff --git a/trunk/src/com/jpexs/decompiler/flash/types/CLIPACTIONRECORD.java b/trunk/src/com/jpexs/decompiler/flash/types/CLIPACTIONRECORD.java index 24d4a105c..9ff9ceec9 100644 --- a/trunk/src/com/jpexs/decompiler/flash/types/CLIPACTIONRECORD.java +++ b/trunk/src/com/jpexs/decompiler/flash/types/CLIPACTIONRECORD.java @@ -17,6 +17,7 @@ package com.jpexs.decompiler.flash.types; import com.jpexs.decompiler.flash.DisassemblyListener; +import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.SWFInputStream; import com.jpexs.decompiler.flash.action.Action; import com.jpexs.decompiler.flash.action.ActionListReader; @@ -84,10 +85,13 @@ public class CLIPACTIONRECORD implements ASMSource, Exportable, ContainerItem { null, "" }; + + private SWF swf; private long pos; private long hdrPos; - public CLIPACTIONRECORD(InputStream is, int version, long pos) throws IOException { + public CLIPACTIONRECORD(SWF swf, InputStream is, int version, long pos) throws IOException { + this.swf = swf; SWFInputStream sis = new SWFInputStream(is, version); eventFlags = sis.readCLIPEVENTFLAGS(); if (eventFlags.isClear()) { @@ -104,6 +108,11 @@ public class CLIPACTIONRECORD implements ASMSource, Exportable, ContainerItem { } + @Override + public SWF getSwf() { + return swf; + } + @Override public long getPos() { return pos; diff --git a/trunk/src/com/jpexs/helpers/Helper.java b/trunk/src/com/jpexs/helpers/Helper.java index 63cc41530..3e1bc30f3 100644 --- a/trunk/src/com/jpexs/helpers/Helper.java +++ b/trunk/src/com/jpexs/helpers/Helper.java @@ -498,19 +498,21 @@ public class Helper { try { f.setAccessible(true); Object v = f.get(obj); - if (v instanceof Collection) { - ((Collection) v).clear(); - } - if (v instanceof Component) { - if (((Component) v).getParent() != null) { - ((Component) v).getParent().remove((Component) v); + if (v != null) { + if (v instanceof Collection) { + ((Collection) v).clear(); } + if (v instanceof Component) { + if (((Component) v).getParent() != null) { + ((Component) v).getParent().remove((Component) v); + } + } + if (v instanceof Freed) { + ((Freed) v).free(); + } + f.set(obj, null); } - if (v instanceof Freed) { - ((Freed) v).free(); - } - f.set(obj, null); - } catch (SecurityException | IllegalArgumentException | IllegalAccessException ex) { + } catch (UnsupportedOperationException | SecurityException | IllegalArgumentException | IllegalAccessException ex) { } } }