possibility to add new tags without enabling "show emtpy folders" from the context menu of the "others" node

This commit is contained in:
2015-07-25 13:05:50 +02:00
parent 7669a6747c
commit 157f167dfe
6 changed files with 74 additions and 65 deletions
@@ -335,25 +335,31 @@ public class TagTreeContextMenu extends JPopupMenu {
replaceMenuItem.setVisible(true);
}
List<Integer> allowedTagTypes = null;
addTagMenu.removeAll();
if (firstItem instanceof FolderItem) {
allowedTagTypes = tagTree.getSwfFolderItemNestedTagIds(((FolderItem) firstItem).getName(), firstItem.getSwf().gfx);
List<Integer> 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<Integer> 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<Integer> 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();
@@ -190,6 +190,7 @@ public class TagTreeModel implements TreeModel {
List<TreeItem> sounds = new ArrayList<>();
List<TreeItem> binaryData = new ArrayList<>();
List<TreeItem> others = new ArrayList<>();
List<FolderItem> emptyFolders = new ArrayList<>();
Map<Integer, List<TreeItem>> 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<Tag, TagScript> 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<TreeItem> nodeList, List<FolderItem> emptyList, boolean addAllFolders, String title, String folderName, SWF swf, List<TreeItem> 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<FolderItem> getEmptyFolders(SWF swf) {
TagTreeSwfInfo swfInfo = getSwfInfo(swf);
return swfInfo.emptyFolders;
}
private List<TreeItem> getSwfFolders(SWF swf) {
TagTreeSwfInfo swfInfo = getSwfInfo(swf);
return swfInfo.folders;
@@ -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<TreeItem> folders;
public List<FolderItem> emptyFolders;
public Map<Integer, List<TreeItem>> mappedTags;
public Map<Tag, TagScript> tagScriptCache;