diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties index 3e010dc6a..d1d7e1f34 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties @@ -538,3 +538,6 @@ preview.gotoframe.dialog.message = Enter frame number (%min% - %max%) preview.gotoframe.dialog.frame.error = Invalid frame number. It must be number between %min% and %max%. error.text.invalid.continue = Invalid text: %text% on line %line%. Do you want to continue? + +#after version 4.0.5 +contextmenu.copyTag = Copy tag to diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_hu.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_hu.properties index 1aa528bfe..e691cddb1 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_hu.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_hu.properties @@ -527,3 +527,17 @@ contextmenu.addTag = Tag hozz\u00e1ad\u00e1sa deobfuscation.comment.tryenable = Tipp: Megpr\u00f3b\u00e1lhatja bekapcsolni az "Automatikus deobfuszk\u00e1l\u00e1st" a Be\u00e1ll\u00edt\u00e1sokban deobfuscation.comment.failed = Deobfuszk\u00e1l\u00e1s be van kapcsolva, de a visszaford\u00edt\u00e1s meghi\u00fasult. Ha a f\u00e1jl NEM obfuszk\u00e1lt kapcsolja ki az "Automatikus deobfuszk\u00e1l\u00e1st" jobb eredm\u00e9nyek el\u00e9r\u00e9se \u00e9rdek\u00e9ben. + +#after version 4.0.2 +preview.nextframe = K\u00f6vetkez\u0151 keret +preview.prevframe = El\u0151z\u0151 keret +preview.gotoframe = Keretre ugr\u00e1s... + +preview.gotoframe.dialog.title = Keretre ugr\u00e1s +preview.gotoframe.dialog.message = \u00cdrja be a keret sz\u00e1m\u00e1t (%min% - %max%) +preview.gotoframe.dialog.frame.error = Hib\u00e1s keret sz\u00e1m. A k\u00f6vetkez\u0151 \u00e9rt\u00e9kek k\u00f6z\u00f6tt kell lennie: %min% \u00e9s %max%. + +error.text.invalid.continue = Hib\u00e1s sz\u00f6veg: %text% a %line%. sorban. Folytatja? + +#after version 4.0.5 +contextmenu.copyTag = M\u00e1sol\u00e1s ide diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java index 437c8de78..ad1258aaf 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java @@ -17,6 +17,7 @@ package com.jpexs.decompiler.flash.gui.tagtree; import com.jpexs.decompiler.flash.SWF; +import com.jpexs.decompiler.flash.SWFInputStream; import com.jpexs.decompiler.flash.gui.Main; import com.jpexs.decompiler.flash.gui.MainFrameRibbonMenu; import com.jpexs.decompiler.flash.gui.MainPanel; @@ -25,6 +26,7 @@ import com.jpexs.decompiler.flash.tags.DefineBinaryDataTag; import com.jpexs.decompiler.flash.tags.DefineSoundTag; import com.jpexs.decompiler.flash.tags.DefineSpriteTag; import com.jpexs.decompiler.flash.tags.Tag; +import com.jpexs.decompiler.flash.tags.TagStub; import com.jpexs.decompiler.flash.tags.base.CharacterIdTag; import com.jpexs.decompiler.flash.tags.base.CharacterTag; import com.jpexs.decompiler.flash.tags.base.ImageTag; @@ -39,6 +41,7 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; @@ -78,6 +81,7 @@ public class TagTreeContextMenu extends JPopupMenu implements ActionListener { private JMenuItem closeMenuItem; private JMenu addTagMenu; private JMenu moveTagMenu; + private JMenu copyTagMenu; private JMenuItem openSWFInsideTagMenuItem; public TagTreeContextMenu(final TagTree tagTree, MainPanel mainPanel) { @@ -131,6 +135,9 @@ public class TagTreeContextMenu extends JPopupMenu implements ActionListener { moveTagMenu = new JMenu(mainPanel.translate("contextmenu.moveTag")); add(moveTagMenu); + copyTagMenu = new JMenu(mainPanel.translate("contextmenu.copyTag")); + add(copyTagMenu); + openSWFInsideTagMenuItem = new JMenuItem(mainPanel.translate("contextmenu.openswfinside")); add(openSWFInsideTagMenuItem); openSWFInsideTagMenuItem.setActionCommand(ACTION_OPEN_SWFINSIDE); @@ -213,6 +220,7 @@ public class TagTreeContextMenu extends JPopupMenu implements ActionListener { closeMenuItem.setVisible(allSelectedIsSwf); addTagMenu.setVisible(false); moveTagMenu.setVisible(false); + copyTagMenu.setVisible(false); openSWFInsideTagMenuItem.setVisible(false); final TreeItem firstItem = items.get(0); @@ -280,6 +288,7 @@ public class TagTreeContextMenu extends JPopupMenu implements ActionListener { if (firstItem instanceof Tag && swfs.size() > 1) { final Tag tag = (Tag) firstItem; moveTagMenu.removeAll(); + copyTagMenu.removeAll(); for (SWFList targetSwfList : swfs) { for (final SWF targetSwf : targetSwfList) { if (targetSwf != tag.getSwf()) { @@ -299,10 +308,35 @@ public class TagTreeContextMenu extends JPopupMenu implements ActionListener { } }); moveTagMenu.add(swfItem); + + swfItem = new JMenuItem(targetSwf.getShortFileName()); + swfItem.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent ae) { + try { + SWF sourceSwf = tag.getSwf(); + byte[] data = tag.getData(); + SWFInputStream tagDataStream = new SWFInputStream(sourceSwf, data, tag.getDataPos(), data.length); + TagStub copy = new TagStub(sourceSwf, tag.getId(), "Unresolved", tag.getOriginalRange(), tagDataStream); + copy.forceWriteAsLong = tag.forceWriteAsLong; + Tag copyTag = SWFInputStream.resolveTag(copy, 0, false, true, false); + copyTag.setSwf(targetSwf); + targetSwf.tags.add(copyTag); + copyTag.setModified(true); + targetSwf.clearImageCache(); + mainPanel.refreshTree(); + } catch (IOException | InterruptedException ex) { + Logger.getLogger(TagTreeContextMenu.class.getName()).log(Level.SEVERE, null, ex); + } + } + }); + copyTagMenu.add(swfItem); } } } moveTagMenu.setVisible(true); + copyTagMenu.setVisible(true); } if (tagTree.getModel().getChildCount(firstItem) > 0) {