diff --git a/src/com/jpexs/decompiler/flash/gui/taglistview/TagListTree.java b/src/com/jpexs/decompiler/flash/gui/taglistview/TagListTree.java index caad797e1..82b19174f 100644 --- a/src/com/jpexs/decompiler/flash/gui/taglistview/TagListTree.java +++ b/src/com/jpexs/decompiler/flash/gui/taglistview/TagListTree.java @@ -66,17 +66,24 @@ public class TagListTree extends AbstractTagTree { @Override public List getNestedTagIds(Tag obj) { if (obj instanceof DefineSpriteTag) { - return Arrays.asList(PlaceObjectTag.ID, PlaceObject2Tag.ID, PlaceObject3Tag.ID, PlaceObject4Tag.ID, + return getSpriteNestedTagIds(); + } + return new ArrayList<>(); + } + + private List getSpriteNestedTagIds() { + return Arrays.asList(PlaceObjectTag.ID, PlaceObject2Tag.ID, PlaceObject3Tag.ID, PlaceObject4Tag.ID, RemoveObjectTag.ID, RemoveObject2Tag.ID, ShowFrameTag.ID, FrameLabelTag.ID, StartSoundTag.ID, StartSound2Tag.ID, VideoFrameTag.ID, SoundStreamBlockTag.ID, SoundStreamHeadTag.ID, SoundStreamHead2Tag.ID, DefineScalingGridTag.ID); //scaling grid? FIXME? - } - return new ArrayList<>(); //FIXME: it should be actually all tags } - + @Override - public List getFrameNestedTagIds() { - return new ArrayList<>(); //FIXME: it should be alltags for swf timeline, limited for sprite timeline + public List getFrameNestedTagIds(boolean inSprite) { + if (inSprite) { + return getSpriteNestedTagIds(); + } + return null; //null = all possible tags } } diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/AbstractTagTree.java b/src/com/jpexs/decompiler/flash/gui/tagtree/AbstractTagTree.java index be85daa54..7bd2881b5 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/AbstractTagTree.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/AbstractTagTree.java @@ -496,7 +496,7 @@ public abstract class AbstractTagTree extends JTree { public abstract List getNestedTagIds(Tag obj); - public abstract List getFrameNestedTagIds(); + public abstract List getFrameNestedTagIds(boolean inSprite); public TreeItem getCurrentTreeItem() { TreeItem item = (TreeItem) getLastSelectedPathComponent(); diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java index 073a64a24..963a4e2b8 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java @@ -418,8 +418,8 @@ public class TagTree extends AbstractTagTree { return TreeNodeType.FOLDER; } - public List getSwfFolderItemNestedTagIds(String folderName, boolean gfx) { - List ret = null; + public static List getSwfFolderItemNestedTagIds(String folderName, boolean gfx) { + List ret = new ArrayList<>(); switch (folderName) { case TagTreeModel.FOLDER_SHAPES: ret = Arrays.asList(DefineShapeTag.ID, DefineShape2Tag.ID, DefineShape3Tag.ID, DefineShape4Tag.ID); @@ -481,7 +481,7 @@ public class TagTree extends AbstractTagTree { } @Override - public List getFrameNestedTagIds() { + public List getFrameNestedTagIds(boolean inSprite) { return Arrays.asList(PlaceObjectTag.ID, PlaceObject2Tag.ID, PlaceObject3Tag.ID, PlaceObject4Tag.ID, RemoveObjectTag.ID, RemoveObject2Tag.ID, FrameLabelTag.ID, StartSoundTag.ID, StartSound2Tag.ID, VideoFrameTag.ID, @@ -509,7 +509,7 @@ public class TagTree extends AbstractTagTree { if (obj instanceof DefineButton2Tag) { return Arrays.asList(DefineButtonSoundTag.ID, DefineScalingGridTag.ID); } - return null; + return new ArrayList<>(); } diff --git a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java index 152b26e8b..7832848e9 100644 --- a/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java +++ b/src/com/jpexs/decompiler/flash/gui/tagtree/TagTreeContextMenu.java @@ -27,6 +27,7 @@ import com.jpexs.decompiler.flash.action.Action; import com.jpexs.decompiler.flash.action.parser.ActionParseException; import com.jpexs.decompiler.flash.action.parser.script.ActionScript2Parser; import com.jpexs.decompiler.flash.gui.AppDialog; +import com.jpexs.decompiler.flash.gui.AppStrings; import com.jpexs.decompiler.flash.gui.SelectTagPositionDialog; import com.jpexs.decompiler.flash.gui.Main; import com.jpexs.decompiler.flash.gui.MainPanel; @@ -717,7 +718,6 @@ public class TagTreeContextMenu extends JPopupMenu { private List getAllowedTagTypes(TreeItem item) { if (item instanceof FolderItem) { - List allowedTagTypes; FolderItem folderItem = (FolderItem) item; SWF swf = item.getSwf(); @@ -725,7 +725,7 @@ public class TagTreeContextMenu extends JPopupMenu { } else if (item instanceof Tag) { return getTree().getNestedTagIds((Tag) item); } else if (item instanceof Frame) { - return getTree().getFrameNestedTagIds(); + return getTree().getFrameNestedTagIds(((Frame) item).timeline.timelined instanceof DefineSpriteTag); } return new ArrayList<>(); @@ -736,8 +736,40 @@ public class TagTreeContextMenu extends JPopupMenu { void call(ActionEvent evt, TreeItem item, Class cl); } + private void addAddTagMenuFolder(JMenu addTagMenu, String folder, boolean gfx, TreeItem item, AddTagActionLisener listener) { + String folderTranslated = AppStrings.translate("node."+folder); + JMenu folderMenu = new JMenu(folderTranslated); + + List allowedTagTypes = TagTree.getSwfFolderItemNestedTagIds(folder, gfx); + if (allowedTagTypes.isEmpty()) { + return; + } + addAddTagMenuItems(allowedTagTypes, folderMenu, item, listener); + addTagMenu.add(folderMenu); + } + private void addAddTagMenuItems(List allowedTagTypes, JMenu addTagMenu, TreeItem item, AddTagActionLisener listener) { if (allowedTagTypes == null) { + boolean gfx = mainPanel.getCurrentSwf().gfx; + + String folders[] = new String[] { + TagTreeModel.FOLDER_SHAPES, + TagTreeModel.FOLDER_MORPHSHAPES, + TagTreeModel.FOLDER_SPRITES, + TagTreeModel.FOLDER_TEXTS, + TagTreeModel.FOLDER_IMAGES, + TagTreeModel.FOLDER_MOVIES, + TagTreeModel.FOLDER_SOUNDS, + TagTreeModel.FOLDER_BUTTONS, + TagTreeModel.FOLDER_FONTS, + TagTreeModel.FOLDER_BINARY_DATA, + TagTreeModel.FOLDER_FRAMES, + TagTreeModel.FOLDER_OTHERS + }; + for (String folder : folders) { + addAddTagMenuFolder(addTagMenu, folder, gfx, item, listener); + } + return; }