From 99a98e2d8facfe7c258d56d02f5910019dffe68f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=F8=EDk?= Date: Sun, 13 Jan 2013 17:03:07 +0100 Subject: [PATCH] AS1/2: exporting selection Flashplayer on/off constant --- trunk/src/com/jpexs/asdec/Main.java | 3 + trunk/src/com/jpexs/asdec/SWF.java | 51 ++------------ trunk/src/com/jpexs/asdec/action/TagNode.java | 68 +++++++++++++++++++ .../jpexs/asdec/action/gui/ActionPanel.java | 16 +++++ .../jpexs/asdec/action/gui/TagTreeModel.java | 6 +- trunk/src/com/jpexs/asdec/gui/MainFrame.java | 35 +++++++--- trunk/src/com/jpexs/asdec/gui/TagPanel.java | 19 ++++-- 7 files changed, 133 insertions(+), 65 deletions(-) diff --git a/trunk/src/com/jpexs/asdec/Main.java b/trunk/src/com/jpexs/asdec/Main.java index 6fcb1350a..a00883c3f 100644 --- a/trunk/src/com/jpexs/asdec/Main.java +++ b/trunk/src/com/jpexs/asdec/Main.java @@ -77,6 +77,9 @@ public class Main { return commandLineMode; } public static boolean DEBUG_COPY = false; + + public static boolean FLASH_PLAYER = true; + /** * Debug mode = throwing an error when comparing original file and recompiled */ diff --git a/trunk/src/com/jpexs/asdec/SWF.java b/trunk/src/com/jpexs/asdec/SWF.java index bce7de429..905148cf4 100644 --- a/trunk/src/com/jpexs/asdec/SWF.java +++ b/trunk/src/com/jpexs/asdec/SWF.java @@ -373,57 +373,14 @@ public class SWF { if (!asV3Found) { List list2 = new ArrayList(); list2.addAll(tags); - return exportNode(TagNode.createTagList(list2), outdir, isPcode); + List list=TagNode.createTagList(list2); + TagNode.setExport(list, true); + return TagNode.exportNode(list, outdir, isPcode); } return asV3Found; } - private boolean exportNode(List nodeList, String outdir, boolean isPcode) { - File dir = new File(outdir); - if (!dir.exists()) { - dir.mkdirs(); - } - List existingNames = new ArrayList(); - for (TagNode node : nodeList) { - String name = ""; - if (node.tag instanceof Tag) { - name = ((Tag) node.tag).getExportName(); - } - int i = 1; - String baseName = name; - while (existingNames.contains(name)) { - i++; - name = baseName + "_" + i; - } - existingNames.add(name); - if (node.subItems.isEmpty()) { - if (node.tag instanceof ASMSource) { - try { - String f = outdir + File.separatorChar + name + ".as"; - informListeners("export", "Exporting " + f + " ..."); - String ret; - if (isPcode) { - ret = ((ASMSource) node.tag).getASMSource(SWF.DEFAULT_VERSION); - } else { - List as = ((ASMSource) node.tag).getActions(SWF.DEFAULT_VERSION); - com.jpexs.asdec.action.Action.setActionsAddresses(as, 0, SWF.DEFAULT_VERSION); - ret = (Highlighting.stripHilights(com.jpexs.asdec.action.Action.actionsToSource(as, SWF.DEFAULT_VERSION))); - } - - - FileOutputStream fos = new FileOutputStream(f); - fos.write(ret.getBytes()); - fos.close(); - } catch (Exception ex) { - } - } - } else { - exportNode(node.subItems, outdir + File.separatorChar + name, isPcode); - } - - } - return true; - } + protected HashSet listeners = new HashSet(); public void addEventListener(EventListener listener) { diff --git a/trunk/src/com/jpexs/asdec/action/TagNode.java b/trunk/src/com/jpexs/asdec/action/TagNode.java index 455ea769d..f7c449296 100644 --- a/trunk/src/com/jpexs/asdec/action/TagNode.java +++ b/trunk/src/com/jpexs/asdec/action/TagNode.java @@ -16,14 +16,20 @@ */ package com.jpexs.asdec.action; +import com.jpexs.asdec.EventListener; +import com.jpexs.asdec.SWF; +import com.jpexs.asdec.helpers.Highlighting; import com.jpexs.asdec.tags.DefineButton2Tag; import com.jpexs.asdec.tags.DefineButtonTag; import com.jpexs.asdec.tags.DefineSpriteTag; import com.jpexs.asdec.tags.DoInitActionTag; import com.jpexs.asdec.tags.ExportAssetsTag; import com.jpexs.asdec.tags.ShowFrameTag; +import com.jpexs.asdec.tags.Tag; import com.jpexs.asdec.tags.base.ASMSource; import com.jpexs.asdec.tags.base.Container; +import java.io.File; +import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; @@ -31,6 +37,7 @@ public class TagNode { public List subItems; public Object tag; + public boolean export=false; public TagNode(Object tag) { this.tag = tag; @@ -110,4 +117,65 @@ public class TagNode { } return ret; } + + public static void setExport(List nodeList,boolean export){ + for(TagNode node:nodeList){ + node.export=export; + setExport(node.subItems, export); + } + } + + public static boolean exportNode(List nodeList, String outdir, boolean isPcode){ + return exportNode(nodeList,outdir,isPcode,null); + } + public static boolean exportNode(List nodeList, String outdir, boolean isPcode, EventListener ev) { + File dir = new File(outdir); + List existingNames = new ArrayList(); + for (TagNode node : nodeList) { + String name = ""; + if (node.tag instanceof Tag) { + name = ((Tag) node.tag).getExportName(); + }else{ + name=node.tag.toString(); + } + int i = 1; + String baseName = name; + while (existingNames.contains(name)) { + i++; + name = baseName + "_" + i; + } + existingNames.add(name); + if (node.subItems.isEmpty()) { + if ((node.tag instanceof ASMSource)&&(node.export)) { + if (!dir.exists()) { + dir.mkdirs(); + } + try { + String f = outdir + File.separatorChar + name + ".as"; + if(ev!=null){ + ev.handleEvent("export", "Exporting " + f + " ..."); + } + String ret; + if (isPcode) { + ret = ((ASMSource) node.tag).getASMSource(SWF.DEFAULT_VERSION); + } else { + List as = ((ASMSource) node.tag).getActions(SWF.DEFAULT_VERSION); + com.jpexs.asdec.action.Action.setActionsAddresses(as, 0, SWF.DEFAULT_VERSION); + ret = (Highlighting.stripHilights(com.jpexs.asdec.action.Action.actionsToSource(as, SWF.DEFAULT_VERSION))); + } + + + FileOutputStream fos = new FileOutputStream(f); + fos.write(ret.getBytes()); + fos.close(); + } catch (Exception ex) { + } + } + } else { + exportNode(node.subItems, outdir + File.separatorChar + name, isPcode,ev); + } + + } + return true; + } } diff --git a/trunk/src/com/jpexs/asdec/action/gui/ActionPanel.java b/trunk/src/com/jpexs/asdec/action/gui/ActionPanel.java index 8396bcca4..d16adb126 100644 --- a/trunk/src/com/jpexs/asdec/action/gui/ActionPanel.java +++ b/trunk/src/com/jpexs/asdec/action/gui/ActionPanel.java @@ -18,6 +18,7 @@ package com.jpexs.asdec.action.gui; import com.jpexs.asdec.Main; import com.jpexs.asdec.SWF; +import com.jpexs.asdec.abc.gui.TreeElement; import com.jpexs.asdec.action.TagNode; import com.jpexs.asdec.action.parser.ASMParser; import com.jpexs.asdec.action.parser.ParseException; @@ -30,12 +31,14 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.ByteArrayInputStream; import java.io.IOException; +import java.util.ArrayList; import java.util.List; import javax.swing.*; import javax.swing.border.BevelBorder; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultTreeCellRenderer; +import javax.swing.tree.TreePath; import jsyntaxpane.DefaultSyntaxKit; public class ActionPanel extends JPanel implements TreeSelectionListener, ActionListener { @@ -146,6 +149,19 @@ public class ActionPanel extends JPanel implements TreeSelectionListener, Action splitPane2.setDividerLocation(0.5); } + public List getSelectedNodes() { + List ret = new ArrayList(); + TreePath tps[] = tagTree.getSelectionPaths(); + if (tps == null) { + return ret; + } + for (TreePath tp : tps) { + TagNode te = (TagNode) tp.getLastPathComponent(); + ret.add(te); + } + return ret; + } + public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("SAVEACTION")) { TagNode ti = (TagNode) tagTree.getLastSelectedPathComponent(); diff --git a/trunk/src/com/jpexs/asdec/action/gui/TagTreeModel.java b/trunk/src/com/jpexs/asdec/action/gui/TagTreeModel.java index e848726d8..24be9107e 100644 --- a/trunk/src/com/jpexs/asdec/action/gui/TagTreeModel.java +++ b/trunk/src/com/jpexs/asdec/action/gui/TagTreeModel.java @@ -34,7 +34,11 @@ public class TagTreeModel implements TreeModel { list2.addAll(list); this.list = TagNode.createTagList(list2); } - + + public List getNodeList(){ + return list; + } + public Object getRoot() { return root; } diff --git a/trunk/src/com/jpexs/asdec/gui/MainFrame.java b/trunk/src/com/jpexs/asdec/gui/MainFrame.java index 819e1df73..8c9a733fc 100644 --- a/trunk/src/com/jpexs/asdec/gui/MainFrame.java +++ b/trunk/src/com/jpexs/asdec/gui/MainFrame.java @@ -215,7 +215,7 @@ public class MainFrame extends JFrame implements ActionListener { getActionScript3(objs, abcList); getContentPane().add(tabPane, BorderLayout.CENTER); - + if (!abcList.isEmpty()) { tabPane.addTab("ActionScript3", abcPanel = new ABCPanel(abcList)); } else { @@ -223,8 +223,9 @@ public class MainFrame extends JFrame implements ActionListener { if (actionPanel.tagTree.getRowCount() > 1) { tabPane.addTab("ActionScript", actionPanel); } + menuDeobfuscation.setEnabled(false); } - + if (!shapes.isEmpty()) { tabPane.addTab("Shapes", new TagPanel(shapes, swf)); } @@ -249,7 +250,7 @@ public class MainFrame extends JFrame implements ActionListener { /*tabPane.addTab("Tags", new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, new JScrollPane(tagTree), new JScrollPane(fPanel)));*/ //tabPane.setTabPlacement(JTabbedPane.TOP); - + loadingPanel.setPreferredSize(new Dimension(30, 30)); @@ -589,14 +590,26 @@ public class MainFrame extends JFrame implements ActionListener { public void run() { try { if (onlySel) { - List tlsList = abcPanel.classTree.getSelectedScripts(); - if (tlsList.isEmpty()) { - JOptionPane.showMessageDialog(null, "No script selected!"); - } - for (int i = 0; i < tlsList.size(); i++) { - TreeLeafScript tls = tlsList.get(i); - Main.startWork("Exporting " + (i + 1) + "/" + tlsList.size() + " " + tls.abc.script_info[tls.scriptIndex].getPath(tls.abc) + " ..."); - tls.abc.script_info[tls.scriptIndex].export(tls.abc, abcPanel.list, selFile, isPcode); + if (abcPanel != null) { + List tlsList = abcPanel.classTree.getSelectedScripts(); + if (tlsList.isEmpty()) { + JOptionPane.showMessageDialog(null, "No script selected!"); + } + for (int i = 0; i < tlsList.size(); i++) { + TreeLeafScript tls = tlsList.get(i); + Main.startWork("Exporting " + (i + 1) + "/" + tlsList.size() + " " + tls.abc.script_info[tls.scriptIndex].getPath(tls.abc) + " ..."); + tls.abc.script_info[tls.scriptIndex].export(tls.abc, abcPanel.list, selFile, isPcode); + } + } else if(actionPanel!=null) { + List nodes=actionPanel.getSelectedNodes(); + if (nodes.isEmpty()) { + JOptionPane.showMessageDialog(null, "No nodes selected!"); + } + com.jpexs.asdec.action.gui.TagTreeModel ttm=(com.jpexs.asdec.action.gui.TagTreeModel)actionPanel.tagTree.getModel(); + List allnodes=ttm.getNodeList(); + com.jpexs.asdec.action.TagNode.setExport(allnodes, false); + com.jpexs.asdec.action.TagNode.setExport(nodes, true); + com.jpexs.asdec.action.TagNode.exportNode(allnodes, selFile, isPcode); } } else { Main.swf.exportActionScript(selFile, isPcode); diff --git a/trunk/src/com/jpexs/asdec/gui/TagPanel.java b/trunk/src/com/jpexs/asdec/gui/TagPanel.java index 98a47ac28..8a6c2431e 100644 --- a/trunk/src/com/jpexs/asdec/gui/TagPanel.java +++ b/trunk/src/com/jpexs/asdec/gui/TagPanel.java @@ -16,6 +16,7 @@ */ package com.jpexs.asdec.gui; +import com.jpexs.asdec.Main; import com.jpexs.asdec.SWF; import com.jpexs.asdec.SWFOutputStream; import com.jpexs.asdec.tags.DefineBitsJPEG2Tag; @@ -98,9 +99,13 @@ public class TagPanel extends JPanel implements ListSelectionListener { tagList.setPreferredSize(new Dimension(200, 1)); tagList.setSize(200, 1); setLayout(new BorderLayout()); - flashPanel = new FlashPanel(); + if (Main.FLASH_PLAYER) { + flashPanel = new FlashPanel(); + } displayPanel = new JPanel(new CardLayout()); - displayPanel.add(flashPanel, CARDFLASHPANEL); + if (Main.FLASH_PLAYER) { + displayPanel.add(flashPanel, CARDFLASHPANEL); + } imagePanel = new ImagePanel(); CardLayout cl = (CardLayout) (displayPanel.getLayout()); cl.show(displayPanel, CARDEMPTYPANEL); @@ -166,7 +171,7 @@ public class TagPanel extends JPanel implements ListSelectionListener { if (tagObj instanceof AloneTag) { sos2.writeTag(tagObj); - }else{ + } else { for (Tag tag : swf.tags) { if ((!(tag instanceof PlaceObjectTag)) && (!(tag instanceof PlaceObject2Tag)) @@ -202,7 +207,7 @@ public class TagPanel extends JPanel implements ListSelectionListener { mat.translateY = -r.Ymin; mat.translateX = mat.translateX + width / 2 - r.getWidth() / 2; mat.translateY = mat.translateY + height / 2 - r.getHeight() / 2; - }else { + } else { mat.translateX = width / 4; mat.translateY = height / 4; } @@ -259,10 +264,12 @@ public class TagPanel extends JPanel implements ListSelectionListener { sos.write(data); fos.close(); showCard(CARDFLASHPANEL); - flashPanel.displaySWF(tempFile.getAbsolutePath()); + if (Main.FLASH_PLAYER) { + flashPanel.displaySWF(tempFile.getAbsolutePath()); + } } catch (Exception ex) { - ex.printStackTrace(); + } }