diff --git a/src/com/jpexs/decompiler/flash/gui/FolderPreviewPanel.java b/src/com/jpexs/decompiler/flash/gui/FolderPreviewPanel.java index 111b05853..3efd7a506 100644 --- a/src/com/jpexs/decompiler/flash/gui/FolderPreviewPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/FolderPreviewPanel.java @@ -149,8 +149,8 @@ public class FolderPreviewPanel extends JPanel { } if (e.getButton() == MouseEvent.BUTTON3) { - mainPanel.tagTree.contextPopupMenu.update(new ArrayList<>(selectedItems.values())); - mainPanel.tagTree.contextPopupMenu.show(FolderPreviewPanel.this, e.getX(), e.getY()); + mainPanel.getContextPopupMenu().update(new ArrayList<>(selectedItems.values()), mainPanel.getCurrentView()); + mainPanel.getContextPopupMenu().show(FolderPreviewPanel.this, e.getX(), e.getY()); } repaint(); } diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index 4a10d64df..1f4ef9aa4 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -94,6 +94,7 @@ import com.jpexs.decompiler.flash.gui.player.FlashPlayerPanel; import com.jpexs.decompiler.flash.gui.taglistview.TagListTree; import com.jpexs.decompiler.flash.gui.taglistview.TagListTreeNode; import com.jpexs.decompiler.flash.gui.tagtree.TagTree; +import com.jpexs.decompiler.flash.gui.tagtree.TagTreeContextMenu; import com.jpexs.decompiler.flash.gui.tagtree.TagTreeModel; import com.jpexs.decompiler.flash.gui.timeline.TimelineViewPanel; import com.jpexs.decompiler.flash.helpers.FileTextWriter; @@ -244,6 +245,7 @@ import javax.swing.JProgressBar; import javax.swing.JSplitPane; import javax.swing.JTabbedPane; import javax.swing.JTextField; +import javax.swing.JTree; import javax.swing.SwingConstants; import javax.swing.UIManager; import javax.swing.event.DocumentEvent; @@ -363,9 +365,17 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se private int currentView = VIEW_RESOURCES; public List searchResultsDialogs = new ArrayList<>(); + + private TagTreeContextMenu contextPopupMenu; private static final Logger logger = Logger.getLogger(MainPanel.class.getName()); + public TagTreeContextMenu getContextPopupMenu() { + return contextPopupMenu; + } + + + public void setPercent(int percent) { View.checkAccess(); @@ -680,7 +690,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } }); - tagTree.createContextMenu(); + contextPopupMenu = new TagTreeContextMenu(tagTree, tagListTree, this); dumpTree = new DumpTree(null, this); dumpTree.addTreeSelectionListener(this); @@ -1259,10 +1269,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) { + if (currentView == MainPanel.VIEW_RESOURCES) { + return tagTree.getSelection(getCurrentSwf()); + } else if (currentView == MainPanel.VIEW_TAGLIST) { + return tagListTree.getSelection(getCurrentSwf()); + } + return new ArrayList<>(); + } + public List exportSelection(AbortRetryIgnoreHandler handler, String selFile, ExportDialog export) throws IOException, InterruptedException { List ret = new ArrayList<>(); - List sel = tagTree.getSelection(getCurrentSwf()); + List sel = getSelection(getCurrentSwf()); Set usedSwfs = new HashSet<>(); for (TreeItem d : sel) { @@ -1738,6 +1757,9 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se return DumpInfoSwfNode.getSwfNode(dumpInfo).getSwf(); } else if (treePanelMode == TreePanelMode.TAGLIST_TREE) { TagListTreeNode node = (TagListTreeNode) tagListTree.getLastSelectedPathComponent(); + if (node == null) { + return null; + } TreeItem treeNode = (TreeItem) node.getData(); if (treeNode == null || treeNode instanceof SWFList) { return null; @@ -1747,11 +1769,25 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se return null; } + + private TreeItem getLastSelectedPathComponent() { + if (currentView == VIEW_RESOURCES) { + return (TreeItem)tagTree.getLastSelectedPathComponent(); + } + if (currentView == VIEW_TAGLIST) { + TagListTreeNode node = (TagListTreeNode)tagListTree.getLastSelectedPathComponent(); + if (node == null) { + return null; + } + return (TreeItem) node.getData(); + } + return null; + } public void gotoFrame(int frame) { View.checkAccess(); - TreeItem treeItem = (TreeItem) tagTree.getLastSelectedPathComponent(); + TreeItem treeItem = (TreeItem) getLastSelectedPathComponent(); if (treeItem == null) { return; } @@ -1903,7 +1939,27 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } return new LinkedHashSet<>(allSwfs); } + + private List getAllSelected() { + if (currentView == VIEW_RESOURCES) { + return tagTree.getAllSelected(); + } + if (currentView == VIEW_TAGLIST) { + return tagListTree.getAllSelected(); + } + return new ArrayList<>(); + } + private List getSelected() { + if (currentView == VIEW_RESOURCES) { + return tagTree.getSelected(); + } + if (currentView == VIEW_TAGLIST) { + return tagListTree.getSelected(); + } + return new ArrayList<>(); + } + public void searchInActionScriptOrText(Boolean searchInText, SWF swf, boolean useSelection) { View.checkAccess(); @@ -1913,7 +1969,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se Set swfsUsed = new LinkedHashSet<>(); - List allItems = tagTree.getAllSelected(); + List allItems = getAllSelected(); for (TreeItem t : allItems) { if (t instanceof ScriptPack) { ScriptPack sp = (ScriptPack) t; @@ -1957,7 +2013,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } } - List items = tagTree.getSelected(); + List items = getSelected(); String selected; if (scopeAs12.isEmpty() && scopeAs3.isEmpty()) { @@ -2231,15 +2287,10 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } } if (currentView == VIEW_TAGLIST) { - TagListTreeNode node = (TagListTreeNode)tagTree.getLastSelectedPathComponent(); - if (node != null) { - TreePath tp = tagListTree.getPathForNode(node); - if (tp != null) { - tagListTree.setSelectionPath(tp); - tagListTree.scrollPathToVisible(tp); - } else { - showCard(CARDEMPTYPANEL); - } + TreePath tp = tagListTree.getPathForData(treeItem); + if (tp != null) { + tagListTree.setSelectionPath(tp); + tagListTree.scrollPathToVisible(tp); } else { showCard(CARDEMPTYPANEL); } @@ -2658,7 +2709,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se View.checkAccess(); final SWF swf = getCurrentSwf(); - List sel = tagTree.getAllSelected(); + List sel = getAllSelected(); if (!onlySel) { sel = null; } else if (sel.isEmpty()) { @@ -2709,7 +2760,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } public void exportJavaSource() { - List sel = tagTree.getSelected(); + List sel = getSelected(); for (TreeItem item : sel) { if (item instanceof SWF) { SWF swf = (SWF) item; @@ -2731,7 +2782,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se public void exportSwfXml() { View.checkAccess(); - List sel = tagTree.getSelected(); + List sel = getSelected(); Set swfs = new HashSet<>(); for (TreeItem item : sel) { @@ -2759,7 +2810,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se ViewMessages.showMessageDialog(MainPanel.this, translate("message.info.importXml"), translate("message.info"), JOptionPane.INFORMATION_MESSAGE, Configuration.showImportXmlInfo); - List sel = tagTree.getSelected(); + List sel = getSelected(); Set swfs = new HashSet<>(); for (TreeItem item : sel) { swfs.add(item.getSwf()); @@ -2912,7 +2963,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se return; } - List sel = tagTree.getAllSelected(); + List sel = getAllSelected(); Set needed = new HashSet<>(); for (TreeItem item : sel) { if (item instanceof CharacterTag) { @@ -2954,13 +3005,15 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } public void treeOperation(Runnable runnable) { - TreeItem treeItem = tagTree.getCurrentTreeItem(); + TreeItem treeItem = getCurrentTreeItem(); tagTree.clearSelection(); + tagListTree.clearSelection(); runnable.run(); clear(); showCard(CARDEMPTYPANEL); tagTree.updateSwfs(new SWF[0]); + tagListTree.updateSwfs(); if (treeItem != null) { SWF swf = treeItem.getSwf(); @@ -3072,27 +3125,41 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } public boolean previousTag() { + JTree tree = null; if (getCurrentView() == VIEW_RESOURCES) { - if (tagTree.getSelectionRows().length > 0) { - int row = tagTree.getSelectionRows()[0]; + tree = tagTree; + } else if (getCurrentView() == VIEW_TAGLIST) { + tree = tagTree; + } + + if (tree != null) { + if (tree.getSelectionRows().length > 0) { + int row = tree.getSelectionRows()[0]; if (row > 0) { - tagTree.setSelectionRow(row - 1); - tagTree.scrollRowToVisible(row - 1); + tree.setSelectionRow(row - 1); + tree.scrollRowToVisible(row - 1); previewPanel.focusTextPanel(); } } return true; } + return false; } public boolean nextTag() { + JTree tree = null; if (getCurrentView() == VIEW_RESOURCES) { - if (tagTree.getSelectionRows().length > 0) { - int row = tagTree.getSelectionRows()[0]; - if (row < tagTree.getRowCount() - 1) { - tagTree.setSelectionRow(row + 1); - tagTree.scrollRowToVisible(row + 1); + tree = tagTree; + } else if (getCurrentView() == VIEW_TAGLIST) { + tree = tagTree; + } + if (tree != null) { + if (tree.getSelectionRows().length > 0) { + int row = tree.getSelectionRows()[0]; + if (row < tree.getRowCount() - 1) { + tree.setSelectionRow(row + 1); + tree.scrollRowToVisible(row + 1); previewPanel.focusTextPanel(); } } @@ -3110,7 +3177,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } public void replaceButtonActionPerformed(ActionEvent evt) { - List items = tagTree.getSelected(); + List items = getSelected(); if (items.size() == 0) { return; } @@ -3230,8 +3297,22 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } } + + private TreeItem getCurrentTreeItem() { + if (currentView == MainPanel.VIEW_RESOURCES) { + return tagTree.getCurrentTreeItem(); + } + if (currentView == MainPanel.VIEW_TAGLIST) { + TagListTreeNode node = (TagListTreeNode) tagListTree.getLastSelectedPathComponent(); + if (node != null) { + return (TreeItem) node.getData(); + } + } + return null; + } + public void replaceNoFillButtonActionPerformed(ActionEvent evt) { - TreeItem item = tagTree.getCurrentTreeItem(); + TreeItem item = getCurrentTreeItem(); if (item == null) { return; } @@ -3273,7 +3354,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } public void replaceAlphaButtonActionPerformed(ActionEvent evt) { - TreeItem item = tagTree.getCurrentTreeItem(); + TreeItem item = getCurrentTreeItem(); if (item == null) { return; } @@ -3472,7 +3553,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se valueChanged(source, e.getPath()); } - private TreePath convertViewPath(TreePath path) { + public TreePath convertViewPath(TreePath path) { if (currentView == VIEW_RESOURCES) { return path; } @@ -3685,7 +3766,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se currentView = view; final SWF swf = getCurrentSwf(); if (swf != null) { - TreeItem item = tagTree.getCurrentTreeItem(); + TreeItem item = getCurrentTreeItem(); if (item instanceof TagScript) { item = ((TagScript) item).getTag(); } diff --git a/src/com/jpexs/decompiler/flash/gui/taglistview/TagListTree.java b/src/com/jpexs/decompiler/flash/gui/taglistview/TagListTree.java index 76d2b0628..58b3a400f 100644 --- a/src/com/jpexs/decompiler/flash/gui/taglistview/TagListTree.java +++ b/src/com/jpexs/decompiler/flash/gui/taglistview/TagListTree.java @@ -24,9 +24,13 @@ import com.jpexs.decompiler.flash.tags.Tag; import com.jpexs.decompiler.flash.timeline.Timeline; import com.jpexs.decompiler.flash.timeline.Timelined; import com.jpexs.decompiler.flash.treeitems.SWFList; +import com.jpexs.decompiler.flash.treeitems.TreeItem; import java.awt.Color; import java.util.ArrayList; +import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Set; import javax.swing.JTree; import javax.swing.plaf.basic.BasicTreeUI; import javax.swing.tree.DefaultTreeModel; @@ -66,11 +70,15 @@ public class TagListTree extends JTree { public void setSwfs(List swfs) { this.swfs = swfs; - updateSwfs(); - initialized = true; + if (updateSwfs()) { + initialized = true; + } } - public void updateSwfs() { + public boolean updateSwfs() { + if (swfs == null) { + return false; + } root = new TagListTreeNode(); root.setData("root"); for (SWFList swfList : swfs) { @@ -80,6 +88,7 @@ public class TagListTree extends JTree { List> expandedNodes = View.getExpandedNodes(this); setModel(new DefaultTreeModel(root)); View.expandTreeNodes(this, expandedNodes); + return true; } private void populateNodes(TagListTreeNode parent, Object obj) { @@ -149,9 +158,9 @@ public class TagListTree extends JTree { } } - + public TreePath getPathForData(Object data) { - TagListTreeNode node = getNodeForData(root, data); + TagListTreeNode node = getNodeForData(data); if (node == null) { return new TreePath(new Object[0]); } @@ -169,7 +178,11 @@ public class TagListTree extends JTree { return new TreePath(pathArr); } - public TagListTreeNode getNodeForData(TagListTreeNode startNode, Object data) { + public TagListTreeNode getNodeForData(Object data) { + return getNodeForData(root, data); + } + + private TagListTreeNode getNodeForData(TagListTreeNode startNode, Object data) { if (startNode.getData() == data) { return startNode; } @@ -181,4 +194,48 @@ public class TagListTree extends JTree { } return null; } + + public List getSelected() { + TreePath[] paths = getSelectionPaths(); + Set selected = new LinkedHashSet<>(); + for (TreePath path : paths) { + selected.add((TreeItem)((TagListTreeNode)path.getLastPathComponent()).getData()); + } + List ret = new ArrayList<>(selected); + return ret; + } + + public List getAllSelected() { + TreePath[] paths = getSelectionPaths(); + Set selected = new LinkedHashSet<>(); + for (TreePath path : paths) { + populateSelected((TagListTreeNode)path.getLastPathComponent(), selected); + } + List ret = new ArrayList<>(selected); + return ret; + } + + public List getSelection(SWF swf) { + Set selected = new HashSet<>(); + populateSelectedSwf(swf, root, selected); + return new ArrayList<>(selected); + } + + public void populateSelectedSwf(SWF swf, TagListTreeNode node, Set selected){ + TreeItem item = (TreeItem) node.getData(); + if (item.getSwf() == swf) { + selected.add(item); + } + + for (int i = 0; i < node.getChildCount(); i++) { + populateSelected((TagListTreeNode)node.getChildAt(i), selected); + } + } + + public void populateSelected(TagListTreeNode node, Set selected){ + selected.add((TreeItem)node.getData()); + for (int i = 0; i < node.getChildCount(); i++) { + populateSelected((TagListTreeNode)node.getChildAt(i), selected); + } + } } diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java index ffc559f11..71222b1eb 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java @@ -275,10 +275,6 @@ public class TagTree extends JTree { }); } - public void createContextMenu() { - contextPopupMenu = new TagTreeContextMenu(this, mainPanel); - } - public static TreeNodeType getTreeNodeType(TreeItem t) { if (t instanceof TagScript) { diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java index 4c6b1e590..1bd2d48ca 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java @@ -36,6 +36,8 @@ import com.jpexs.decompiler.flash.gui.ViewMessages; import com.jpexs.decompiler.flash.gui.abc.AddClassDialog; import com.jpexs.decompiler.flash.gui.abc.ClassesListTreeModel; import com.jpexs.decompiler.flash.gui.action.AddScriptDialog; +import com.jpexs.decompiler.flash.gui.taglistview.TagListTree; +import com.jpexs.decompiler.flash.gui.taglistview.TagListTreeNode; import com.jpexs.decompiler.flash.tags.ABCContainerTag; import com.jpexs.decompiler.flash.tags.DefineBinaryDataTag; import com.jpexs.decompiler.flash.tags.DefineButton2Tag; @@ -105,6 +107,7 @@ import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPopupMenu; +import javax.swing.JTree; import javax.swing.SwingUtilities; import javax.swing.tree.TreePath; @@ -119,6 +122,8 @@ public class TagTreeContextMenu extends JPopupMenu { private final MainPanel mainPanel; private final TagTree tagTree; + + private final TagListTree tagListTree; private JMenuItem expandRecursiveMenuItem; @@ -170,9 +175,10 @@ public class TagTreeContextMenu extends JPopupMenu { private JMenuItem setTagPositionMenuItem; - public TagTreeContextMenu(final TagTree tagTree, MainPanel mainPanel) { + public TagTreeContextMenu(final TagTree tagTree, final TagListTree tagListTree, MainPanel mainPanel) { this.mainPanel = mainPanel; this.tagTree = tagTree; + this.tagListTree = tagListTree; expandRecursiveMenuItem = new JMenuItem(mainPanel.translate("contextmenu.expandAll")); expandRecursiveMenuItem.addActionListener(this::expandRecursiveActionPerformed); @@ -296,14 +302,42 @@ public class TagTreeContextMenu extends JPopupMenu { li.add(item); } - update(li); + update(li, MainPanel.VIEW_RESOURCES); + show(e.getComponent(), e.getX(), e.getY()); + } + } + }); + + tagListTree.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if (SwingUtilities.isRightMouseButton(e)) { + int row = tagListTree.getClosestRowForLocation(e.getX(), e.getY()); + int[] selectionRows = tagListTree.getSelectionRows(); + if (!Helper.contains(selectionRows, row)) { + tagListTree.setSelectionRow(row); + } + + TreePath[] paths = tagListTree.getSelectionPaths(); + if (paths == null || paths.length == 0) { + return; + } + + List li = new ArrayList<>(); + for (TreePath treePath : paths) { + TagListTreeNode node = (TagListTreeNode) treePath.getLastPathComponent(); + TreeItem item = (TreeItem) node.getData(); + li.add(item); + } + + update(li, MainPanel.VIEW_TAGLIST); show(e.getComponent(), e.getX(), e.getY()); } } }); } - public void update(final List items) { + public void update(final List items, int currentView) { if (items.isEmpty()) { return; @@ -464,15 +498,29 @@ public class TagTreeContextMenu extends JPopupMenu { boolean allSelectedSameParent = !items.isEmpty(); if(allSelectedSameParent) { - TagTreeModel model = tagTree.getModel(); - TreePath parent = model.getTreePath(items.get(0)).getParentPath(); + if (currentView == MainPanel.VIEW_RESOURCES) { + TagTreeModel model = tagTree.getModel(); + TreePath parent = model.getTreePath(items.get(0)).getParentPath(); + + for (TreeItem item : items) { + TreePath currentParent = model.getTreePath(item).getParentPath(); + + if(!currentParent.equals(parent)) { + allSelectedSameParent = false; + break; + } + } + } - for (TreeItem item : items) { - TreePath currentParent = model.getTreePath(item).getParentPath(); - - if(!currentParent.equals(parent)) { - allSelectedSameParent = false; - break; + if (currentView == MainPanel.VIEW_TAGLIST) { + TreePath parent = tagListTree.getPathForData(items.get(0)).getParentPath(); + for (TreeItem item : items) { + TreePath currentParent = tagListTree.getPathForData(item).getParentPath(); + + if(!currentParent.equals(parent)) { + allSelectedSameParent = false; + break; + } } } } @@ -482,7 +530,7 @@ public class TagTreeContextMenu extends JPopupMenu { removeWithDependenciesMenuItem.setVisible(canRemove && !allDoNotHaveDependencies); cloneTagMenuItem.setVisible(allSelectedIsTagOrFrame && allSelectedSameParent); undoTagMenuItem.setVisible(allSelectedIsTag); - exportSelectionMenuItem.setEnabled(tagTree.hasExportableNodes()); + exportSelectionMenuItem.setEnabled(currentView == MainPanel.VIEW_RESOURCES ? tagTree.hasExportableNodes() : true); //? replaceMenuItem.setVisible(false); replaceNoFillMenuItem.setVisible(false); replaceWithTagMenuItem.setVisible(false); @@ -598,9 +646,16 @@ public class TagTreeContextMenu extends JPopupMenu { } addTagMenu.setVisible(addTagMenu.getItemCount() > 0); - - if (tagTree.getModel().getChildCount(firstItem) > 0) { - expandRecursiveMenuItem.setVisible(true); + if (currentView == MainPanel.VIEW_RESOURCES) { + if (tagTree.getModel().getChildCount(firstItem) > 0) { + expandRecursiveMenuItem.setVisible(true); + } + } + if (currentView == MainPanel.VIEW_TAGLIST) { + TagListTreeNode node = tagListTree.getNodeForData(firstItem); + if (node.getChildCount() > 0) { + expandRecursiveMenuItem.setVisible(true); + } } if (firstItem instanceof CharacterIdTag && !(firstItem instanceof CharacterTag)) { @@ -843,8 +898,18 @@ public class TagTreeContextMenu extends JPopupMenu { } } + private List getSelectedTreeItems() { + if (mainPanel.getCurrentView() == MainPanel.VIEW_RESOURCES) { + return tagTree.getSelected(); + } + if (mainPanel.getCurrentView() == MainPanel.VIEW_TAGLIST) { + return tagListTree.getSelected(); + } + return new ArrayList<>(); + } + private void openSwfInsideActionPerformed(ActionEvent evt) { - List sel = tagTree.getSelected(); + List sel = getSelectedTreeItems(); List binaryDatas = new ArrayList<>(); for (TreeItem item : sel) { DefineBinaryDataTag binaryData = (DefineBinaryDataTag) item; @@ -856,8 +921,21 @@ public class TagTreeContextMenu extends JPopupMenu { mainPanel.loadFromBinaryTag(binaryDatas); } + private TreeItem getCurrentTreeItem() { + if (mainPanel.getCurrentView() == MainPanel.VIEW_RESOURCES) { + return tagTree.getCurrentTreeItem(); + } + if (mainPanel.getCurrentView() == MainPanel.VIEW_TAGLIST) { + TagListTreeNode node = (TagListTreeNode) tagListTree.getLastSelectedPathComponent(); + if (node != null) { + return (TreeItem) node.getData(); + } + } + return null; + } + private void replaceWithTagActionPerformed(ActionEvent evt) { - TreeItem itemr = tagTree.getCurrentTreeItem(); + TreeItem itemr = getCurrentTreeItem(); if (itemr == null) { return; } @@ -874,7 +952,7 @@ public class TagTreeContextMenu extends JPopupMenu { } private void replaceRefsWithTagActionPerformed(ActionEvent evt) { - TreeItem itemr = tagTree.getCurrentTreeItem(); + TreeItem itemr = getCurrentTreeItem(); if (itemr == null) { return; } @@ -922,7 +1000,7 @@ public class TagTreeContextMenu extends JPopupMenu { } private void rawEditActionPerformed(ActionEvent evt) { - TreeItem itemr = tagTree.getCurrentTreeItem(); + TreeItem itemr = getCurrentTreeItem(); if (itemr == null) { return; } @@ -931,7 +1009,7 @@ public class TagTreeContextMenu extends JPopupMenu { } private void jumpToCharacterActionPerformed(ActionEvent evt) { - TreeItem itemj = tagTree.getCurrentTreeItem(); + TreeItem itemj = getCurrentTreeItem(); if (itemj == null || !(itemj instanceof CharacterIdTag)) { return; } @@ -940,12 +1018,22 @@ public class TagTreeContextMenu extends JPopupMenu { mainPanel.setTagTreeSelectedNode(itemj.getSwf().getCharacter(characterIdTag.getCharacterId())); } - private void expandRecursiveActionPerformed(ActionEvent evt) { - TreePath path = tagTree.getSelectionPath(); + private void expandRecursiveActionPerformed(ActionEvent evt) { + JTree tree = null; + if (mainPanel.getCurrentView() == MainPanel.VIEW_RESOURCES) { + tree = tagTree; + } + if (mainPanel.getCurrentView() == MainPanel.VIEW_TAGLIST) { + tree = tagListTree; + } + if (tree == null) { + return; + } + TreePath path = tree.getSelectionPath(); if (path == null) { return; } - View.expandTreeNodes(tagTree, path, true); + View.expandTreeNodes(tree, path, true); } private void textSearchActionPerformed(ActionEvent evt) { @@ -953,7 +1041,8 @@ public class TagTreeContextMenu extends JPopupMenu { } private void addAs3ClassActionPerformed(ActionEvent evt) { - List sel = tagTree.getSelected(); + //using tagTree only here is safe since tagListTree does not have AS3 classes + List sel = getSelectedTreeItems(); if (!sel.isEmpty()) { SWF swf = null; String preselected = ""; @@ -1060,7 +1149,7 @@ public class TagTreeContextMenu extends JPopupMenu { } private void addAs12ScriptActionPerformed(ActionEvent evt) { - List sel = tagTree.getSelected(); + List sel = getSelectedTreeItems(); if (!sel.isEmpty()) { if (sel.get(0) instanceof FolderItem) { @@ -1486,27 +1575,41 @@ public class TagTreeContextMenu extends JPopupMenu { TreePath[] tpsArr; List tps; - if (mainPanel.folderPreviewPanel.selectedItems.isEmpty()) { - tpsArr = tagTree.getSelectionModel().getSelectionPaths(); + + if (mainPanel.getCurrentView() == MainPanel.VIEW_RESOURCES) { + if (mainPanel.folderPreviewPanel.selectedItems.isEmpty()) { + tpsArr = tagTree.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); + tagTree.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 if (mainPanel.getCurrentView() == MainPanel.VIEW_TAGLIST) { + tpsArr = tagListTree.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); - tagTree.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; + for (TreePath tp : tpsArr) { + tps.add(mainPanel.convertViewPath(tp)); } + } else { + tps = new ArrayList<>(); } List tagsToRemove = new ArrayList<>(); @@ -1722,7 +1825,7 @@ public class TagTreeContextMenu extends JPopupMenu { } private void undoTagActionPerformed(ActionEvent evt) { - List sel = tagTree.getSelected(); + List sel = getSelectedTreeItems(); for (TreeItem item : sel) { if (item instanceof Tag) { @@ -1730,18 +1833,19 @@ public class TagTreeContextMenu extends JPopupMenu { Tag tag = (Tag) item; tag.undo(); tag.getSwf().clearAllCache(); - tagTree.getModel().updateNode(item); + tagTree.getModel().updateNode(item); } catch (InterruptedException | IOException ex) { logger.log(Level.SEVERE, null, ex); } } } + tagListTree.updateSwfs(); mainPanel.repaintTree(); } private void closeSwfActionPerformed(ActionEvent evt) { - List sel = tagTree.getSelected(); + List sel = getSelectedTreeItems(); for (TreeItem item : sel) { if (item instanceof SWF) { SWF swf = (SWF) item; @@ -1760,7 +1864,7 @@ public class TagTreeContextMenu extends JPopupMenu { } private void cloneTagActionPerformed(ActionEvent e) { - List items = tagTree.getSelected(); + List items = getSelectedTreeItems(); /* 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 */ @@ -1837,9 +1941,16 @@ public class TagTreeContextMenu extends JPopupMenu { } private void setTagPositionActionPerformed(ActionEvent evt) { - List items = tagTree.getSelected(); + List items = getSelectedTreeItems(); Tag t = (Tag)items.get(0); - TreePath path = tagTree.getSelectionPath(); + TreePath path; + if (mainPanel.getCurrentView() == MainPanel.VIEW_RESOURCES) { + path = tagTree.getSelectionPath(); + } else if (mainPanel.getCurrentView() == MainPanel.VIEW_TAGLIST) { + path = mainPanel.convertViewPath(tagListTree.getSelectionPath()); + } else { + return; + } 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)) {