From af6c4a5beb04d14432d7691c266ec26254a21067 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 20 Nov 2022 21:19:55 +0100 Subject: [PATCH] Context menu on pin header Text Search => Text search --- .../decompiler/flash/gui/MainFrameMenu.java | 6 +- .../jpexs/decompiler/flash/gui/MainPanel.java | 75 +++-- .../jpexs/decompiler/flash/gui/PinButton.java | 6 + .../jpexs/decompiler/flash/gui/PinsPanel.java | 83 ++--- .../decompiler/flash/gui/PreviewPanel.java | 43 ++- .../flash/gui/locales/MainFrame.properties | 6 +- .../flash/gui/locales/MainFrame_ca.properties | 2 +- .../flash/gui/locales/MainFrame_cs.properties | 6 +- .../flash/gui/locales/MainFrame_sv.properties | 2 +- .../flash/gui/locales/MainFrame_tr.properties | 2 +- .../flash/gui/tagtree/AbstractTagTree.java | 9 + .../flash/gui/tagtree/TagTreeContextMenu.java | 317 +++++++++++------- 12 files changed, 346 insertions(+), 211 deletions(-) diff --git a/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java b/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java index 055939726..5fe70c23d 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java +++ b/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java @@ -342,7 +342,7 @@ public abstract class MainFrameMenu implements MenuBuilder { View.checkAccess(); if (openable != null) { - mainFrame.getPanel().export(onlySelected); + mainFrame.getPanel().export(onlySelected, mainFrame.getPanel().getCurrentTree().getSelected()); return true; } @@ -362,7 +362,7 @@ public abstract class MainFrameMenu implements MenuBuilder { return; } - mainFrame.getPanel().importSwfXml(); + mainFrame.getPanel().importSwfXml(mainFrame.getPanel().getCurrentTree().getSelected()); } protected void exportXmlActionPerformed(ActionEvent evt) { @@ -370,7 +370,7 @@ public abstract class MainFrameMenu implements MenuBuilder { return; } - mainFrame.getPanel().exportSwfXml(); + mainFrame.getPanel().exportSwfXml(mainFrame.getPanel().getCurrentTree().getSelected()); } protected boolean searchActionPerformed(ActionEvent evt) { diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index 21a42bcdc..bd38f0627 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -428,9 +428,25 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se pinsPanel.destroy(); } - public void destroyItemPin(TreeItem item) { + public void unpinItem(TreeItem item) { pinsPanel.removeItem(item); } + + public void unpinOthers(TreeItem item) { + pinsPanel.removeOthers(item); + } + + public void pinItem(TreeItem item) { + pinsPanel.pin(item); + } + + public int getPinCount() { + return pinsPanel.getPinCount(); + } + + public boolean isPinned(TreeItem item) { + return pinsPanel.isPinned(item); + } public void replaceItemPin(TreeItem oldItem, TreeItem newItem) { pinsPanel.replaceItem(oldItem, newItem); @@ -518,6 +534,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } } if (e.getKeyCode() == 'X') { + contextPopupMenu.update(tagItems); if (e.isShiftDown()) { contextPopupMenu.cutTagToClipboardWithDependenciesActionPerformed(null); } else { @@ -544,6 +561,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se if (!((firstItem instanceof Tag) || (firstItem instanceof Frame))) { return; } + contextPopupMenu.update(items); if (e.isShiftDown()) { contextPopupMenu.pasteAfterActionPerformed(null); } else { @@ -895,7 +913,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se File ftemp = new File(tempDir); ExportDialog exd = new ExportDialog(Main.getDefaultDialogsOwner(), null); try { - files = exportSelection(new GuiAbortRetryIgnoreHandler(), tempDir, exd); + files = exportSelection(null, new GuiAbortRetryIgnoreHandler(), tempDir, exd); } catch (InterruptedException ex) { logger.log(Level.SEVERE, null, ex); return null; @@ -1654,19 +1672,19 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se return ViewMessages.showConfirmDialog(this, translate("message.confirm.experimental"), translate("message.warning"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.OK_OPTION; } - private List getSelection(SWF swf) { + private List getSelection(Openable openable, List selection) { if (currentView == MainPanel.VIEW_RESOURCES) { - return tagTree.getSelection(swf); + return selection == null ? tagTree.getSelection(openable) : tagTree.getSelection(openable, selection); } else if (currentView == MainPanel.VIEW_TAGLIST) { - return tagListTree.getSelection(swf); + return selection == null ? tagListTree.getSelection(openable) : tagListTree.getSelection(openable, selection); } return new ArrayList<>(); } - public List exportSelection(AbortRetryIgnoreHandler handler, String selFile, ExportDialog export) throws IOException, InterruptedException { + public List exportSelection(List selection, AbortRetryIgnoreHandler handler, String selFile, ExportDialog export) throws IOException, InterruptedException { List ret = new ArrayList<>(); - List sel = getSelection(null); + List sel = getSelection(null, selection); Set usedOpenables = new HashSet<>(); for (TreeItem d : sel) { @@ -3353,11 +3371,11 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se return null; } - public void export(final boolean onlySel) { + public void export(final boolean onlySel, List selected) { View.checkAccess(); final SWF swf = getCurrentSwf(); - List sel = getAllSelected(); + List sel = getCurrentTree().getAllSubsForItems(selected); if (!onlySel) { sel = null; } else if (sel.isEmpty()) { @@ -3375,7 +3393,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se try { AbortRetryIgnoreHandler errorHandler = new GuiAbortRetryIgnoreHandler(); if (onlySel) { - exportSelection(errorHandler, selFile, export); + exportSelection(selected, errorHandler, selFile, export); } else { exportAll(swf, errorHandler, selFile, export); } @@ -3407,11 +3425,10 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } } - public void exportJavaSource() { - List sel = getSelected(); + public void exportJavaSource(List items) { Set swfs = new LinkedHashSet<>(); - for (TreeItem item : sel) { + for (TreeItem item : items) { if (item instanceof OpenableList) { OpenableList list = (OpenableList) item; for (Openable openable : list) { @@ -3443,13 +3460,12 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } } - public void exportSwfXml() { + public void exportSwfXml(List items) { View.checkAccess(); - List sel = getSelected(); Set swfs = new LinkedHashSet<>(); - for (TreeItem item : sel) { + for (TreeItem item : items) { if (item instanceof OpenableList) { OpenableList list = (OpenableList) item; for (Openable openable : list) { @@ -3481,15 +3497,14 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } } - public void importSwfXml() { + public void importSwfXml(List items) { View.checkAccess(); ViewMessages.showMessageDialog(MainPanel.this, translate("message.info.importXml"), translate("message.info"), JOptionPane.INFORMATION_MESSAGE, Configuration.showImportXmlInfo); - List sel = getSelected(); Set swfs = new LinkedHashSet<>(); - for (TreeItem item : sel) { + for (TreeItem item : items) { if (item instanceof OpenableList) { OpenableList list = (OpenableList) item; for (Openable openable : list) { @@ -3877,8 +3892,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } } - public void replaceButtonActionPerformed(ActionEvent evt) { - List items = getSelected(); + public void replaceButtonActionPerformed(List items) { if (items.size() == 0) { return; } @@ -4000,8 +4014,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } } - public void replaceNoFillButtonActionPerformed(ActionEvent evt) { - TreeItem item = getCurrentTree().getCurrentTreeItem(); + public void replaceNoFillButtonActionPerformed(TreeItem item) { if (item == null) { return; } @@ -4072,36 +4085,36 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } } - public void exportJavaSourceActionPerformed(ActionEvent evt) { + public void exportJavaSourceActionPerformed(List items) { if (Main.isWorking()) { return; } - exportJavaSource(); + exportJavaSource(items); } - public void exportSwfXmlActionPerformed(ActionEvent evt) { + public void exportSwfXmlActionPerformed(List items) { if (Main.isWorking()) { return; } - exportSwfXml(); + exportSwfXml(items); } - public void importSwfXmlActionPerformed(ActionEvent evt) { + public void importSwfXmlActionPerformed(List items) { if (Main.isWorking()) { return; } - importSwfXml(); + importSwfXml(items); } - public void exportSelectionActionPerformed(ActionEvent evt) { + public void exportSelectionActionPerformed(List selected) { if (Main.isWorking()) { return; } - export(true); + export(true, selected); } public File showImportFileChooser(String filter, boolean imagePreview) { diff --git a/src/com/jpexs/decompiler/flash/gui/PinButton.java b/src/com/jpexs/decompiler/flash/gui/PinButton.java index 51c6885d5..983983c57 100644 --- a/src/com/jpexs/decompiler/flash/gui/PinButton.java +++ b/src/com/jpexs/decompiler/flash/gui/PinButton.java @@ -127,6 +127,12 @@ public class PinButton extends JPanel { if (e.getButton() == MouseEvent.BUTTON1) { //setBorder(loweredBorder); } + if (e.getButton() == MouseEvent.BUTTON3) { + List itemList = new ArrayList<>(); + itemList.add(item); + mainPanel.getContextPopupMenu().update(itemList); + mainPanel.getContextPopupMenu().show(PinButton.this, 0, PinButton.this.getHeight()); + } } @Override diff --git a/src/com/jpexs/decompiler/flash/gui/PinsPanel.java b/src/com/jpexs/decompiler/flash/gui/PinsPanel.java index a0fbb089e..cf0bd2a46 100644 --- a/src/com/jpexs/decompiler/flash/gui/PinsPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/PinsPanel.java @@ -149,53 +149,6 @@ public class PinsPanel extends JPanel { boolean currentPinned = false; for (TreeItem item : items) { PinButton pinButton = new PinButton(mainPanel, item, true); - pinButton.addMouseListener(new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - if (e.getButton() == MouseEvent.BUTTON3) { - JPopupMenu pinMenu = new JPopupMenu(); - JMenuItem unpinMenuItem = new JMenuItem(AppStrings.translate("contextmenu.unpin")); - unpinMenuItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - items.remove(item); - rebuild(); - fireChange(); - } - }); - pinMenu.add(unpinMenuItem); - - JMenuItem unpinAllMenuItem = new JMenuItem(AppStrings.translate("contextmenu.unpin.all")); - unpinAllMenuItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - items.clear(); - rebuild(); - fireChange(); - } - }); - if (items.size() > 1) { - pinMenu.add(unpinAllMenuItem); - } - - JMenuItem unpinOthersMenuItem = new JMenuItem(AppStrings.translate("contextmenu.unpin.others")); - unpinOthersMenuItem.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - items.clear(); - items.add(item); - rebuild(); - fireChange(); - } - }); - if (items.size() > 1) { - pinMenu.add(unpinOthersMenuItem); - } - pinMenu.show(pinButton, e.getX(), e.getY()); - } - } - - }); pinButton.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { @@ -402,6 +355,42 @@ public class PinsPanel extends JPanel { } } + public void removeOthers(TreeItem item) { + items.clear(); + items.add(item); + rebuild(); + save(); + } + + public void pin(TreeItem item) { + if (!isPinned(item)) { + items.add(item); + rebuild(); + save(); + } + } + + public int getPinCount() { + return items.size(); + } + + public boolean isPinned(TreeItem item) { + if (item instanceof TagScript) { + item = ((TagScript) item).getTag(); + } + + for (int i = 0; i < items.size(); i++) { + TreeItem item2 = items.get(i); + if (item2 instanceof TagScript) { + item2 = ((TagScript) item2).getTag(); + } + if (item2 == item) { + return true; + } + } + return false; + } + public void removeItem(TreeItem item) { if (item instanceof TagScript) { item = ((TagScript) item).getTag(); diff --git a/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java b/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java index fe2c03a1c..94e0856c2 100644 --- a/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java @@ -52,6 +52,7 @@ import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; @@ -262,22 +263,42 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel private JPanel createImageButtonsPanel() { replaceShapeButton = new JButton(mainPanel.translate("button.replace"), View.getIcon("replaceshape16")); replaceShapeButton.setMargin(new Insets(3, 3, 3, 10)); - replaceShapeButton.addActionListener(mainPanel::replaceButtonActionPerformed); + replaceShapeButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + mainPanel.replaceButtonActionPerformed(mainPanel.getCurrentTree().getSelected()); + } + }); replaceShapeButton.setVisible(false); replaceShapeUpdateBoundsButton = new JButton(mainPanel.translate("button.replaceNoFill"), View.getIcon("replaceshape16")); replaceShapeUpdateBoundsButton.setMargin(new Insets(3, 3, 3, 10)); - replaceShapeUpdateBoundsButton.addActionListener(mainPanel::replaceNoFillButtonActionPerformed); + replaceShapeUpdateBoundsButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + mainPanel.replaceNoFillButtonActionPerformed(mainPanel.getCurrentTree().getCurrentTreeItem()); + } + }); replaceShapeUpdateBoundsButton.setVisible(false); replaceSoundButton = new JButton(mainPanel.translate("button.replace"), View.getIcon("replacesound16")); replaceSoundButton.setMargin(new Insets(3, 3, 3, 10)); - replaceSoundButton.addActionListener(mainPanel::replaceButtonActionPerformed); + replaceSoundButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + mainPanel.replaceButtonActionPerformed(mainPanel.getCurrentTree().getSelected()); + } + }); replaceSoundButton.setVisible(false); replaceImageButton = new JButton(mainPanel.translate("button.replace"), View.getIcon("replaceimage16")); replaceImageButton.setMargin(new Insets(3, 3, 3, 10)); - replaceImageButton.addActionListener(mainPanel::replaceButtonActionPerformed); + replaceImageButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + mainPanel.replaceButtonActionPerformed(mainPanel.getCurrentTree().getSelected()); + } + }); replaceImageButton.setVisible(false); replaceImageAlphaButton = new JButton(mainPanel.translate("button.replaceAlphaChannel"), View.getIcon("replacealpha16")); @@ -309,7 +330,12 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel private JPanel createBinaryButtonsPanel() { replaceBinaryButton = new JButton(mainPanel.translate("button.replace"), View.getIcon("edit16")); replaceBinaryButton.setMargin(new Insets(3, 3, 3, 10)); - replaceBinaryButton.addActionListener(mainPanel::replaceButtonActionPerformed); + replaceBinaryButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + mainPanel.replaceButtonActionPerformed(mainPanel.getCurrentTree().getSelected()); + } + }); ButtonsPanel binaryButtonsPanel = new ButtonsPanel(); binaryButtonsPanel.add(replaceBinaryButton); @@ -319,7 +345,12 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel private JPanel createUnknownButtonsPanel() { replaceUnknownButton = new JButton(mainPanel.translate("button.replace"), View.getIcon("edit16")); replaceUnknownButton.setMargin(new Insets(3, 3, 3, 10)); - replaceUnknownButton.addActionListener(mainPanel::replaceButtonActionPerformed); + replaceUnknownButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + mainPanel.replaceButtonActionPerformed(mainPanel.getCurrentTree().getSelected()); + } + }); ButtonsPanel unknownButtonsPanel = new ButtonsPanel(); unknownButtonsPanel.add(replaceBinaryButton); diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties index affbe0aef..26c1faa79 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame.properties @@ -417,7 +417,7 @@ open.error.cannotOpen = Cannot open file node.others = others #after version 1.8.1 -menu.tools.search = Text Search +menu.tools.search = Text search #after version 1.8.1u1 menu.tools.timeline = Timeline @@ -984,4 +984,6 @@ work.reading.abc = Reading ABC filter.abc = ActionScript 3 bytecode files (*.abc) -contextmenu.exportAbc = Export ABC \ No newline at end of file +contextmenu.exportAbc = Export ABC + +contextmenu.pin = Pin \ No newline at end of file diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_ca.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_ca.properties index 301acd6f3..ddedf08d0 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_ca.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_ca.properties @@ -417,7 +417,7 @@ open.error.cannotOpen = No es pot obrir el fitxer node.others = altres #after version 1.8.1 -menu.tools.search = Cerca de Text +menu.tools.search = Cerca de text #after version 1.8.1u1 menu.tools.timeline = Cronologia diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties index fdb38a08f..328f3fced 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_cs.properties @@ -416,7 +416,7 @@ open.error.cannotOpen = Soubor nelze otev\u0159\u00edt node.others = ostatn\u00ed #after version 1.8.1 -menu.tools.search = Hled\u00e1n\u00ed Textu +menu.tools.search = Hled\u00e1n\u00ed textu #after version 1.8.1u1 menu.tools.timeline = \u010casov\u00e1 osa @@ -956,4 +956,6 @@ work.reading.abc = \u010cten\u00ed ABC filter.abc = ActionScript 3 bytecode soubory (*.abc) -contextmenu.exportAbc = Exportovat ABC \ No newline at end of file +contextmenu.exportAbc = Exportovat ABC + +contextmenu.pin = P\u0159ipnout \ No newline at end of file diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_sv.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_sv.properties index e19524ff5..c153853ba 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_sv.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_sv.properties @@ -415,7 +415,7 @@ open.error.cannotOpen = Kan inte \u00f6ppna filen node.others = andra #after version 1.8.1 -menu.tools.search = Text S\u00f6kning +menu.tools.search = Text s\u00f6kning #after version 1.8.1u1 menu.tools.timeline = Tidslinje diff --git a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_tr.properties b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_tr.properties index 20b629c63..b94e1e19d 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_tr.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/MainFrame_tr.properties @@ -648,7 +648,7 @@ node.others = di\u011ferleri -menu.tools.search = Metin Ara +menu.tools.search = Metin ara #after version 1.8.1u1 diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/AbstractTagTree.java b/src/com/jpexs/decompiler/flash/gui/tagtree/AbstractTagTree.java index 95dde4289..6f70776c5 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/AbstractTagTree.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/AbstractTagTree.java @@ -476,6 +476,15 @@ public abstract class AbstractTagTree extends JTree { } return ret; } + + public List getAllSubsForItems(List items) { + List ret = new ArrayList<>(); + for (TreeItem item:items) { + ret.add(item); + getAllSubs(item, ret); + } + return ret; + } public List getSelected() { if (!mainPanel.folderPreviewPanel.selectedItems.isEmpty()) { diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java index bd6999514..786bacc55 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java @@ -140,7 +140,7 @@ public class TagTreeContextMenu extends JPopupMenu { private JMenuItem undoTagMenuItem; private JMenuItem exportSelectionMenuItem; - + private JMenuItem exportABCMenuItem; private JMenuItem replaceMenuItem; @@ -231,18 +231,39 @@ public class TagTreeContextMenu extends JPopupMenu { private JMenu changeCharsetMenu; + private JMenuItem pinMenuItem; + + private JMenuItem unpinMenuItem; + + private JMenuItem unpinAllMenuItem; + + private JMenuItem unpinOthersMenuItem; + + private List items = new ArrayList<>(); + private static final int KIND_MOVETO = 0; private static final int KIND_MOVETODEPS = 1; private static final int KIND_COPYTO = 2; private static final int KIND_COPYTODEPS = 3; + private TreeItem getCurrentItem() { + if (items.isEmpty()) { + return null; + } + return items.get(0); + } + + private List getSelectedItems() { + return items; + } + public TagTreeContextMenu(final List trees, MainPanel mainPanel) { this.mainPanel = mainPanel; expandRecursiveMenuItem = new JMenuItem(mainPanel.translate("contextmenu.expandAll")); expandRecursiveMenuItem.addActionListener(this::expandRecursiveActionPerformed); expandRecursiveMenuItem.setIcon(View.getIcon("expand16")); - add(expandRecursiveMenuItem); + add(expandRecursiveMenuItem); changeCharsetMenu = new JMenu(); JMenu currentCharsetMenu = changeCharsetMenu; @@ -281,22 +302,37 @@ public class TagTreeContextMenu extends JPopupMenu { add(undoTagMenuItem); exportSelectionMenuItem = new JMenuItem(mainPanel.translate("menu.file.export.selection")); - exportSelectionMenuItem.addActionListener(mainPanel::exportSelectionActionPerformed); + exportSelectionMenuItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + mainPanel.exportSelectionActionPerformed(getSelectedItems()); + } + }); exportSelectionMenuItem.setIcon(View.getIcon("exportsel16")); add(exportSelectionMenuItem); - + exportABCMenuItem = new JMenuItem(mainPanel.translate("contextmenu.exportAbc")); exportABCMenuItem.addActionListener(this::exportABCActionPerformed); exportABCMenuItem.setIcon(View.getIcon("exportabc16")); add(exportABCMenuItem); replaceMenuItem = new JMenuItem(mainPanel.translate("button.replace")); - replaceMenuItem.addActionListener(mainPanel::replaceButtonActionPerformed); + replaceMenuItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + mainPanel.replaceButtonActionPerformed(getSelectedItems()); + } + }); replaceMenuItem.setIcon(View.getIcon("replaceitem16")); add(replaceMenuItem); replaceNoFillMenuItem = new JMenuItem(mainPanel.translate("button.replaceNoFill")); - replaceNoFillMenuItem.addActionListener(mainPanel::replaceNoFillButtonActionPerformed); + replaceNoFillMenuItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + mainPanel.replaceNoFillButtonActionPerformed(getCurrentItem()); + } + }); replaceNoFillMenuItem.setIcon(View.getIcon("replaceitem16")); add(replaceNoFillMenuItem); @@ -321,17 +357,32 @@ public class TagTreeContextMenu extends JPopupMenu { add(jumpToCharacterMenuItem); exportJavaSourceMenuItem = new JMenuItem(mainPanel.translate("contextmenu.exportJavaSource")); - exportJavaSourceMenuItem.addActionListener(mainPanel::exportJavaSourceActionPerformed); + exportJavaSourceMenuItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + mainPanel.exportJavaSourceActionPerformed(getSelectedItems()); + } + }); exportJavaSourceMenuItem.setIcon(View.getIcon("exportjava16")); add(exportJavaSourceMenuItem); exportSwfXmlMenuItem = new JMenuItem(mainPanel.translate("contextmenu.exportSwfXml")); - exportSwfXmlMenuItem.addActionListener(mainPanel::exportSwfXmlActionPerformed); + exportSwfXmlMenuItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + mainPanel.exportSwfXmlActionPerformed(getSelectedItems()); + } + }); exportSwfXmlMenuItem.setIcon(View.getIcon("exportxml16")); add(exportSwfXmlMenuItem); importSwfXmlMenuItem = new JMenuItem(mainPanel.translate("contextmenu.importSwfXml")); - importSwfXmlMenuItem.addActionListener(mainPanel::importSwfXmlActionPerformed); + importSwfXmlMenuItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + mainPanel.importSwfXmlActionPerformed(getSelectedItems()); + } + }); importSwfXmlMenuItem.setIcon(View.getIcon("importxml16")); add(importSwfXmlMenuItem); @@ -492,6 +543,47 @@ public class TagTreeContextMenu extends JPopupMenu { textSearchMenuItem.setIcon(View.getIcon("search16")); add(textSearchMenuItem); + + pinMenuItem = new JMenuItem(AppStrings.translate("contextmenu.pin")); + pinMenuItem.setIcon(View.getIcon("pinned16")); + pinMenuItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + mainPanel.pinItem(getCurrentItem()); + } + }); + add(pinMenuItem); + + unpinMenuItem = new JMenuItem(AppStrings.translate("contextmenu.unpin")); + unpinMenuItem.setIcon(View.getIcon("pin16")); + unpinMenuItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + mainPanel.unpinItem(getCurrentItem()); + } + }); + add(unpinMenuItem); + + unpinAllMenuItem = new JMenuItem(AppStrings.translate("contextmenu.unpin.all")); + unpinAllMenuItem.setIcon(View.getIcon("pin16")); + unpinAllMenuItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + mainPanel.clearPins(); + } + }); + add(unpinAllMenuItem); + + unpinOthersMenuItem = new JMenuItem(AppStrings.translate("contextmenu.unpin.others")); + unpinOthersMenuItem.setIcon(View.getIcon("pin16")); + unpinOthersMenuItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + mainPanel.unpinOthers(getCurrentItem()); + } + }); + add(unpinOthersMenuItem); + closeMenuItem = new JMenuItem(mainPanel.translate("contextmenu.closeSwf")); closeMenuItem.addActionListener(this::closeSwfActionPerformed); closeMenuItem.setIcon(View.getIcon("close16")); @@ -539,6 +631,8 @@ public class TagTreeContextMenu extends JPopupMenu { return; } + this.items = items; + AbstractTagTree tree = getTree(); final List swfs = mainPanel.getSwfs(); @@ -721,7 +815,12 @@ public class TagTreeContextMenu extends JPopupMenu { boolean hasExportableNodes = tree.hasExportableNodes(); - expandRecursiveMenuItem.setVisible(false); + expandRecursiveMenuItem.setVisible(false); + pinMenuItem.setVisible(false); + unpinMenuItem.setVisible(false); + unpinAllMenuItem.setVisible(false); + unpinOthersMenuItem.setVisible(false); + removeMenuItem.setVisible(canRemove); removeWithDependenciesMenuItem.setVisible(canRemove && !allDoNotHaveDependencies); cloneMenuItem.setVisible(allSelectedIsTagOrFrame && allSelectedSameParent); @@ -838,12 +937,24 @@ public class TagTreeContextMenu extends JPopupMenu { addAs3ClassMenuItem.setVisible(true); } if (firstItem instanceof ABC) { - addAs3ClassMenuItem.setVisible(true); + addAs3ClassMenuItem.setVisible(true); } if (firstItem instanceof ABCContainerTag) { addAs3ClassMenuItem.setVisible(true); exportABCMenuItem.setVisible(true); } + + + if (mainPanel.isPinned(firstItem)) { + int pinCount = mainPanel.getPinCount(); + unpinMenuItem.setVisible(true); + if (pinCount > 1) { + unpinAllMenuItem.setVisible(true); + unpinOthersMenuItem.setVisible(true); + } + } else { + pinMenuItem.setVisible(true); + } if (firstItem instanceof CharacterTag) { CharacterTag ct = (CharacterTag) firstItem; @@ -918,15 +1029,15 @@ public class TagTreeContextMenu extends JPopupMenu { addFramesAfterMenuItem.setVisible(true); } - if (mainPanel.getCurrentView() == MainPanel.VIEW_TAGLIST && - !(firstItem instanceof ShowFrameTag) && - !(firstItem instanceof AS3Package)) { + if (mainPanel.getCurrentView() == MainPanel.VIEW_TAGLIST + && !(firstItem instanceof ShowFrameTag) + && !(firstItem instanceof AS3Package)) { showInResourcesViewTagMenuItem.setVisible(true); } - if (mainPanel.getCurrentView() == MainPanel.VIEW_RESOURCES && - !isFolder && - !(firstItem instanceof AS3Package)) { + if (mainPanel.getCurrentView() == MainPanel.VIEW_RESOURCES + && !isFolder + && !(firstItem instanceof AS3Package)) { showInTagListViewTagMenuItem.setVisible(true); } @@ -946,7 +1057,7 @@ public class TagTreeContextMenu extends JPopupMenu { importTextsMenuItem.setVisible(true); importSwfXmlMenuItem.setVisible(true); } - + if (firstItem instanceof ABC) { importScriptsMenuItem.setVisible(true); } @@ -1454,7 +1565,7 @@ public class TagTreeContextMenu extends JPopupMenu { } private void openSwfInsideActionPerformed(ActionEvent evt) { - List sel = getTree().getSelected(); + List sel = getSelectedItems(); List binaryDatas = new ArrayList<>(); for (TreeItem item : sel) { DefineBinaryDataTag binaryData = (DefineBinaryDataTag) item; @@ -1467,7 +1578,7 @@ public class TagTreeContextMenu extends JPopupMenu { } private void replaceWithTagActionPerformed(ActionEvent evt) { - TreeItem itemr = getTree().getCurrentTreeItem(); + TreeItem itemr = getCurrentItem(); if (itemr == null) { return; } @@ -1484,7 +1595,7 @@ public class TagTreeContextMenu extends JPopupMenu { } private void replaceRefsWithTagActionPerformed(ActionEvent evt) { - TreeItem itemr = getTree().getCurrentTreeItem(); + TreeItem itemr = getCurrentItem(); if (itemr == null) { return; } @@ -1534,7 +1645,7 @@ public class TagTreeContextMenu extends JPopupMenu { } private void rawEditActionPerformed(ActionEvent evt) { - TreeItem itemr = getTree().getCurrentTreeItem(); + TreeItem itemr = getCurrentItem(); if (itemr == null) { return; } @@ -1543,7 +1654,7 @@ public class TagTreeContextMenu extends JPopupMenu { } private void jumpToCharacterActionPerformed(ActionEvent evt) { - TreeItem itemj = getTree().getCurrentTreeItem(); + TreeItem itemj = getCurrentItem(); if (itemj == null || !(itemj instanceof HasCharacterId)) { return; } @@ -1553,8 +1664,8 @@ public class TagTreeContextMenu extends JPopupMenu { } private void expandRecursiveActionPerformed(ActionEvent evt) { - JTree tree = getTree(); - TreePath path = tree.getSelectionPath(); + AbstractTagTree tree = getTree(); + TreePath path = tree.getModel().getTreePath(getCurrentItem()); if (path == null) { return; } @@ -1562,13 +1673,13 @@ public class TagTreeContextMenu extends JPopupMenu { } private void textSearchActionPerformed(ActionEvent evt) { - Main.getMainFrame().getPanel().searchInActionScriptOrText(null, Main.getMainFrame().getPanel().getCurrentOpenable(), true); + Main.getMainFrame().getPanel().searchInActionScriptOrText(null, getCurrentItem().getOpenable(), true); } private void addAs3ClassActionPerformed(ActionEvent evt) { AbstractTagTree tree = getTree(); //using tagTree only here is safe since tagListTree does not have AS3 classes - List sel = getTree().getSelected(); + List sel = getSelectedItems(); if (!sel.isEmpty()) { SWF swf = null; Openable openable = null; @@ -1583,11 +1694,11 @@ public class TagTreeContextMenu extends JPopupMenu { if (sel.get(0) instanceof ABCContainerTag) { openable = ((Tag) sel.get(0)).getOpenable(); } - + if (sel.get(0) instanceof AS3Package) { AS3Package pkg = (AS3Package) sel.get(0); - openable = pkg.getOpenable(); - TreePath tp = tree.getSelectionPaths()[0]; + openable = pkg.getOpenable(); + TreePath tp = tree.getModel().getTreePath(sel.get(0)); Object[] path = tp.getPath(); for (int p = path.length - 1; p >= 0; p--) { if (path[p] instanceof ClassesListTreeModel) { @@ -1605,32 +1716,31 @@ public class TagTreeContextMenu extends JPopupMenu { preselected = ((AS3Package) path[p]).packageName + "." + preselected; } } - + if (openable instanceof SWF) { swf = (SWF) openable; } else { - swf = ((ABC)openable).getSwf(); + swf = ((ABC) openable).getSwf(); } TreePath scriptsPath = tree.getSelectionPaths()[0]; - while (!(scriptsPath.getLastPathComponent() instanceof ClassesListTreeModel) && - !(scriptsPath.getLastPathComponent() instanceof ABC) && - !(scriptsPath.getLastPathComponent() instanceof ABCContainerTag) - ) { + while (!(scriptsPath.getLastPathComponent() instanceof ClassesListTreeModel) + && !(scriptsPath.getLastPathComponent() instanceof ABC) + && !(scriptsPath.getLastPathComponent() instanceof ABCContainerTag)) { scriptsPath = scriptsPath.getParentPath(); } { ABCContainerTag preselectedContainer = null; - + TreeItem scriptsNode = (TreeItem) scriptsPath.getLastPathComponent(); - + if (scriptsNode instanceof ABC) { - preselectedContainer = ((ABC)scriptsNode).parentTag; + preselectedContainer = ((ABC) scriptsNode).parentTag; } else if (scriptsNode instanceof ABCContainerTag) { preselectedContainer = (ABCContainerTag) scriptsNode; } - + AddClassDialog acd = new AddClassDialog(Main.getDefaultDialogsOwner(), openable, preselectedContainer); if (acd.showDialog(preselected) != AppDialog.OK_OPTION) { return; @@ -1690,18 +1800,19 @@ public class TagTreeContextMenu extends JPopupMenu { mainPanel.refreshTree(swf); Object item; - + if ((mainPanel.getCurrentView() == MainPanel.VIEW_RESOURCES) && (openable instanceof SWF)) { - item = mainPanel.tagTree.getModel().getScriptsNode((SWF) openable); + item = mainPanel.tagTree.getModel().getScriptsNode((SWF) openable); } else if (openable instanceof ABC) { item = openable; } else { //SWF on taglist, should be DoABCContainer item = scriptsPath.getLastPathComponent(); - } + } - loopparts: for (int i = 0; i < parts.length; i++) { + loopparts: + for (int i = 0; i < parts.length; i++) { for (TreeItem ti : tree.getModel().getAllChildren(item)) { - if ((ti instanceof AS3Package) && ((AS3Package)ti).isFlat()) { + if ((ti instanceof AS3Package) && ((AS3Package) ti).isFlat()) { AS3Package pti = (AS3Package) ti; if ((pkg.isEmpty() && pti.isDefaultPackage()) || (!pti.isDefaultPackage() && pkg.equals(pti.packageName))) { item = pti; @@ -1712,7 +1823,7 @@ public class TagTreeContextMenu extends JPopupMenu { } if (ti instanceof AS3ClassTreeItem) { AS3ClassTreeItem cti = (AS3ClassTreeItem) ti; - + if (parts[i].equals(cti.getNameWithNamespaceSuffix())) { item = ti; break; @@ -1726,7 +1837,7 @@ public class TagTreeContextMenu extends JPopupMenu { } private void addAs12ScriptActionPerformed(ActionEvent evt) { - List sel = getTree().getSelected(); + List sel = getSelectedItems(); if (!sel.isEmpty()) { if (sel.get(0) instanceof FolderItem) { @@ -2150,39 +2261,12 @@ public class TagTreeContextMenu extends JPopupMenu { private void removeItemActionPerformed(ActionEvent evt, boolean removeDependencies) { - TreePath[] tpsArr; - List tps; - - if (mainPanel.getCurrentView() == MainPanel.VIEW_RESOURCES) { - if (mainPanel.folderPreviewPanel.selectedItems.isEmpty()) { - tpsArr = getTree().getSelectionModel().getSelectionPaths(); - if (tpsArr == null) { - return; - } - tps = new ArrayList<>(Arrays.asList(tpsArr)); - } else { - List sel = new ArrayList<>(); - for (TreeItem treeItem : mainPanel.folderPreviewPanel.selectedItems.values()) { - sel.add(treeItem); - getTree().getAllSubs(treeItem, sel); - } - tps = new ArrayList<>(); - for (TreeItem treeItem : sel) { - tps.add(new TreePath(treeItem)); - //Following code needs TreePath, so convert it without real reason - //Let's hope nobody gets parent of such path - } - if (tps.isEmpty()) { - return; - } - } - } else { - tpsArr = getTree().getSelectionModel().getSelectionPaths(); - if (tpsArr == null) { - return; - } - tps = new ArrayList<>(Arrays.asList(tpsArr)); - } + List tps = new ArrayList<>(); + + List sel = getSelectedItems(); + for (TreeItem treeItem : sel) { + tps.add(getTree().getModel().getTreePath(treeItem)); + } List tagsToRemove = new ArrayList<>(); List itemsToRemove = new ArrayList<>(); @@ -2358,7 +2442,7 @@ public class TagTreeContextMenu extends JPopupMenu { sp.delete(sp.abc, true); abcsToPack.add(sp.abc); Openable openable = sp.getOpenable(); - SWF swf = (openable instanceof SWF) ? (SWF) openable : ((ABC)openable).getSwf(); + SWF swf = (openable instanceof SWF) ? (SWF) openable : ((ABC) openable).getSwf(); swfsToClearCache.add(swf); for (ABCContainerTag ct : swf.getAbcList()) { if (ct.getABC() == sp.abc) { @@ -2368,7 +2452,7 @@ public class TagTreeContextMenu extends JPopupMenu { } } if (item instanceof TreeItem) { - mainPanel.destroyItemPin((TreeItem) item); + mainPanel.unpinItem((TreeItem) item); } } @@ -2398,14 +2482,14 @@ public class TagTreeContextMenu extends JPopupMenu { } tagsToRemoveBySwf.get(swf).add(tag); - mainPanel.destroyItemPin(tag); + mainPanel.unpinItem(tag); } for (SWF swf : tagsToRemoveBySwf.keySet()) { swf.removeTags(tagsToRemoveBySwf.get(swf), removeDependencies, new TagRemoveListener() { @Override public void tagRemoved(Tag tag) { - mainPanel.destroyItemPin(tag); + mainPanel.unpinItem(tag); } }); swf.computeDependentCharacters(); @@ -2432,7 +2516,7 @@ public class TagTreeContextMenu extends JPopupMenu { private void undoTagActionPerformed(ActionEvent evt) { AbstractTagTree tree = getTree(); - List sel = getTree().getSelected(); + List sel = getSelectedItems(); for (TreeItem item : sel) { if (item instanceof Tag) { @@ -2451,7 +2535,7 @@ public class TagTreeContextMenu extends JPopupMenu { } private void closeSwfActionPerformed(ActionEvent evt) { - List sel = getTree().getSelected(); + List sel = getSelectedItems(); for (TreeItem item : sel) { if (item instanceof SWF) { SWF swf = (SWF) item; @@ -2470,7 +2554,7 @@ public class TagTreeContextMenu extends JPopupMenu { } private void cloneActionPerformed(ActionEvent e) { - List items = getTree().getSelected(); + List items = getSelectedItems(); /* Currently useless since all selected items must have the same parent * but a better way to detect for parent/child selection * could remove that limitation */ @@ -2478,7 +2562,7 @@ public class TagTreeContextMenu extends JPopupMenu { try { for (TreeItem item : items) { - SWF swf = (SWF)item.getOpenable(); + SWF swf = (SWF) item.getOpenable(); swfs.add(swf); if (item instanceof Tag) { @@ -2550,14 +2634,14 @@ public class TagTreeContextMenu extends JPopupMenu { } private void showInResourcesViewActionPerformed(ActionEvent evt) { - TreeItem item = getTree().getCurrentTreeItem(); + TreeItem item = getCurrentItem(); mainPanel.showView(MainPanel.VIEW_RESOURCES); mainPanel.setTagTreeSelectedNode(mainPanel.tagTree, item); mainPanel.updateMenu(); } private void showInTagListViewActionPerformed(ActionEvent evt) { - TreeItem item = getTree().getCurrentTreeItem(); + TreeItem item = getCurrentItem(); mainPanel.showView(MainPanel.VIEW_TAGLIST); if (item instanceof TagScript) { @@ -2571,16 +2655,15 @@ public class TagTreeContextMenu extends JPopupMenu { if (mainPanel.isModified()) { ViewMessages.showMessageDialog(Main.getDefaultMessagesComponent(), AppStrings.translate("message.warning.hexViewNotUpToDate"), AppStrings.translate("message.warning"), JOptionPane.WARNING_MESSAGE, Configuration.warningHexViewNotUpToDate); } - TreeItem item = getTree().getCurrentTreeItem(); + TreeItem item = getCurrentItem(); mainPanel.showView(MainPanel.VIEW_DUMP); mainPanel.dumpTree.setSelectedItem(item); mainPanel.updateMenu(); } private void moveTagActionPerformed(ActionEvent evt) { - List items = getTree().getSelected(); - Tag t = (Tag) items.get(0); - TreePath path = getTree().getSelectionPath(); + Tag t = (Tag) getCurrentItem(); + TreePath path = getTree().getModel().getTreePath(t); Timelined timelined = null; for (int i = path.getPathCount() - 1 - 1 /*not last path component*/; i >= 0; i--) { if ((path.getPathComponent(i) instanceof DefineSpriteTag) || (path.getPathComponent(i) instanceof SWF)) { @@ -2665,7 +2748,7 @@ public class TagTreeContextMenu extends JPopupMenu { } private void addFrames(boolean before) { - TreeItem item = getTree().getCurrentTreeItem(); + TreeItem item = getCurrentItem(); if (item == null) { return; } @@ -2850,19 +2933,19 @@ public class TagTreeContextMenu extends JPopupMenu { } public void cutTagToClipboardActionPerformed(ActionEvent evt) { - List items = getTree().getSelected(); + List items = getSelectedItems(); mainPanel.cutToClipboard(items); mainPanel.repaintTree(); } public void cutTagToClipboardWithDependenciesActionPerformed(ActionEvent evt) { - List items = getTree().getSelected(); + List items = getSelectedItems(); mainPanel.cutToClipboard(getDependenciesSet(items)); mainPanel.repaintTree(); } public void pasteBeforeActionPerformed(ActionEvent evt) { - TreeItem item = getTree().getCurrentTreeItem(); + TreeItem item = getCurrentItem(); Timelined timelined; Tag position; int positionInt; @@ -2884,7 +2967,7 @@ public class TagTreeContextMenu extends JPopupMenu { } public void pasteAfterActionPerformed(ActionEvent evt) { - TreeItem item = getTree().getCurrentTreeItem(); + TreeItem item = getCurrentItem(); Timelined timelined; Tag position; int positionInt; @@ -2906,7 +2989,7 @@ public class TagTreeContextMenu extends JPopupMenu { } private void pasteInsideActionPerformed(ActionEvent evt) { - TreeItem item = getTree().getCurrentTreeItem(); + TreeItem item = getCurrentItem(); Timelined timelined; Tag position; if (item instanceof Frame) { @@ -3056,42 +3139,42 @@ public class TagTreeContextMenu extends JPopupMenu { } public void importScriptsActionPerformed(ActionEvent evt) { - Openable openable = getTree().getCurrentTreeItem().getOpenable(); - SWF swf = (openable instanceof SWF) ? (SWF) openable : ((ABC)openable).getSwf(); + Openable openable = getCurrentItem().getOpenable(); + SWF swf = (openable instanceof SWF) ? (SWF) openable : ((ABC) openable).getSwf(); mainPanel.importScript(swf); } public void importTextsActionPerformed(ActionEvent evt) { - SWF swf = (SWF) getTree().getCurrentTreeItem().getOpenable(); + SWF swf = (SWF) getCurrentItem().getOpenable(); mainPanel.importText(swf); } public void importImagesActionPerformed(ActionEvent evt) { - SWF swf = (SWF) getTree().getCurrentTreeItem().getOpenable(); + SWF swf = (SWF) getCurrentItem().getOpenable(); mainPanel.importImage(swf); } public void importShapesActionPerformed(ActionEvent evt) { - SWF swf = (SWF) getTree().getCurrentTreeItem().getOpenable(); + SWF swf = (SWF) getCurrentItem().getOpenable(); mainPanel.importShape(swf, false); } public void importShapesNoFillActionPerformed(ActionEvent evt) { - SWF swf = (SWF) getTree().getCurrentTreeItem().getOpenable(); + SWF swf = (SWF) getCurrentItem().getOpenable(); mainPanel.importShape(swf, true); } public void importSymbolClassActionPerformed(ActionEvent evt) { - SWF swf = (SWF) getTree().getCurrentTreeItem().getOpenable(); + SWF swf = (SWF) getCurrentItem().getOpenable(); mainPanel.importSymbolClass(swf); } public void moveUpActionPerformed(ActionEvent evt) { - moveUpDown(getTree().getCurrentTreeItem(), true); + moveUpDown(getCurrentItem(), true); } public void moveDownActionPerformed(ActionEvent evt) { - moveUpDown(getTree().getCurrentTreeItem(), false); + moveUpDown(getCurrentItem(), false); } public void moveUpDown(TreeItem item, boolean up) { @@ -3160,7 +3243,7 @@ public class TagTreeContextMenu extends JPopupMenu { } public void changeCharsetActionPerformed(ActionEvent evt) { - SWF item = (SWF) getTree().getCurrentTreeItem(); + SWF item = (SWF) getCurrentItem(); String newCharset = ((JMenuItem) evt.getSource()).getText(); if (Objects.equals(item.getCharset(), newCharset)) { return; @@ -3173,9 +3256,9 @@ public class TagTreeContextMenu extends JPopupMenu { } Main.reloadFile(item.openableList); } - + private void exportABCActionPerformed(ActionEvent evt) { - ABCContainerTag container = (ABCContainerTag) getTree().getCurrentTreeItem(); + ABCContainerTag container = (ABCContainerTag) getCurrentItem(); FileFilter abcFilter = new FileFilter() { @Override public boolean accept(File f) { @@ -3199,15 +3282,15 @@ public class TagTreeContextMenu extends JPopupMenu { if (selFilter == abcFilter) { if (!fileName.toLowerCase(Locale.ENGLISH).endsWith(".abc")) { fileName += ".abc"; - } + } } - - try (FileOutputStream fos = new FileOutputStream(fileName)) { + + try ( FileOutputStream fos = new FileOutputStream(fileName)) { container.getABC().saveTo(fos); } - + Configuration.lastExportDir.set(file.getParentFile().getAbsolutePath()); - + } catch (Exception | OutOfMemoryError | StackOverflowError ex) { Main.handleSaveError(ex); }