From 13453cc508b1a1e3b2649747de327133b38efe4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 25 May 2025 16:11:01 +0200 Subject: [PATCH] Added: "Show detail" context menu item for items in folder preview --- CHANGELOG.md | 1 + .../decompiler/flash/gui/FolderListPanel.java | 17 ++++---- .../flash/gui/FolderPreviewPanel.java | 12 ++++-- .../jpexs/decompiler/flash/gui/MainPanel.java | 8 ++-- .../jpexs/decompiler/flash/gui/PinButton.java | 2 +- .../flash/gui/graphics/detail16.png | Bin 0 -> 487 bytes .../flash/gui/graphics/detail32.png | Bin 0 -> 738 bytes .../flash/gui/locales/MainFrame.properties | 4 +- .../flash/gui/locales/MainFrame_cs.properties | 4 +- .../flash/gui/tagtree/TagTreeContextMenu.java | 39 ++++++++++++++---- 10 files changed, 60 insertions(+), 27 deletions(-) create mode 100644 src/com/jpexs/decompiler/flash/gui/graphics/detail16.png create mode 100644 src/com/jpexs/decompiler/flash/gui/graphics/detail32.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 030eea101..70673a2b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ All notable changes to this project will be documented in this file. - [#1418] Option to make main window Always on top - [#289] Support for Aero Snap on Windows - [#2412] Show coordinates on stage mouse move for up to 2 decimal places +- "Show detail" context menu item for items in folder preview ### Fixed - [#2456] FLA export - NullPointer exception while exporting to CS4 or lower via commandline diff --git a/src/com/jpexs/decompiler/flash/gui/FolderListPanel.java b/src/com/jpexs/decompiler/flash/gui/FolderListPanel.java index 00b330cd0..fdec9034e 100644 --- a/src/com/jpexs/decompiler/flash/gui/FolderListPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/FolderListPanel.java @@ -19,7 +19,6 @@ package com.jpexs.decompiler.flash.gui; import com.jpexs.decompiler.flash.configuration.Configuration; import com.jpexs.decompiler.flash.gui.tagtree.AbstractTagTree; import com.jpexs.decompiler.flash.tags.Tag; -import com.jpexs.decompiler.flash.treeitems.Openable; import com.jpexs.decompiler.flash.treeitems.TreeItem; import com.jpexs.helpers.SerializableImage; import java.awt.Color; @@ -110,11 +109,7 @@ public class FolderListPanel extends JPanel { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() > 1) { - if (selectedIndex > -1) { - TreeItem selectedItem = FolderListPanel.this.items.get(selectedIndex); - TreePath subPath = parentPath.pathByAddingChild(selectedItem); - mainPanel.getCurrentTree().setSelectionPath(subPath); - } + goToSelection(); } } @@ -158,7 +153,7 @@ public class FolderListPanel extends JPanel { } if (SwingUtilities.isRightMouseButton(e)) { - mainPanel.getContextPopupMenu().update(getSelectedItemsSorted()); + mainPanel.getContextPopupMenu().update(getSelectedItemsSorted(), true); mainPanel.getContextPopupMenu().show(FolderListPanel.this, e.getX(), e.getY()); } repaint(); @@ -166,6 +161,14 @@ public class FolderListPanel extends JPanel { }); setFocusable(true); } + + public void goToSelection() { + if (selectedIndex > -1) { + TreeItem selectedItem = FolderListPanel.this.items.get(selectedIndex); + TreePath subPath = parentPath.pathByAddingChild(selectedItem); + mainPanel.getCurrentTree().setSelectionPath(subPath); + } + } public synchronized void setItems(TreePath parentPath, List items) { this.items = items; diff --git a/src/com/jpexs/decompiler/flash/gui/FolderPreviewPanel.java b/src/com/jpexs/decompiler/flash/gui/FolderPreviewPanel.java index 4ddebba96..1d0abe2f2 100644 --- a/src/com/jpexs/decompiler/flash/gui/FolderPreviewPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/FolderPreviewPanel.java @@ -105,9 +105,7 @@ public class FolderPreviewPanel extends JPanel { @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() > 1) { - if (selectedIndex > -1) { - mainPanel.setTagTreeSelectedNode(mainPanel.getCurrentTree(), FolderPreviewPanel.this.items.get(selectedIndex)); - } + goToSelection(); } } @@ -151,7 +149,7 @@ public class FolderPreviewPanel extends JPanel { } if (SwingUtilities.isRightMouseButton(e)) { - mainPanel.getContextPopupMenu().update(getSelectedItemsSorted()); + mainPanel.getContextPopupMenu().update(getSelectedItemsSorted(), true); mainPanel.getContextPopupMenu().show(FolderPreviewPanel.this, e.getX(), e.getY()); } repaint(); @@ -159,6 +157,12 @@ public class FolderPreviewPanel extends JPanel { }); setFocusable(true); } + + public void goToSelection() { + if (selectedIndex > -1) { + mainPanel.setTagTreeSelectedNode(mainPanel.getCurrentTree(), FolderPreviewPanel.this.items.get(selectedIndex)); + } + } public synchronized void setItems(List items) { this.items = items; diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index 6167c7233..9cfec34b8 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -636,7 +636,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } if ((e.getKeyCode() == KeyEvent.VK_DELETE) && !e.isControlDown() && !e.isAltDown()) { if (contextPopupMenu.canRemove(items)) { - contextPopupMenu.update(items); + contextPopupMenu.update(items, false); contextPopupMenu.removeItemActionPerformed(null, e.isShiftDown()); } } @@ -682,10 +682,10 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } if (e.getKeyCode() == 'X' && allWritable) { if (!frameItems.isEmpty()) { - contextPopupMenu.update(frameItems); + contextPopupMenu.update(frameItems, false); contextPopupMenu.cutTagOrFrameToClipboardActionPerformed(null); } else { - contextPopupMenu.update(tagItems); + contextPopupMenu.update(tagItems, false); if (e.isShiftDown()) { contextPopupMenu.cutTagToClipboardWithDependenciesActionPerformed(null); } else { @@ -712,7 +712,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se return; } } - contextPopupMenu.update(items); + contextPopupMenu.update(items, false); if (e.isShiftDown()) { contextPopupMenu.pasteAfterActionPerformed(null); } else { diff --git a/src/com/jpexs/decompiler/flash/gui/PinButton.java b/src/com/jpexs/decompiler/flash/gui/PinButton.java index c529a199d..95ec2cf62 100644 --- a/src/com/jpexs/decompiler/flash/gui/PinButton.java +++ b/src/com/jpexs/decompiler/flash/gui/PinButton.java @@ -129,7 +129,7 @@ public class PinButton extends JPanel { } List itemList = new ArrayList<>(); itemList.add(item); - mainPanel.getContextPopupMenu().update(itemList); + mainPanel.getContextPopupMenu().update(itemList, false); mainPanel.getContextPopupMenu().show(PinButton.this, 0, PinButton.this.getHeight()); } } diff --git a/src/com/jpexs/decompiler/flash/gui/graphics/detail16.png b/src/com/jpexs/decompiler/flash/gui/graphics/detail16.png new file mode 100644 index 0000000000000000000000000000000000000000..018816b068380ca2972add0074173f16deb699fb GIT binary patch literal 487 zcmVq3_uqg075M${ zKLd!53>X<17?^KvUo3)-|Fmbp#5JRPL+kZmf@SWHH73#MxLpA_}SwI|+%^JkhbMQa&;^aV4_k2Z}=WZ261pwT-LW)KUqb2wO-fzAaQ0E9sE z8U8}WL0p!T=(yWviM9MZW z`~mWR_6IZk{`)T&#RV|H&ddaKKEwbJ_{a30;nBzM4E@0dUWBO zfRw%c_KV@o*I#foMpFC`32X*{yuiqS3H~!c0u>uT^8!RWE<*?!z{So2iAG$mAY{O? zhwp%~07(ZJ27uB95C>^VVj2Kb&jd}jSPeiT88Hli>Hx<*kYxPNh{b^aa4#?-*#I_x zg$W`Ms42-n41lSJ8^HSe%R$wq?e?IQ_8(_>Ly|a1Ge|vL43rOmPErQ41sI42AAtJq df*1e+1^{LjuSj(qlb8Si002ovPDHLkV1jM_%ntwn literal 0 HcmV?d00001 diff --git a/src/com/jpexs/decompiler/flash/gui/graphics/detail32.png b/src/com/jpexs/decompiler/flash/gui/graphics/detail32.png new file mode 100644 index 0000000000000000000000000000000000000000..464caf278af41f338a5702dde0a1f6171049f1d2 GIT binary patch literal 738 zcmV<80v-K{P) zh!oHesOTsXdQd=c3F!e*BPuA6K!}c#AK(K{mu!SeSfSFTg@ zk8ND+I6oLAIn;dkMvW>ft6$Z`ea~Y&SpZmN;(a~z9N^W5b-*wxxn8rOfbLgkrU37} z0QGDUIydLqi^}WlJY86#F5mX8NVL&}-Ju?r!YK=AIL=rUu==eBmrfrc5VP&ZJ+G4$ z31RDS$&e(gu7kO%#|aU;Fj=p``?a4iKXWt}gcX28p&wR_v>KAM2Ja#e-mSSdaUvDO z006^#hdg6O52FzwC>;V$G!MXZvq9 zvFp8ESlisy-p2uma(aHcWzvguV_VrOUXfD#Pltnpa7&2Fv5=X9Y5+jV z2#7G8RRF-U5f~2u1@T@`xu_Bx*w+I|8V9P7kvK3m0Fp?ci%115%sSLq0n`}4SXMza zdgbF6UEiyafFikY_IN51Y0H=1*4IaYbqW7|7<045~#4nKN(u+PV*s{R`>{C8m6zmi>h zPb|dvNxGfnlXV3pAgv_)ApJzTVdhN&a5)HEhyK&v^P6;wv~L5jZ@=Yc-oFA20I^FD Ux%6!c5C8xG07*qoM6N<$f- trees, MainPanel mainPanel) { this.mainPanel = mainPanel; + showDetailMenuItem = new JMenuItem(mainPanel.translate("contextmenu.showDetail")); + showDetailMenuItem.addActionListener(this::showDetailActionPerformed); + showDetailMenuItem.setIcon(View.getIcon("detail16")); + add(showDetailMenuItem); + addSeparator(); + expandRecursiveMenuItem = new JMenuItem(mainPanel.translate("contextmenu.expandAll")); expandRecursiveMenuItem.addActionListener(this::expandRecursiveActionPerformed); expandRecursiveMenuItem.setIcon(View.getIcon("expand16")); @@ -407,17 +415,17 @@ public class TagTreeContextMenu extends JPopupMenu { configurePathResolvingMenuItem.setIcon(View.getIcon("settings16")); add(configurePathResolvingMenuItem); - addSeparator(); + addSeparator(); jumpToCharacterMenuItem = new JMenuItem(mainPanel.translate("contextmenu.jumpToCharacter")); jumpToCharacterMenuItem.addActionListener(this::jumpToCharacterActionPerformed); jumpToCharacterMenuItem.setIcon(View.getIcon("jumpto16")); - add(jumpToCharacterMenuItem); - + add(jumpToCharacterMenuItem); + showInFramesFolderMenuItem = new JMenuItem(mainPanel.translate("contextmenu.showInFramesFolder")); showInFramesFolderMenuItem.addActionListener(this::showInFramesFolderActionPerformed); showInFramesFolderMenuItem.setIcon(View.getIcon("frame16")); add(showInFramesFolderMenuItem); - + showInResourcesViewTagMenuItem = new JMenuItem(mainPanel.translate("contextmenu.showInResources")); showInResourcesViewTagMenuItem.addActionListener(this::showInResourcesViewActionPerformed); showInResourcesViewTagMenuItem.setIcon(View.getIcon("folder16")); @@ -905,7 +913,7 @@ public class TagTreeContextMenu extends JPopupMenu { li.add(item); } - update(li); + update(li, false); show(e.getComponent(), e.getX(), e.getY()); } } @@ -1002,7 +1010,7 @@ public class TagTreeContextMenu extends JPopupMenu { return true; } - public void update(final List items) { + public void update(final List items, boolean inFolder) { if (items.isEmpty()) { return; @@ -1321,6 +1329,7 @@ public class TagTreeContextMenu extends JPopupMenu { addAs3ClassMenuItem.setVisible(false); textSearchMenuItem.setVisible(hasScripts || hasTexts); moveTagMenuItem.setVisible(items.size() == 1 && (items.get(0) instanceof Tag)); + showDetailMenuItem.setVisible(false); showInResourcesViewTagMenuItem.setVisible(false); showInTagListViewTagMenuItem.setVisible(false); showInHexDumpViewTagMenuItem.setVisible(false); @@ -1531,9 +1540,11 @@ public class TagTreeContextMenu extends JPopupMenu { } } - if (tree.getModel().getChildCount(firstItem) > 0) { - expandRecursiveMenuItem.setVisible(true); - collapseRecursiveMenuItem.setVisible(true); + if (!inFolder) { + if (tree.getModel().getChildCount(firstItem) > 0) { + expandRecursiveMenuItem.setVisible(true); + collapseRecursiveMenuItem.setVisible(true); + } } if (firstItem instanceof SWF) { @@ -1604,6 +1615,10 @@ public class TagTreeContextMenu extends JPopupMenu { addFramesBeforeMenuItem.setVisible(true); addFramesAfterMenuItem.setVisible(true); } + + if (inFolder) { + showDetailMenuItem.setVisible(true); + } if (mainPanel.getCurrentView() == MainPanel.VIEW_TAGLIST && !(firstItem instanceof ShowFrameTag) @@ -4391,6 +4406,12 @@ public class TagTreeContextMenu extends JPopupMenu { mainPanel.updateMenu(); } + private void showDetailActionPerformed(ActionEvent evt) { + //Go to one of the panels. The other is always empty, so call both. + mainPanel.folderPreviewPanel.goToSelection(); + mainPanel.folderListPanel.goToSelection(); + } + private void showInResourcesViewActionPerformed(ActionEvent evt) { TreeItem item = getCurrentItem(); mainPanel.showView(MainPanel.VIEW_RESOURCES);