From 157f167dfebf913454e4a022a1e8e0c9f6d1de1a Mon Sep 17 00:00:00 2001 From: "honfika@gmail.com" Date: Sat, 25 Jul 2015 13:05:50 +0200 Subject: [PATCH] possibility to add new tags without enabling "show emtpy folders" from the context menu of the "others" node --- .../flash/abc/types/traits/Trait.java | 1 + .../decompiler/flash/tags/DoActionTag.java | 1 + .../flash/tags/DoInitActionTag.java | 1 + .../flash/gui/tagtree/TagTreeContextMenu.java | 51 ++++++++---- .../flash/gui/tagtree/TagTreeModel.java | 82 ++++++++----------- .../flash/gui/tagtree/TagTreeSwfInfo.java | 3 + 6 files changed, 74 insertions(+), 65 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Trait.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Trait.java index 9724c3a80..0a94d65f4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Trait.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/types/traits/Trait.java @@ -38,6 +38,7 @@ import java.util.Map.Entry; public abstract class Trait implements Cloneable, Serializable { public static final String METADATA_CTOR_DEFINITION = "__go_to_ctor_definition_help"; + public static final String METADATA_DEFINITION = "__go_to_definition_help"; private static final int[] EMPTY_METADATA_ARRAY = new int[0]; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoActionTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoActionTag.java index e262e1b57..a183bb957 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoActionTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoActionTag.java @@ -62,6 +62,7 @@ public class DoActionTag extends Tag implements ASMSource { */ public DoActionTag(SWF swf) { super(swf, ID, NAME, null); + actionBytes = ByteArrayRange.EMPTY; } /** diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoInitActionTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoInitActionTag.java index 8a8b7d8ea..d1f498f82 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoInitActionTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoInitActionTag.java @@ -69,6 +69,7 @@ public class DoInitActionTag extends Tag implements CharacterIdTag, ASMSource { */ public DoInitActionTag(SWF swf) { super(swf, ID, NAME, null); + actionBytes = ByteArrayRange.EMPTY; } /** diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java index 8680c0d2a..ffd0ea4e4 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java @@ -335,25 +335,31 @@ public class TagTreeContextMenu extends JPopupMenu { replaceMenuItem.setVisible(true); } - List allowedTagTypes = null; + addTagMenu.removeAll(); if (firstItem instanceof FolderItem) { - allowedTagTypes = tagTree.getSwfFolderItemNestedTagIds(((FolderItem) firstItem).getName(), firstItem.getSwf().gfx); + List allowedTagTypes; + FolderItem folderItem = (FolderItem) firstItem; + SWF swf = firstItem.getSwf(); + if (folderItem.getName().equals(TagTreeModel.FOLDER_OTHERS)) { + TagTreeModel ttm = tagTree.getModel(); + for (FolderItem emptyFolder : ttm.getEmptyFolders(swf)) { + JMenu subMenu = new JMenu(emptyFolder.toString()); + allowedTagTypes = tagTree.getSwfFolderItemNestedTagIds(emptyFolder.getName(), swf.gfx); + addAddTagMenuItems(allowedTagTypes, subMenu, firstItem); + if (subMenu.getItemCount() > 0) { + addTagMenu.add(subMenu); + } + } + } + + allowedTagTypes = tagTree.getSwfFolderItemNestedTagIds(folderItem.getName(), swf.gfx); + addAddTagMenuItems(allowedTagTypes, addTagMenu, firstItem); } else if (firstItem instanceof Tag) { - allowedTagTypes = tagTree.getNestedTagIds((Tag) firstItem); + List allowedTagTypes = tagTree.getNestedTagIds((Tag) firstItem); + addAddTagMenuItems(allowedTagTypes, addTagMenu, firstItem); } - addTagMenu.removeAll(); - if (allowedTagTypes != null) { - for (Integer tagId : allowedTagTypes) { - final Class cl = TagIdClassMap.getClassByTagId(tagId); - JMenuItem tagItem = new JMenuItem(cl.getSimpleName()); - tagItem.addActionListener((ActionEvent ae) -> { - addTagActionPerformed(ae, firstItem, cl); - }); - addTagMenu.add(tagItem); - } - addTagMenu.setVisible(true); - } + addTagMenu.setVisible(addTagMenu.getItemCount() > 0); if (tagTree.getModel().getChildCount(firstItem) > 0) { expandRecursiveMenuItem.setVisible(true); @@ -415,6 +421,21 @@ public class TagTreeContextMenu extends JPopupMenu { } } + private void addAddTagMenuItems(List allowedTagTypes, JMenu addTagMenu, TreeItem item) { + if (allowedTagTypes == null) { + return; + } + + for (Integer tagId : allowedTagTypes) { + final Class cl = TagIdClassMap.getClassByTagId(tagId); + JMenuItem tagItem = new JMenuItem(cl.getSimpleName()); + tagItem.addActionListener((ActionEvent ae) -> { + addTagActionPerformed(ae, item, cl); + }); + addTagMenu.add(tagItem); + } + } + private void addTagActionPerformed(ActionEvent evt, TreeItem firstItem, Class cl) { try { SWF swf = firstItem.getSwf(); diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeModel.java b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeModel.java index 433b4e419..07b3320cc 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeModel.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeModel.java @@ -190,6 +190,7 @@ public class TagTreeModel implements TreeModel { List sounds = new ArrayList<>(); List binaryData = new ArrayList<>(); List others = new ArrayList<>(); + List emptyFolders = new ArrayList<>(); Map> mappedTags = new HashMap<>(); for (Tag t : swf.tags) { TreeNodeType ttype = TagTree.getTreeNodeType(t); @@ -266,54 +267,18 @@ public class TagTreeModel implements TreeModel { nodeList.add(new HeaderItem(swf, translate("node.header"))); - if (addAllFolders || !shapes.isEmpty()) { - FolderItem shapesNode = new FolderItem(translate("node.shapes"), FOLDER_SHAPES, swf, shapes); - nodeList.add(shapesNode); - } - if (addAllFolders || !morphShapes.isEmpty()) { - FolderItem morphShapesNode = new FolderItem(translate("node.morphshapes"), FOLDER_MORPHSHAPES, swf, morphShapes); - nodeList.add(morphShapesNode); - } - if (addAllFolders || !sprites.isEmpty()) { - FolderItem spritesNode = new FolderItem(translate("node.sprites"), FOLDER_SPRITES, swf, sprites); - nodeList.add(spritesNode); - } - if (addAllFolders || !texts.isEmpty()) { - FolderItem textsNode = new FolderItem(translate("node.texts"), FOLDER_TEXTS, swf, texts); - nodeList.add(textsNode); - } - if (addAllFolders || !images.isEmpty()) { - FolderItem imagesNode = new FolderItem(translate("node.images"), FOLDER_IMAGES, swf, images); - nodeList.add(imagesNode); - } - if (addAllFolders || !movies.isEmpty()) { - FolderItem moviesNode = new FolderItem(translate("node.movies"), FOLDER_MOVIES, swf, movies); - nodeList.add(moviesNode); - } - if (addAllFolders || !sounds.isEmpty()) { - FolderItem soundsNode = new FolderItem(translate("node.sounds"), FOLDER_SOUNDS, swf, sounds); - nodeList.add(soundsNode); - } - if (addAllFolders || !buttons.isEmpty()) { - FolderItem buttonsNode = new FolderItem(translate("node.buttons"), FOLDER_BUTTONS, swf, buttons); - nodeList.add(buttonsNode); - } - if (addAllFolders || !fonts.isEmpty()) { - FolderItem fontsNode = new FolderItem(translate("node.fonts"), FOLDER_FONTS, swf, fonts); - nodeList.add(fontsNode); - } - if (addAllFolders || !binaryData.isEmpty()) { - FolderItem binaryDataNode = new FolderItem(translate("node.binaryData"), FOLDER_BINARY_DATA, swf, binaryData); - nodeList.add(binaryDataNode); - } - if (!frames.isEmpty()) { - FolderItem framesNode = new FolderItem(translate("node.frames"), FOLDER_FRAMES, swf, frames); - nodeList.add(framesNode); - } - if (!others.isEmpty()) { - FolderItem otherNode = new FolderItem(translate("node.others"), FOLDER_OTHERS, swf, others); - nodeList.add(otherNode); - } + addFolderItem(nodeList, emptyFolders, addAllFolders, translate("node.shapes"), FOLDER_SHAPES, swf, shapes); + addFolderItem(nodeList, emptyFolders, addAllFolders, translate("node.morphshapes"), FOLDER_MORPHSHAPES, swf, morphShapes); + addFolderItem(nodeList, emptyFolders, addAllFolders, translate("node.sprites"), FOLDER_SPRITES, swf, sprites); + addFolderItem(nodeList, emptyFolders, addAllFolders, translate("node.texts"), FOLDER_TEXTS, swf, texts); + addFolderItem(nodeList, emptyFolders, addAllFolders, translate("node.images"), FOLDER_IMAGES, swf, images); + addFolderItem(nodeList, emptyFolders, addAllFolders, translate("node.movies"), FOLDER_MOVIES, swf, movies); + addFolderItem(nodeList, emptyFolders, addAllFolders, translate("node.sounds"), FOLDER_SOUNDS, swf, sounds); + addFolderItem(nodeList, emptyFolders, addAllFolders, translate("node.buttons"), FOLDER_BUTTONS, swf, buttons); + addFolderItem(nodeList, emptyFolders, addAllFolders, translate("node.fonts"), FOLDER_FONTS, swf, fonts); + addFolderItem(nodeList, emptyFolders, addAllFolders, translate("node.binaryData"), FOLDER_BINARY_DATA, swf, binaryData); + addFolderItem(nodeList, emptyFolders, addAllFolders, translate("node.frames"), FOLDER_FRAMES, swf, frames); + addFolderItem(nodeList, emptyFolders, addAllFolders, translate("node.others"), FOLDER_OTHERS, swf, others); Map currentTagScriptCache = new HashMap<>(); if (swf.isAS3()) { @@ -331,11 +296,23 @@ public class TagTreeModel implements TreeModel { TagTreeSwfInfo swfInfo = new TagTreeSwfInfo(); swfInfo.folders = nodeList; + swfInfo.emptyFolders = emptyFolders; swfInfo.mappedTags = mappedTags; swfInfo.tagScriptCache = currentTagScriptCache; swfInfos.put(swf, swfInfo); } + private void addFolderItem(List nodeList, List emptyList, boolean addAllFolders, String title, String folderName, SWF swf, List items) { + FolderItem node = new FolderItem(title, folderName, swf, items); + if (addAllFolders || !items.isEmpty()) { + nodeList.add(node); + } + + if (items.isEmpty()) { + emptyList.add(node); + } + } + public TreeItem getScriptsNode(SWF swf) { int childCount = getChildCount(swf); for (int i = 0; i < childCount; i++) { @@ -423,10 +400,10 @@ public class TagTreeModel implements TreeModel { } if (obj instanceof FolderItem && n instanceof FolderItem) { - // FolderItems are always recreated, so compare them by name + // FolderItems are always recreated, so compare them by name and swf FolderItem nds = (FolderItem) n; FolderItem objs = (FolderItem) obj; - if (objs.getName().equals(nds.getName())) { + if (objs.getName().equals(nds.getName()) && objs.swf.equals(nds.swf)) { return newPath; } } else { @@ -478,6 +455,11 @@ public class TagTreeModel implements TreeModel { return swfInfo; } + public List getEmptyFolders(SWF swf) { + TagTreeSwfInfo swfInfo = getSwfInfo(swf); + return swfInfo.emptyFolders; + } + private List getSwfFolders(SWF swf) { TagTreeSwfInfo swfInfo = getSwfInfo(swf); return swfInfo.folders; diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeSwfInfo.java b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeSwfInfo.java index d75ead064..090ecc4dc 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeSwfInfo.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeSwfInfo.java @@ -18,6 +18,7 @@ package com.jpexs.decompiler.flash.gui.tagtree; import com.jpexs.decompiler.flash.tags.Tag; import com.jpexs.decompiler.flash.timeline.TagScript; +import com.jpexs.decompiler.flash.treeitems.FolderItem; import com.jpexs.decompiler.flash.treeitems.TreeItem; import java.util.List; import java.util.Map; @@ -30,6 +31,8 @@ public class TagTreeSwfInfo { public List folders; + public List emptyFolders; + public Map> mappedTags; public Map tagScriptCache;