From d1fe8b2b5c8ee2279516bfa06877fa224fba1bbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Thu, 10 Oct 2024 20:08:03 +0200 Subject: [PATCH] Fixed #2337, #2339 Replace shape update bounds - allow selecting multiple shapes --- CHANGELOG.md | 3 + .../jpexs/decompiler/flash/gui/MainPanel.java | 71 +++++-------------- .../decompiler/flash/gui/PreviewPanel.java | 2 +- .../flash/gui/tagtree/TagTreeContextMenu.java | 2 +- 4 files changed, 21 insertions(+), 57 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a51eb9f5..cafe49d1a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,7 @@ All notable changes to this project will be documented in this file. - [#2334] AS1/2 P-code export - Do not export on(xxx) header - [#2338] AS decompiling threads got stuck after cancelling / timeout - [#2338] AS2 class detection in some minor cases +- [#2337], [#2339] Replace shape update bounds - allow selecting multiple shapes ## [21.1.0] - 2024-09-23 ### Added @@ -3618,6 +3619,8 @@ Major version of SWF to XML export changed to 2. [#2335]: https://www.free-decompiler.com/flash/issues/2335 [#2334]: https://www.free-decompiler.com/flash/issues/2334 [#2338]: https://www.free-decompiler.com/flash/issues/2338 +[#2337]: https://www.free-decompiler.com/flash/issues/2337 +[#2339]: https://www.free-decompiler.com/flash/issues/2339 [#943]: https://www.free-decompiler.com/flash/issues/943 [#1812]: https://www.free-decompiler.com/flash/issues/1812 [#2287]: https://www.free-decompiler.com/flash/issues/2287 diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index b6a2428a2..d93586f83 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -5006,6 +5006,9 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } public boolean replace(List items, boolean create) { + return replace(items, create, true); + } + public boolean replace(List items, boolean create, boolean fill) { if (items.isEmpty()) { return false; } @@ -5037,12 +5040,12 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se return false; } for (TreeItem ti : items) { - doReplaceAction(ti, file, create); + doReplaceAction(ti, file, create, fill); } return true; } - private void doReplaceAction(TreeItem item, File selectedFile, boolean create) { + private void doReplaceAction(TreeItem item, File selectedFile, boolean create, boolean fill) { if (selectedFile == null) { return; } @@ -5118,16 +5121,16 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se Tag newTag = null; if (st instanceof ShapeTag) { if (svgText != null) { - newTag = new SvgImporter().importSvg((ShapeTag) st, svgText); + newTag = new SvgImporter().importSvg((ShapeTag) st, svgText, fill); } else { - newTag = new ShapeImporter().importImage((ShapeTag) st, data); + newTag = new ShapeImporter().importImage((ShapeTag) st, data, 0, fill); } } if (st instanceof MorphShapeTag) { if (svgText != null) { - newTag = new SvgImporter().importSvg((MorphShapeTag) st, svgText); + newTag = new SvgImporter().importSvg((MorphShapeTag) st, svgText, fill); } else { - newTag = new ShapeImporter().importImage((MorphShapeTag) st, data); + newTag = new ShapeImporter().importImage((MorphShapeTag) st, data, 0, fill); } } SWF swf = st.getSwf(); @@ -5210,58 +5213,16 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se replaceSpriteWithGif(item); } - public void replaceNoFillButtonActionPerformed(TreeItem item) { - replaceNoFill(item); - } + public void replaceNoFillButtonActionPerformed(List items) { + replace(items, false, false); + } public boolean replaceNoFill(TreeItem item) { - if (item == null) { - return false; - } - - if (item instanceof MorphShapeTag) { - return replaceMorphShape((MorphShapeTag) item, false, false); - } - if (item instanceof ShapeTag) { - ShapeTag st = (ShapeTag) item; - String filter = "filter.images|*.jpg;*.jpeg;*.gif;*.png;*.bmp;*.svg"; - File selectedFile = showImportFileChooser(filter, true, "importshape"); - if (selectedFile != null) { - File selfile = Helper.fixDialogFile(selectedFile); - byte[] data = null; - String svgText = null; - if (".svg".equals(Path.getExtension(selfile))) { - svgText = Helper.readTextFile(selfile.getAbsolutePath()); - showSvgImportWarning(); - } else { - data = Helper.readFile(selfile.getAbsolutePath()); - } - try { - Tag newTag = null; - if (svgText != null) { - newTag = new SvgImporter().importSvg(st, svgText, false); - } else { - newTag = new ShapeImporter().importImage(st, data, 0, false); - } - SWF swf = st.getSwf(); - if (newTag != null) { - refreshTree(swf); - setTagTreeSelectedNode(getCurrentTree(), newTag); - } - - swf.clearImageCache(); - swf.clearShapeCache(); - } catch (IOException ex) { - logger.log(Level.SEVERE, "Invalid image", ex); - ViewMessages.showMessageDialog(this, translate("error.image.invalid"), translate("error"), JOptionPane.ERROR_MESSAGE); - } - reload(true); - return true; - } - } - return false; + List items = new ArrayList<>(); + items.add(item); + return replace(items, false, false); } - + private void showSvgImportWarning() { ViewMessages.showMessageDialog(this, AppStrings.translate("message.warning.svgImportExperimental"), AppStrings.translate("message.warning"), JOptionPane.WARNING_MESSAGE, Configuration.warningSvgImport); } diff --git a/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java b/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java index c526dce7a..394c75628 100644 --- a/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java @@ -1426,7 +1426,7 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel replaceShapeUpdateBoundsButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - mainPanel.replaceNoFillButtonActionPerformed(mainPanel.getCurrentTree().getCurrentTreeItem()); + mainPanel.replaceNoFill(mainPanel.getCurrentTree().getCurrentTreeItem()); } }); replaceShapeUpdateBoundsButton.setVisible(false); diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java index 8d256b051..1f1d39267 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java @@ -517,7 +517,7 @@ public class TagTreeContextMenu extends JPopupMenu { replaceNoFillMenuItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - mainPanel.replaceNoFillButtonActionPerformed(getCurrentItem()); + mainPanel.replaceNoFillButtonActionPerformed(getSelectedItems()); } }); replaceNoFillMenuItem.setIcon(View.getIcon("replaceitem16"));