mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/jpexs-decompiler.git
synced 2026-05-25 06:46:28 +00:00
Tag list view context menu and other related fixes
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
Reference in New Issue
Block a user