From 01136480240efad95aad13e89b07b32e741dcd86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Mon, 7 Nov 2022 19:23:23 +0100 Subject: [PATCH] Added #1460 Bulk importing images --- CHANGELOG.md | 2 + .../flash/configuration/Configuration.java | 4 + .../exporters/modes/ImageExportMode.java | 4 +- .../flash/importers/ImageImporter.java | 3 +- .../flash/tags/DefineSpriteTag.java | 8 + .../decompiler/flash/tags/base/ButtonTag.java | 9 + .../decompiler/flash/timeline/Timelined.java | 2 + .../decompiler/flash/gui/MainFrameMenu.java | 14 +- .../flash/gui/MainFrameRibbonMenu.java | 103 +++++++-- .../jpexs/decompiler/flash/gui/MainPanel.java | 196 +++++++++++++----- .../flash/gui/graphics/importimage16.png | Bin 0 -> 6842 bytes .../flash/gui/graphics/importimage32.png | Bin 0 -> 9267 bytes .../flash/gui/graphics/importother16.png | Bin 0 -> 6294 bytes .../flash/gui/graphics/importother32.png | Bin 0 -> 1432 bytes .../locales/AdvancedSettingsDialog.properties | 5 + .../AdvancedSettingsDialog_cs.properties | 17 ++ .../flash/gui/locales/MainFrame.properties | 15 +- .../flash/gui/locales/MainFrame_cs.properties | 17 +- 18 files changed, 319 insertions(+), 80 deletions(-) create mode 100644 src/com/jpexs/decompiler/flash/gui/graphics/importimage16.png create mode 100644 src/com/jpexs/decompiler/flash/gui/graphics/importimage32.png create mode 100644 src/com/jpexs/decompiler/flash/gui/graphics/importother16.png create mode 100644 src/com/jpexs/decompiler/flash/gui/graphics/importother32.png diff --git a/CHANGELOG.md b/CHANGELOG.md index eddc91b54..39392cda5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ All notable changes to this project will be documented in this file. ### Added - [#1414] Cancelling in-progress exportation - [#1755] Copy tags to tag clipboard and paste them elsewhere +- [#1460] Bulk importing images ### Fixed - FLA export printing xxx string on exporting character with id 320 @@ -2514,6 +2515,7 @@ All notable changes to this project will be documented in this file. [alpha 7]: https://github.com/jindrapetrik/jpexs-decompiler/releases/tag/alpha7 [#1414]: https://www.free-decompiler.com/flash/issues/1414 [#1755]: https://www.free-decompiler.com/flash/issues/1755 +[#1460]: https://www.free-decompiler.com/flash/issues/1460 [#1459]: https://www.free-decompiler.com/flash/issues/1459 [#1832]: https://www.free-decompiler.com/flash/issues/1832 [#1849]: https://www.free-decompiler.com/flash/issues/1849 diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java index 4bfbd8991..a62004fe0 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java @@ -755,6 +755,10 @@ public final class Configuration { @ConfigurationDefaultBoolean(true) @ConfigurationCategory("ui") public static ConfigurationItem showImportXmlInfo = null; + + @ConfigurationDefaultBoolean(true) + @ConfigurationCategory("ui") + public static ConfigurationItem showImportImageInfo = null; private enum OSId { WINDOWS, OSX, UNIX diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/modes/ImageExportMode.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/modes/ImageExportMode.java index 9dcb9c9c5..f036fe627 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/modes/ImageExportMode.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/modes/ImageExportMode.java @@ -20,7 +20,7 @@ package com.jpexs.decompiler.flash.exporters.modes; * * @author JPEXS */ -public enum ImageExportMode { - +public enum ImageExportMode { + PNG_GIF_JPEG, PNG, JPEG, BMP } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/ImageImporter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/ImageImporter.java index f67639249..eaa18a7b9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/ImageImporter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/ImageImporter.java @@ -97,8 +97,9 @@ public class ImageImporter extends TagImporter { } imageTag.setModified(true); - swf.replaceTag(it, imageTag); + it.getTimelined().replaceTag(it, imageTag); swf.updateCharacters(); + swf.resetTimelines(swf); return imageTag; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineSpriteTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineSpriteTag.java index 9c42a20b5..7ae843c11 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineSpriteTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineSpriteTag.java @@ -441,6 +441,14 @@ public class DefineSpriteTag extends DrawableTag implements Timelined { removeTag(index); addTag(index, newTag); } + + @Override + public void replaceTag(Tag oldTag, Tag newTag) { + int index = indexOfTag(oldTag); + if (index != -1) { + replaceTag(index, newTag); + } + } @Override public RECT getRectWithStrokes() { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ButtonTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ButtonTag.java index 210c2d757..e85c3240b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ButtonTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ButtonTag.java @@ -183,4 +183,13 @@ public abstract class ButtonTag extends DrawableTag implements Timelined { removeTag(index); addTag(index, newTag); } + + @Override + public void replaceTag(Tag oldTag, Tag newTag) { + setModified(true); + int index = indexOfTag(oldTag); + if (index != -1) { + replaceTag(index, newTag); + } + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/Timelined.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/Timelined.java index be2526118..162e58b1e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/Timelined.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/timeline/Timelined.java @@ -44,5 +44,7 @@ public interface Timelined extends BoundedTag { public void replaceTag(int index, Tag newTag); + public void replaceTag(Tag oldTag, Tag newTag); + public int indexOfTag(Tag tag); } diff --git a/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java b/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java index 63a5ff809..a329ee7c3 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java +++ b/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java @@ -266,6 +266,13 @@ public abstract class MainFrameMenu implements MenuBuilder { mainFrame.getPanel().importScript(swf); } + + protected void importImagesActionPerformed(ActionEvent evt) { + if (Main.isWorking()) { + return; + } + mainFrame.getPanel().importImage(swf); + } protected void importSymbolClassActionPerformed(ActionEvent evt) { if (Main.isWorking()) { @@ -758,7 +765,7 @@ public abstract class MainFrameMenu implements MenuBuilder { setMenuEnabled("/file/import", swfSelected); setMenuEnabled("/file/import/importText", swfSelected && !isWorking); setMenuEnabled("/file/import/importScript", swfSelected && !isWorking); - setMenuEnabled("/file/import/importSymbolClass", swfSelected && !isWorking); + setMenuEnabled("/file/import/importOther", swfSelected && !isWorking); setMenuEnabled("/file/import/importXml", swfSelected && !isWorking); setMenuEnabled("/tools/deobfuscation", swfSelected); @@ -885,7 +892,10 @@ public abstract class MainFrameMenu implements MenuBuilder { addMenuItem("/file/import/importXml", translate("menu.file.import.xml"), "importxml32", this::importXmlActionPerformed, PRIORITY_TOP, null, true, null, false); addMenuItem("/file/import/importText", translate("menu.file.import.text"), "importtext32", this::importTextActionPerformed, PRIORITY_MEDIUM, null, true, null, false); addMenuItem("/file/import/importScript", translate("menu.file.import.script"), "importscript32", this::importScriptActionPerformed, PRIORITY_MEDIUM, null, true, null, false); - addMenuItem("/file/import/importSymbolClass", translate("menu.file.import.symbolClass"), "importsymbolclass32", this::importSymbolClassActionPerformed, PRIORITY_MEDIUM, null, true, null, false); + addMenuItem("/file/import/importOther", translate("menu.file.import.other"), "importother32", null, PRIORITY_MEDIUM, null, false, null, false); + addMenuItem("/file/import/importOther/importImages", translate("menu.file.import.images"), "importimage32", this::importImagesActionPerformed, PRIORITY_MEDIUM, null, true, null, false); + addMenuItem("/file/import/importOther/importSymbolClass", translate("menu.file.import.symbolClass"), "importsymbolclass32", this::importSymbolClassActionPerformed, PRIORITY_MEDIUM, null, true, null, false); + finishMenu("/file/import/importOther"); finishMenu("/file/import"); addMenuItem("/file/start", translate("menu.file.start"), null, null, 0, null, false, null, false); diff --git a/src/com/jpexs/decompiler/flash/gui/MainFrameRibbonMenu.java b/src/com/jpexs/decompiler/flash/gui/MainFrameRibbonMenu.java index ec150c902..70bfacf86 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainFrameRibbonMenu.java +++ b/src/com/jpexs/decompiler/flash/gui/MainFrameRibbonMenu.java @@ -22,27 +22,36 @@ import com.jpexs.decompiler.flash.search.ScriptSearchResult; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; +import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.ItemListener; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import javax.swing.ButtonGroup; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JLabel; +import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; +import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JToggleButton; import javax.swing.SwingUtilities; import javax.swing.UIManager; +import javax.swing.event.ChangeListener; +import javax.swing.plaf.basic.BasicPopupMenuUI; import org.pushingpixels.flamingo.api.common.AbstractCommandButton; import org.pushingpixels.flamingo.api.common.CommandButtonDisplayState; import org.pushingpixels.flamingo.api.common.CommandToggleButtonGroup; import org.pushingpixels.flamingo.api.common.JCommandButton; import org.pushingpixels.flamingo.api.common.JCommandButtonPanel; import org.pushingpixels.flamingo.api.common.JCommandToggleButton; +import org.pushingpixels.flamingo.api.common.PopupActionListener; +import org.pushingpixels.flamingo.api.common.model.PopupButtonModel; import org.pushingpixels.flamingo.api.common.popup.JPopupPanel; import org.pushingpixels.flamingo.api.common.popup.PopupPanelCallback; import org.pushingpixels.flamingo.api.ribbon.AbstractRibbonBand; @@ -373,30 +382,41 @@ public class MainFrameRibbonMenu extends MainFrameMenu { final ActionListener subLoader = menuLoaders.get(sub); AbstractCommandButton but = null; if (subType == TYPE_MENUITEM || (subType == TYPE_MENU && subAction != null)) { - JCommandButton cbut; - if (subIcon != null) { - cbut = new JCommandButton(fixCommandTitle(subTitle), View.getResizableIcon(subIcon, subPriority == PRIORITY_TOP ? 32 : 16)); + if (parts.length == 4) { + JMenuItem menuItem = new JMenuItem(subTitle); + if (subIcon != null) { + menuItem.setIcon(View.getIcon(subIcon, 16)); + } + if (subAction != null) { + menuItem.addActionListener(subAction); + } + menuItems.put(sub, menuItem); } else { - cbut = new JCommandButton(fixCommandTitle(subTitle)); - } - if (subKey != null) { - //cbut.setActionRichTooltip(new RichTooltip(subTitle, subKey.toString())); - } - if (subLoader != null) { - cbut.setCommandButtonKind(JCommandButton.CommandButtonKind.ACTION_AND_POPUP_MAIN_ACTION); - cbut.setPopupCallback(new PopupPanelCallback() { + JCommandButton cbut; + if (subIcon != null) { + cbut = new JCommandButton(fixCommandTitle(subTitle), View.getResizableIcon(subIcon, subPriority == PRIORITY_TOP ? 32 : 16)); + } else { + cbut = new JCommandButton(fixCommandTitle(subTitle)); + } + if (subKey != null) { + //cbut.setActionRichTooltip(new RichTooltip(subTitle, subKey.toString())); + } + if (subLoader != null) { + cbut.setCommandButtonKind(JCommandButton.CommandButtonKind.ACTION_AND_POPUP_MAIN_ACTION); + cbut.setPopupCallback(new PopupPanelCallback() { - @Override - public JPopupPanel getPopupPanel(JCommandButton jcb) { - JPopupPanel jp = new JPopupPanel() { - }; + @Override + public JPopupPanel getPopupPanel(JCommandButton jcb) { + JPopupPanel jp = new JPopupPanel() { + }; - subLoader.actionPerformed(new ActionEvent(jp, 0, "load:" + sub)); - return jp; - } - }); + subLoader.actionPerformed(new ActionEvent(jp, 0, "load:" + sub)); + return jp; + } + }); + } + but = cbut; } - but = cbut; } else if (subType == TYPE_TOGGLEMENUITEM) { if (onlyCheckboxes) { JCheckBox cb = new JCheckBox(subTitle); @@ -422,6 +442,44 @@ public class MainFrameRibbonMenu extends MainFrameMenu { } //if (parts.length == 3) + if (parts.length == 4) + { + JCommandButton popupButton; + if (icon != null) { + popupButton = new JCommandButton(fixCommandTitle(title), View.getResizableIcon(icon, priority == PRIORITY_TOP ? 32 : 16)); + } else { + popupButton = new JCommandButton(fixCommandTitle(title)); + } + JPopupMenu popupMenu = new JPopupMenu(); + popupButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + popupMenu.show(popupButton, 0, popupButton.getHeight()); + } + }); + int cnt = 0; + for (String sub : subs) { + if (sub.equals("-")) { + continue; + } + + Object o = menuItems.get(sub); + int subPriority = menuPriorities.get(sub); + int subType = menuType.get(sub); + ActionListener subAction = menuActions.get(sub); + if (subType != TYPE_MENU || (subAction != null)) { + if (o instanceof JMenuItem) { + JMenuItem mi = (JMenuItem)o; + popupMenu.add((JMenuItem) o); + cnt++; + } + } + } + if (cnt > 0) { + menuItems.put(path, popupButton); + } + } + else { //3rd level - it's a Band! JRibbonBand band = new JRibbonBand(title, icon != null ? View.getResizableIcon(icon, 16) : null, null); band.setResizePolicies(getResizePolicies(band)); @@ -435,7 +493,8 @@ public class MainFrameRibbonMenu extends MainFrameMenu { int subPriority = menuPriorities.get(sub); int subType = menuType.get(sub); ActionListener subAction = menuActions.get(sub); - if (subType != TYPE_MENU || (subAction != null)) { + //if (subType != TYPE_MENU || (subAction != null)) + { if (o instanceof AbstractCommandButton) { RibbonElementPriority ribbonPriority = RibbonElementPriority.MEDIUM; switch (subPriority) { @@ -452,6 +511,8 @@ public class MainFrameRibbonMenu extends MainFrameMenu { band.addCommandButton((AbstractCommandButton) o, ribbonPriority); cnt++; + } else if (o instanceof JRibbonBand) { + //ignore } else if (o instanceof JComponent) { band.addRibbonComponent(new JRibbonComponent((JComponent) o)); cnt++; diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index 52f46e531..e9d035e5a 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -377,16 +377,16 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se private TagTreeContextMenu contextPopupMenu; private static final Logger logger = Logger.getLogger(MainPanel.class.getName()); - + private Map> missingNeededCharacters = new WeakHashMap<>(); - + private Thread calculateMissingNeededThread; private List> orderedClipboard = new ArrayList<>(); private Map clipboard = new WeakHashMap<>(); - + private boolean clipboardCut = false; - + public void gcClipboard() { for (int i = orderedClipboard.size() - 1; i >= 0; i--) { WeakReference ref = orderedClipboard.get(i); @@ -399,11 +399,11 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } } } - + public void emptyClipboard() { copyToClipboard(new ArrayList<>()); } - + public void copyToClipboard(Collection items) { orderedClipboard.clear(); clipboard.clear(); @@ -413,20 +413,20 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } clipboardCut = false; } - + public void cutToClipboard(Collection items) { copyToClipboard(items); - clipboardCut = true; + clipboardCut = true; } - + public boolean clipboardContains(TreeItem item) { return clipboard.containsKey(item); } - + public boolean clipboardEmpty() { return clipboard.isEmpty(); } - + public Set getClipboardContents() { Set ret = new LinkedHashSet<>(); for (WeakReference ref : orderedClipboard) { @@ -440,9 +440,8 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se public boolean isClipboardCut() { return clipboardCut; - } - - + } + private class MyTreeSelectionModel extends DefaultTreeSelectionModel { private boolean isModified() { @@ -593,7 +592,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se statusPanel.setWorkStatus(s, worker); mainMenu.updateComponents(); } - + public CancellableWorker getCurrentWorker() { return statusPanel.getCurrentWorker(); } @@ -778,9 +777,9 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se dumpTree = new DumpTree(null, this); dumpTree.addTreeSelectionListener(this); dumpTree.createContextMenu(); - + currentView = Configuration.lastView.get(); - + statusPanel = new MainFrameStatusPanel(this); add(statusPanel, BorderLayout.SOUTH); @@ -958,7 +957,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se calculateMissingNeededThread = new Thread("calculateMissingNeededThread") { @Override public void run() { - while(true) { + while (true) { calculateMissingNeededCharacters(); try { Thread.sleep(1000); @@ -966,7 +965,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se return; } } - } + } }; calculateMissingNeededThread.start(); } @@ -1020,7 +1019,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se if (swf != null) { updateUi(swf); } - + gcClipboard(); doFilter(); @@ -1221,7 +1220,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se refreshTree(); gcClipboard(); - + mainMenu.updateComponents(null); previewPanel.clear(); dumpPreviewPanel.clear(); @@ -2510,7 +2509,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se fc.setCurrentDirectory(new File(selDir)); if (!selDir.endsWith(File.separator)) { selDir += File.separator; - } + } String swfShortName = swf.getShortFileName(); if ("".equals(swfShortName)) { swfShortName = "untitled.swf"; @@ -2522,7 +2521,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se fileName = swfShortName + ".fla"; } final String fSwfShortName = swfShortName; - + fc.setSelectedFile(new File(selDir + fileName)); List flaFilters = new ArrayList<>(); List xflFilters = new ArrayList<>(); @@ -2621,6 +2620,96 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } } + public void importImage(final SWF swf) { + ViewMessages.showMessageDialog(MainPanel.this, translate("message.info.importImages"), translate("message.info"), JOptionPane.INFORMATION_MESSAGE, Configuration.showImportImageInfo); + JFileChooser chooser = new JFileChooser(); + chooser.setCurrentDirectory(new File(Configuration.lastExportDir.get())); + chooser.setDialogTitle(translate("import.select.directory")); + chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + chooser.setAcceptAllFileFilterUsed(false); + if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { + String selFile = Helper.fixDialogFile(chooser.getSelectedFile()).getAbsolutePath(); + File imagesDir = new File(Path.combine(selFile, ImageExportSettings.EXPORT_FOLDER_NAME)); + ImageImporter imageImporter = new ImageImporter(); + + final long timeBefore = System.currentTimeMillis(); + new CancellableWorker() { + + private int count = 0; + + @Override + public Void doInBackground() throws Exception { + try { + Map characters = swf.getCharacters(); + List extensions = Arrays.asList("png", "jpg", "jpeg", "gif", "bmp"); + for (int characterId : characters.keySet()) { + CharacterTag tag = characters.get(characterId); + if (tag instanceof ImageTag) { + ImageTag imageTag = (ImageTag) tag; + if (!imageTag.importSupported()) { + continue; + } + List existingFilesForImageTag = new ArrayList<>(); + for (String ext : extensions) { + File sourceFile = new File(Path.combine(imagesDir.getPath(), "" + characterId + "." + ext)); + if (sourceFile.exists()) { + existingFilesForImageTag.add(sourceFile); + } + } + + if (existingFilesForImageTag.isEmpty()) { + continue; + } + + if (existingFilesForImageTag.size() > 1) { + Logger.getLogger(MainPanel.class.getName()).log(Level.WARNING, "Multiple matching files for image tag {0} exists, {1} selected", new Object[]{characterId, existingFilesForImageTag.get(0).getName()}); + } + File sourceFile = existingFilesForImageTag.get(0); + try { + imageImporter.importImage(imageTag, Helper.readFile(sourceFile.getPath())); + count++; + } catch (IOException ex) { + Logger.getLogger(MainPanel.class.getName()).log(Level.WARNING, "Cannot import image " + characterId + " from file " + sourceFile.getName(), ex); + } + if (Thread.currentThread().isInterrupted()) { + break; + } + } + } + swf.clearImageCache(); + } catch (Exception ex) { + logger.log(Level.SEVERE, "Error during import", ex); + ViewMessages.showMessageDialog(null, translate("error.import") + ": " + ex.getClass().getName() + " " + ex.getLocalizedMessage()); + } + return null; + } + + @Override + protected void onStart() { + Main.startWork(translate("work.importing") + "...", this); + } + + @Override + protected void done() { + Main.stopWork(); + long timeAfter = System.currentTimeMillis(); + final long timeMs = timeAfter - timeBefore; + + + View.execInEventDispatch(() -> { + refreshTree(swf); + setStatus(translate("import.finishedin").replace("%time%", Helper.formatTimeSec(timeMs))); + + ViewMessages.showMessageDialog(MainPanel.this, translate("import.image.result").replace("%count%", Integer.toString(count))); + if (count != 0) { + reload(true); + } + }); + } + }.execute(); + } + } + public void importText(final SWF swf) { ViewMessages.showMessageDialog(MainPanel.this, translate("message.info.importTexts"), translate("message.info"), JOptionPane.INFORMATION_MESSAGE, Configuration.showImportTextInfo); JFileChooser chooser = new JFileChooser(); @@ -2868,8 +2957,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se swfs.add(item.getSwf()); } } - - + for (SWF item : swfs) { SWF swf = (SWF) item; final String selFile = selectExportDir(); @@ -2883,7 +2971,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se logger.log(Level.SEVERE, null, ex); } } - } + } } public void exportSwfXml() { @@ -3257,7 +3345,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se public boolean nextTag() { JTree tree = getCurrentTree(); - + if (tree != null) { if (tree.getSelectionRows().length > 0) { int row = tree.getSelectionRows()[0]; @@ -3636,24 +3724,24 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se if (treeItem == null) { return -1; } - if (currentView == VIEW_DUMP){ + if (currentView == VIEW_DUMP) { if (treeItem instanceof Tag) { Tag t = (Tag) treeItem; ReadOnlyTagList tags = t.getTimelined().getTags(); - int frame = 0; + int frame = 0; for (int i = 0; i < tags.size(); i++) { if (tags.get(i) == t) { return frame; } if (tags.get(i) instanceof ShowFrameTag) { frame++; - } - } + } + } } return -1; } - - if(currentView == VIEW_TIMELINE) { + + if (currentView == VIEW_TIMELINE) { return -1; } TreePath path = getCurrentTree().getModel().getTreePath(treeItem); @@ -3673,17 +3761,17 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se if (treeItem == null) { return null; } - + if (currentView == VIEW_DUMP) { if (treeItem instanceof Tag) { Tag t = (Tag) treeItem; return t.getTimelined(); } - return null; + return null; } if (currentView == VIEW_TIMELINE) { return null; - } + } TreePath path = getCurrentTree().getModel().getTreePath(treeItem); if (path == null) { @@ -3763,14 +3851,14 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se dumpTree.expandFirstLevelNodes(); } break; - case VIEW_RESOURCES: + case VIEW_RESOURCES: case VIEW_TAGLIST: if (tagTree.getModel() == null) { TagTreeModel ttm = new TagTreeModel(swfs, Configuration.tagTreeShowEmptyFolders.get()); tagTree.setModel(ttm); tagTree.expandFirstLevelNodes(); - } - + } + if (tagListTree.getModel() == null) { TagListTreeModel ttm = new TagListTreeModel(swfs); tagListTree.setModel(ttm); @@ -3844,7 +3932,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se reload(true); return true; - case VIEW_TIMELINE: + case VIEW_TIMELINE: currentView = view; Configuration.lastView.set(currentView); final SWF swf = getCurrentSwf(); @@ -3920,7 +4008,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } catch (IOException ex) { //ignore } - } + } } catch (InterruptedException ex) { //ignore } @@ -4078,8 +4166,8 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se SwfSpecificCustomConfiguration swfCustomConf = Configuration.getOrCreateSwfSpecificCustomConfiguration(swf.getShortFileName()); //swfConf.lastSelectedPath = tagTree.getSelectionPathString(); swfCustomConf.setCustomData(SwfSpecificCustomConfiguration.KEY_LAST_SELECTED_PATH_RESOURCES, tagTree.getSelectionPathString()); - swfCustomConf.setCustomData(SwfSpecificCustomConfiguration.KEY_LAST_SELECTED_PATH_TAGLIST, tagListTree.getSelectionPathString()); - + swfCustomConf.setCustomData(SwfSpecificCustomConfiguration.KEY_LAST_SELECTED_PATH_TAGLIST, tagListTree.getSelectionPathString()); + } } @@ -4106,7 +4194,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se stopFlashPlayer(); previewPanel.setImageReplaceButtonVisible(false, false, false, false); - + boolean internalViewer = !isAdobeFlashPlayerEnabled(); if (treeItem instanceof ScriptPack) { @@ -4253,7 +4341,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se for (Tag tag : timelined.getTags()) { if (tag instanceof DefineSpriteTag) { folderPreviewItems.add(tag); - addFolderPreviewItems(folderPreviewItems, folderName, (DefineSpriteTag) tag); + addFolderPreviewItems(folderPreviewItems, folderName, (DefineSpriteTag) tag); } } break; @@ -4304,7 +4392,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se break; } } - + private void showFolderPreview(FolderItem item) { List folderPreviewItems = new ArrayList<>(); String folderName = item.getName(); @@ -4560,6 +4648,10 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se public void replaceTag(int index, Tag newTag) { } + @Override + public void replaceTag(Tag oldTag, Tag newTag) { + } + @Override public int indexOfTag(Tag tag) { return -1; @@ -4593,18 +4685,18 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } setDropTarget(null); disposeInner(this); - Helper.emptyObject(this); + Helper.emptyObject(this); } - + private static void calculateMissingNeededCharacters(Map> missingNeededCharacters, Timelined tim) { - for (Tag t: tim.getTags()) { + for (Tag t : tim.getTags()) { missingNeededCharacters.put(t, t.getMissingNeededCharacters()); if (t instanceof DefineSpriteTag) { calculateMissingNeededCharacters(missingNeededCharacters, (DefineSpriteTag) t); } - } + } } - + public void calculateMissingNeededCharacters() { Map> missingNeededCharacters = new WeakHashMap<>(); List swfsLists = new ArrayList<>(swfs); @@ -4617,5 +4709,5 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se tagTree.setMissingNeededCharacters(missingNeededCharacters); tagListTree.setMissingNeededCharacters(missingNeededCharacters); } - + } diff --git a/src/com/jpexs/decompiler/flash/gui/graphics/importimage16.png b/src/com/jpexs/decompiler/flash/gui/graphics/importimage16.png new file mode 100644 index 0000000000000000000000000000000000000000..73aa033654680357746788d54fd5e66330c3c9e1 GIT binary patch literal 6842 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 literal 0 HcmV?d00001 diff --git a/src/com/jpexs/decompiler/flash/gui/graphics/importimage32.png b/src/com/jpexs/decompiler/flash/gui/graphics/importimage32.png new file mode 100644 index 0000000000000000000000000000000000000000..63048ab02d565c167a40bb0dae6ff9973d39ccb7 GIT binary patch literal 9267 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 NiGjI(g|2(_e*h5?9zFm7 literal 0 HcmV?d00001 diff --git a/src/com/jpexs/decompiler/flash/gui/graphics/importother16.png b/src/com/jpexs/decompiler/flash/gui/graphics/importother16.png new file mode 100644 index 0000000000000000000000000000000000000000..4e90b4d704c8d2ddc52068796109dce686dc9f55 GIT binary patch literal 6294 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 mw>Ee3l`7BYJdoS^YW@#d8eb#cjxweI0000