Tag list view context menu and other related fixes

This commit is contained in:
Jindra Petřík
2022-10-29 22:19:35 +02:00
parent 7d1f6e684a
commit 4d088abb3f
5 changed files with 338 additions and 93 deletions

View File

@@ -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();
}

View File

@@ -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<SearchResultsDialog> 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<TreeItem> 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<File> exportSelection(AbortRetryIgnoreHandler handler, String selFile, ExportDialog export) throws IOException, InterruptedException {
List<File> ret = new ArrayList<>();
List<TreeItem> sel = tagTree.getSelection(getCurrentSwf());
List<TreeItem> sel = getSelection(getCurrentSwf());
Set<SWF> 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<TreeItem> getAllSelected() {
if (currentView == VIEW_RESOURCES) {
return tagTree.getAllSelected();
}
if (currentView == VIEW_TAGLIST) {
return tagListTree.getAllSelected();
}
return new ArrayList<>();
}
private List<TreeItem> 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<SWF> swfsUsed = new LinkedHashSet<>();
List<TreeItem> allItems = tagTree.getAllSelected();
List<TreeItem> 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<TreeItem> items = tagTree.getSelected();
List<TreeItem> 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<TreeItem> sel = tagTree.getAllSelected();
List<TreeItem> 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<TreeItem> sel = tagTree.getSelected();
List<TreeItem> 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<TreeItem> sel = tagTree.getSelected();
List<TreeItem> sel = getSelected();
Set<SWF> 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<TreeItem> sel = tagTree.getSelected();
List<TreeItem> sel = getSelected();
Set<SWF> 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<TreeItem> sel = tagTree.getAllSelected();
List<TreeItem> sel = getAllSelected();
Set<Integer> 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<TreeItem> items = tagTree.getSelected();
List<TreeItem> 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();
}

View File

@@ -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<SWFList> 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<List<String>> 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<TreeItem> getSelected() {
TreePath[] paths = getSelectionPaths();
Set<TreeItem> selected = new LinkedHashSet<>();
for (TreePath path : paths) {
selected.add((TreeItem)((TagListTreeNode)path.getLastPathComponent()).getData());
}
List<TreeItem> ret = new ArrayList<>(selected);
return ret;
}
public List<TreeItem> getAllSelected() {
TreePath[] paths = getSelectionPaths();
Set<TreeItem> selected = new LinkedHashSet<>();
for (TreePath path : paths) {
populateSelected((TagListTreeNode)path.getLastPathComponent(), selected);
}
List<TreeItem> ret = new ArrayList<>(selected);
return ret;
}
public List<TreeItem> getSelection(SWF swf) {
Set<TreeItem> selected = new HashSet<>();
populateSelectedSwf(swf, root, selected);
return new ArrayList<>(selected);
}
public void populateSelectedSwf(SWF swf, TagListTreeNode node, Set<TreeItem> 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<TreeItem> selected){
selected.add((TreeItem)node.getData());
for (int i = 0; i < node.getChildCount(); i++) {
populateSelected((TagListTreeNode)node.getChildAt(i), selected);
}
}
}

View File

@@ -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) {

View File

@@ -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<TreeItem> 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<TreeItem> items) {
public void update(final List<TreeItem> 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<TreeItem> 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<TreeItem> sel = tagTree.getSelected();
List<TreeItem> sel = getSelectedTreeItems();
List<DefineBinaryDataTag> 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<TreeItem> sel = tagTree.getSelected();
//using tagTree only here is safe since tagListTree does not have AS3 classes
List<TreeItem> 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<TreeItem> sel = tagTree.getSelected();
List<TreeItem> sel = getSelectedTreeItems();
if (!sel.isEmpty()) {
if (sel.get(0) instanceof FolderItem) {
@@ -1486,27 +1575,41 @@ public class TagTreeContextMenu extends JPopupMenu {
TreePath[] tpsArr;
List<TreePath> 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<TreeItem> 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<TreeItem> 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<Tag> tagsToRemove = new ArrayList<>();
@@ -1722,7 +1825,7 @@ public class TagTreeContextMenu extends JPopupMenu {
}
private void undoTagActionPerformed(ActionEvent evt) {
List<TreeItem> sel = tagTree.getSelected();
List<TreeItem> 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<TreeItem> sel = tagTree.getSelected();
List<TreeItem> 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<TreeItem> items = tagTree.getSelected();
List<TreeItem> 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<TreeItem> items = tagTree.getSelected();
List<TreeItem> 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)) {