Merge origin/master

Conflicts:
	src/com/jpexs/decompiler/flash/gui/tagtree/TagTree.java
This commit is contained in:
Jindra Petřík
2014-11-07 22:18:53 +01:00
61 changed files with 954 additions and 120 deletions
@@ -159,12 +159,11 @@ public class ExportDialog extends AppDialog {
cnt.setLayout(new BorderLayout());
JPanel comboPanel = new JPanel(null);
combos = new JComboBox[optionNames.length];
JLabel[] labels = new JLabel[optionNames.length];
int labWidth = 0;
for (int i = 0; i < optionNames.length; i++) {
labels[i] = new JLabel(optionNames[i]);
if (labels[i].getPreferredSize().width > labWidth) {
labWidth = labels[i].getPreferredSize().width;
JLabel label = new JLabel(optionNames[i]);
if (label.getPreferredSize().width > labWidth) {
labWidth = label.getPreferredSize().width;
}
}
String exportFormatsStr = Configuration.lastSelectedExportFormats.get();
@@ -406,7 +406,7 @@ public final class ImagePanel extends JPanel implements ActionListener, MediaDis
}
@Override
public void zoomToFit() {
public double getZoomToFit() {
if (timelined instanceof BoundedTag) {
RECT bounds = ((BoundedTag) timelined).getRect(new HashSet<BoundedTag>());
double w1 = bounds.getWidth() / SWF.unitDivisor;
@@ -424,8 +424,10 @@ public final class ImagePanel extends JPanel implements ActionListener, MediaDis
} else {
w = w2;
}
zoom = (double) w / (double) w1;
return (double) w / (double) w1;
}
return 1;
}
public void setImage(byte[] data) {
@@ -592,7 +594,7 @@ public final class ImagePanel extends JPanel implements ActionListener, MediaDis
img = image;
}
if (drawable.getTimeline().isSingleFrame()) {
if (drawable.getTimeline().isSingleFrame(frame)) {
SWF.putToCache(key, img);
}
}
@@ -2610,6 +2610,11 @@ public final class MainPanel extends JPanel implements ActionListener, TreeSelec
}
return new RECT(Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE, Integer.MIN_VALUE);
}
@Override
public int hashCode() {
return tag.hashCode();
}
};
}
}
@@ -207,7 +207,8 @@ public class SoundTagPlayer implements MediaDisplay {
}
@Override
public void zoomToFit() {
public double getZoomToFit() {
return 1;
}
@Override
@@ -58,8 +58,9 @@ public class FlashPlayerPanel extends Panel implements Closeable, MediaDisplay {
}
@Override
public void zoomToFit() {
public double getZoomToFit() {
//TODO
return 1;
}
@Override
@@ -53,7 +53,7 @@ public interface MediaDisplay {
public boolean zoomAvailable();
public void zoomToFit();
public double getZoomToFit();
public double getZoom();
}
@@ -316,8 +316,8 @@ public class PlayerControls extends JPanel implements ActionListener {
updateZoom();
break;
case ACTION_ZOOMFIT:
display.zoomToFit();
//updateZoom();
realZoom = display.getZoomToFit();
updateZoom();
break;
case ACTION_SNAPSHOT:
putImageToClipBoard(display.printScreen());
@@ -0,0 +1,205 @@
/*
* Copyright (C) 2010-2014 JPEXS
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.jpexs.decompiler.flash.gui.tagtree;
import com.jpexs.decompiler.flash.tags.CSMTextSettingsTag;
import com.jpexs.decompiler.flash.tags.DebugIDTag;
import com.jpexs.decompiler.flash.tags.DefineBinaryDataTag;
import com.jpexs.decompiler.flash.tags.DefineBitsJPEG2Tag;
import com.jpexs.decompiler.flash.tags.DefineBitsJPEG3Tag;
import com.jpexs.decompiler.flash.tags.DefineBitsJPEG4Tag;
import com.jpexs.decompiler.flash.tags.DefineBitsLossless2Tag;
import com.jpexs.decompiler.flash.tags.DefineBitsLosslessTag;
import com.jpexs.decompiler.flash.tags.DefineBitsTag;
import com.jpexs.decompiler.flash.tags.DefineButton2Tag;
import com.jpexs.decompiler.flash.tags.DefineButtonCxformTag;
import com.jpexs.decompiler.flash.tags.DefineButtonSoundTag;
import com.jpexs.decompiler.flash.tags.DefineButtonTag;
import com.jpexs.decompiler.flash.tags.DefineEditTextTag;
import com.jpexs.decompiler.flash.tags.DefineFont2Tag;
import com.jpexs.decompiler.flash.tags.DefineFont3Tag;
import com.jpexs.decompiler.flash.tags.DefineFont4Tag;
import com.jpexs.decompiler.flash.tags.DefineFontAlignZonesTag;
import com.jpexs.decompiler.flash.tags.DefineFontInfo2Tag;
import com.jpexs.decompiler.flash.tags.DefineFontInfoTag;
import com.jpexs.decompiler.flash.tags.DefineFontNameTag;
import com.jpexs.decompiler.flash.tags.DefineFontTag;
import com.jpexs.decompiler.flash.tags.DefineMorphShape2Tag;
import com.jpexs.decompiler.flash.tags.DefineMorphShapeTag;
import com.jpexs.decompiler.flash.tags.DefineScalingGridTag;
import com.jpexs.decompiler.flash.tags.DefineSceneAndFrameLabelDataTag;
import com.jpexs.decompiler.flash.tags.DefineShape2Tag;
import com.jpexs.decompiler.flash.tags.DefineShape3Tag;
import com.jpexs.decompiler.flash.tags.DefineShape4Tag;
import com.jpexs.decompiler.flash.tags.DefineShapeTag;
import com.jpexs.decompiler.flash.tags.DefineSoundTag;
import com.jpexs.decompiler.flash.tags.DefineSpriteTag;
import com.jpexs.decompiler.flash.tags.DefineText2Tag;
import com.jpexs.decompiler.flash.tags.DefineTextTag;
import com.jpexs.decompiler.flash.tags.DefineVideoStreamTag;
import com.jpexs.decompiler.flash.tags.DoABCDefineTag;
import com.jpexs.decompiler.flash.tags.DoABCTag;
import com.jpexs.decompiler.flash.tags.DoActionTag;
import com.jpexs.decompiler.flash.tags.DoInitActionTag;
import com.jpexs.decompiler.flash.tags.EnableDebugger2Tag;
import com.jpexs.decompiler.flash.tags.EnableDebuggerTag;
import com.jpexs.decompiler.flash.tags.EnableTelemetryTag;
import com.jpexs.decompiler.flash.tags.EndTag;
import com.jpexs.decompiler.flash.tags.ExportAssetsTag;
import com.jpexs.decompiler.flash.tags.FileAttributesTag;
import com.jpexs.decompiler.flash.tags.FrameLabelTag;
import com.jpexs.decompiler.flash.tags.ImportAssets2Tag;
import com.jpexs.decompiler.flash.tags.ImportAssetsTag;
import com.jpexs.decompiler.flash.tags.JPEGTablesTag;
import com.jpexs.decompiler.flash.tags.MetadataTag;
import com.jpexs.decompiler.flash.tags.PlaceObject2Tag;
import com.jpexs.decompiler.flash.tags.PlaceObject3Tag;
import com.jpexs.decompiler.flash.tags.PlaceObject4Tag;
import com.jpexs.decompiler.flash.tags.PlaceObjectTag;
import com.jpexs.decompiler.flash.tags.ProductInfoTag;
import com.jpexs.decompiler.flash.tags.ProtectTag;
import com.jpexs.decompiler.flash.tags.RemoveObject2Tag;
import com.jpexs.decompiler.flash.tags.RemoveObjectTag;
import com.jpexs.decompiler.flash.tags.ScriptLimitsTag;
import com.jpexs.decompiler.flash.tags.SetBackgroundColorTag;
import com.jpexs.decompiler.flash.tags.SetTabIndexTag;
import com.jpexs.decompiler.flash.tags.ShowFrameTag;
import com.jpexs.decompiler.flash.tags.SoundStreamBlockTag;
import com.jpexs.decompiler.flash.tags.SoundStreamHead2Tag;
import com.jpexs.decompiler.flash.tags.SoundStreamHeadTag;
import com.jpexs.decompiler.flash.tags.StartSound2Tag;
import com.jpexs.decompiler.flash.tags.StartSoundTag;
import com.jpexs.decompiler.flash.tags.SymbolClassTag;
import com.jpexs.decompiler.flash.tags.VideoFrameTag;
import com.jpexs.decompiler.flash.tags.gfx.DefineCompactedFont;
import com.jpexs.decompiler.flash.tags.gfx.DefineExternalGradient;
import com.jpexs.decompiler.flash.tags.gfx.DefineExternalImage;
import com.jpexs.decompiler.flash.tags.gfx.DefineExternalImage2;
import com.jpexs.decompiler.flash.tags.gfx.DefineExternalSound;
import com.jpexs.decompiler.flash.tags.gfx.DefineExternalStreamSound;
import com.jpexs.decompiler.flash.tags.gfx.DefineGradientMap;
import com.jpexs.decompiler.flash.tags.gfx.DefineSubImage;
import com.jpexs.decompiler.flash.tags.gfx.ExporterInfo;
import com.jpexs.decompiler.flash.tags.gfx.FontTextureInfo;
import java.util.HashMap;
import java.util.Map;
/**
*
* @author JPEXS
*/
public class TagIdClassMap {
private static final Map<Integer, Class> tagIdClassMap = new HashMap<>();
private static final Map<Class, Integer> classTagIdMap = new HashMap<>();
static {
addTag(CSMTextSettingsTag.ID, CSMTextSettingsTag.class);
addTag(DebugIDTag.ID, DebugIDTag.class);
addTag(DefineBinaryDataTag.ID, DefineBinaryDataTag.class);
addTag(DefineBitsJPEG2Tag.ID, DefineBitsJPEG2Tag.class);
addTag(DefineBitsJPEG3Tag.ID, DefineBitsJPEG3Tag.class);
addTag(DefineBitsJPEG4Tag.ID, DefineBitsJPEG4Tag.class);
addTag(DefineBitsLossless2Tag.ID, DefineBitsLossless2Tag.class);
addTag(DefineBitsLosslessTag.ID, DefineBitsLosslessTag.class);
addTag(DefineBitsTag.ID, DefineBitsTag.class);
addTag(DefineButton2Tag.ID, DefineButton2Tag.class);
addTag(DefineButtonCxformTag.ID, DefineButtonCxformTag.class);
addTag(DefineButtonSoundTag.ID, DefineButtonSoundTag.class);
addTag(DefineButtonTag.ID, DefineButtonTag.class);
addTag(DefineEditTextTag.ID, DefineEditTextTag.class);
addTag(DefineFont2Tag.ID, DefineFont2Tag.class);
addTag(DefineFont3Tag.ID, DefineFont3Tag.class);
addTag(DefineFont4Tag.ID, DefineFont4Tag.class);
addTag(DefineFontAlignZonesTag.ID, DefineFontAlignZonesTag.class);
addTag(DefineFontInfo2Tag.ID, DefineFontInfo2Tag.class);
addTag(DefineFontInfoTag.ID, DefineFontInfoTag.class);
addTag(DefineFontNameTag.ID, DefineFontNameTag.class);
addTag(DefineFontTag.ID, DefineFontTag.class);
addTag(DefineMorphShape2Tag.ID, DefineMorphShape2Tag.class);
addTag(DefineMorphShapeTag.ID, DefineMorphShapeTag.class);
addTag(DefineScalingGridTag.ID, DefineScalingGridTag.class);
addTag(DefineSceneAndFrameLabelDataTag.ID, DefineSceneAndFrameLabelDataTag.class);
addTag(DefineShape2Tag.ID, DefineShape2Tag.class);
addTag(DefineShape3Tag.ID, DefineShape3Tag.class);
addTag(DefineShape4Tag.ID, DefineShape4Tag.class);
addTag(DefineShapeTag.ID, DefineShapeTag.class);
addTag(DefineSoundTag.ID, DefineSoundTag.class);
addTag(DefineSpriteTag.ID, DefineSpriteTag.class);
addTag(DefineText2Tag.ID, DefineText2Tag.class);
addTag(DefineTextTag.ID, DefineTextTag.class);
addTag(DefineVideoStreamTag.ID, DefineVideoStreamTag.class);
addTag(DoABCDefineTag.ID, DoABCDefineTag.class);
addTag(DoABCTag.ID, DoABCTag.class);
addTag(DoActionTag.ID, DoActionTag.class);
addTag(DoInitActionTag.ID, DoInitActionTag.class);
addTag(EnableDebugger2Tag.ID, EnableDebugger2Tag.class);
addTag(EnableDebuggerTag.ID, EnableDebuggerTag.class);
addTag(EnableTelemetryTag.ID, EnableTelemetryTag.class);
addTag(EndTag.ID, EndTag.class);
addTag(ExportAssetsTag.ID, ExportAssetsTag.class);
addTag(FileAttributesTag.ID, FileAttributesTag.class);
addTag(FrameLabelTag.ID, FrameLabelTag.class);
addTag(ImportAssets2Tag.ID, ImportAssets2Tag.class);
addTag(ImportAssetsTag.ID, ImportAssetsTag.class);
addTag(JPEGTablesTag.ID, JPEGTablesTag.class);
addTag(MetadataTag.ID, MetadataTag.class);
addTag(PlaceObject2Tag.ID, PlaceObject2Tag.class);
addTag(PlaceObject3Tag.ID, PlaceObject3Tag.class);
addTag(PlaceObject4Tag.ID, PlaceObject4Tag.class);
addTag(PlaceObjectTag.ID, PlaceObjectTag.class);
addTag(ProductInfoTag.ID, ProductInfoTag.class);
addTag(ProtectTag.ID, ProtectTag.class);
addTag(RemoveObject2Tag.ID, RemoveObject2Tag.class);
addTag(RemoveObjectTag.ID, RemoveObjectTag.class);
addTag(ScriptLimitsTag.ID, ScriptLimitsTag.class);
addTag(SetBackgroundColorTag.ID, SetBackgroundColorTag.class);
addTag(SetTabIndexTag.ID, SetTabIndexTag.class);
addTag(ShowFrameTag.ID, ShowFrameTag.class);
addTag(SoundStreamBlockTag.ID, SoundStreamBlockTag.class);
addTag(SoundStreamHead2Tag.ID, SoundStreamHead2Tag.class);
addTag(SoundStreamHeadTag.ID, SoundStreamHeadTag.class);
addTag(StartSound2Tag.ID, StartSound2Tag.class);
addTag(StartSoundTag.ID, StartSoundTag.class);
addTag(SymbolClassTag.ID, SymbolClassTag.class);
addTag(VideoFrameTag.ID, VideoFrameTag.class);
addTag(DefineCompactedFont.ID, DefineCompactedFont.class);
addTag(DefineExternalGradient.ID, DefineExternalGradient.class);
addTag(DefineExternalImage.ID, DefineExternalImage.class);
addTag(DefineExternalImage2.ID, DefineExternalImage2.class);
addTag(DefineExternalSound.ID, DefineExternalSound.class);
addTag(DefineExternalStreamSound.ID, DefineExternalStreamSound.class);
addTag(DefineGradientMap.ID, DefineGradientMap.class);
addTag(DefineSubImage.ID, DefineSubImage.class);
addTag(ExporterInfo.ID, ExporterInfo.class);
addTag(FontTextureInfo.ID, FontTextureInfo.class);
}
private static void addTag(int tagId, Class cl) {
tagIdClassMap.put(tagId, cl);
classTagIdMap.put(cl, tagId);
}
public static Class getClassByTagId(int tagId) {
return tagIdClassMap.get(tagId);
}
public static Integer getTagIdByClass(Class cl) {
return classTagIdMap.get(cl);
}
}
@@ -25,6 +25,8 @@ import com.jpexs.decompiler.flash.gui.MainFrameRibbonMenu;
import com.jpexs.decompiler.flash.gui.MainPanel;
import com.jpexs.decompiler.flash.gui.TreeNodeType;
import com.jpexs.decompiler.flash.gui.View;
import com.jpexs.decompiler.flash.tags.CSMTextSettingsTag;
import com.jpexs.decompiler.flash.tags.DebugIDTag;
import com.jpexs.decompiler.flash.tags.DefineBinaryDataTag;
import com.jpexs.decompiler.flash.tags.DefineBitsJPEG2Tag;
import com.jpexs.decompiler.flash.tags.DefineBitsJPEG3Tag;
@@ -33,14 +35,22 @@ import com.jpexs.decompiler.flash.tags.DefineBitsLossless2Tag;
import com.jpexs.decompiler.flash.tags.DefineBitsLosslessTag;
import com.jpexs.decompiler.flash.tags.DefineBitsTag;
import com.jpexs.decompiler.flash.tags.DefineButton2Tag;
import com.jpexs.decompiler.flash.tags.DefineButtonCxformTag;
import com.jpexs.decompiler.flash.tags.DefineButtonSoundTag;
import com.jpexs.decompiler.flash.tags.DefineButtonTag;
import com.jpexs.decompiler.flash.tags.DefineEditTextTag;
import com.jpexs.decompiler.flash.tags.DefineFont2Tag;
import com.jpexs.decompiler.flash.tags.DefineFont3Tag;
import com.jpexs.decompiler.flash.tags.DefineFont4Tag;
import com.jpexs.decompiler.flash.tags.DefineFontAlignZonesTag;
import com.jpexs.decompiler.flash.tags.DefineFontInfo2Tag;
import com.jpexs.decompiler.flash.tags.DefineFontInfoTag;
import com.jpexs.decompiler.flash.tags.DefineFontNameTag;
import com.jpexs.decompiler.flash.tags.DefineFontTag;
import com.jpexs.decompiler.flash.tags.DefineMorphShape2Tag;
import com.jpexs.decompiler.flash.tags.DefineMorphShapeTag;
import com.jpexs.decompiler.flash.tags.DefineScalingGridTag;
import com.jpexs.decompiler.flash.tags.DefineSceneAndFrameLabelDataTag;
import com.jpexs.decompiler.flash.tags.DefineShape2Tag;
import com.jpexs.decompiler.flash.tags.DefineShape3Tag;
import com.jpexs.decompiler.flash.tags.DefineShape4Tag;
@@ -50,10 +60,40 @@ import com.jpexs.decompiler.flash.tags.DefineSpriteTag;
import com.jpexs.decompiler.flash.tags.DefineText2Tag;
import com.jpexs.decompiler.flash.tags.DefineTextTag;
import com.jpexs.decompiler.flash.tags.DefineVideoStreamTag;
import com.jpexs.decompiler.flash.tags.DoABCDefineTag;
import com.jpexs.decompiler.flash.tags.DoABCTag;
import com.jpexs.decompiler.flash.tags.DoActionTag;
import com.jpexs.decompiler.flash.tags.DoInitActionTag;
import com.jpexs.decompiler.flash.tags.EnableDebugger2Tag;
import com.jpexs.decompiler.flash.tags.EnableDebuggerTag;
import com.jpexs.decompiler.flash.tags.EnableTelemetryTag;
import com.jpexs.decompiler.flash.tags.ExportAssetsTag;
import com.jpexs.decompiler.flash.tags.FileAttributesTag;
import com.jpexs.decompiler.flash.tags.FrameLabelTag;
import com.jpexs.decompiler.flash.tags.ImportAssets2Tag;
import com.jpexs.decompiler.flash.tags.ImportAssetsTag;
import com.jpexs.decompiler.flash.tags.JPEGTablesTag;
import com.jpexs.decompiler.flash.tags.MetadataTag;
import com.jpexs.decompiler.flash.tags.PlaceObject2Tag;
import com.jpexs.decompiler.flash.tags.PlaceObject3Tag;
import com.jpexs.decompiler.flash.tags.PlaceObject4Tag;
import com.jpexs.decompiler.flash.tags.PlaceObjectTag;
import com.jpexs.decompiler.flash.tags.ProductInfoTag;
import com.jpexs.decompiler.flash.tags.ProtectTag;
import com.jpexs.decompiler.flash.tags.RemoveObject2Tag;
import com.jpexs.decompiler.flash.tags.RemoveObjectTag;
import com.jpexs.decompiler.flash.tags.ScriptLimitsTag;
import com.jpexs.decompiler.flash.tags.SetBackgroundColorTag;
import com.jpexs.decompiler.flash.tags.SetTabIndexTag;
import com.jpexs.decompiler.flash.tags.ShowFrameTag;
import com.jpexs.decompiler.flash.tags.SoundStreamBlockTag;
import com.jpexs.decompiler.flash.tags.SoundStreamHead2Tag;
import com.jpexs.decompiler.flash.tags.SoundStreamHeadTag;
import com.jpexs.decompiler.flash.tags.StartSound2Tag;
import com.jpexs.decompiler.flash.tags.StartSoundTag;
import com.jpexs.decompiler.flash.tags.SymbolClassTag;
import com.jpexs.decompiler.flash.tags.Tag;
import com.jpexs.decompiler.flash.tags.VideoFrameTag;
import com.jpexs.decompiler.flash.tags.base.ASMSource;
import com.jpexs.decompiler.flash.tags.base.ButtonTag;
import com.jpexs.decompiler.flash.tags.base.CharacterIdTag;
@@ -69,6 +109,7 @@ import com.jpexs.decompiler.flash.timeline.AS3Package;
import com.jpexs.decompiler.flash.timeline.Frame;
import com.jpexs.decompiler.flash.timeline.FrameScript;
import com.jpexs.decompiler.flash.timeline.TagScript;
import com.jpexs.decompiler.flash.timeline.Timelined;
import com.jpexs.decompiler.flash.treeitems.AS3ClassTreeItem;
import com.jpexs.decompiler.flash.treeitems.FolderItem;
import com.jpexs.decompiler.flash.treeitems.HeaderItem;
@@ -308,66 +349,69 @@ public class TagTree extends JTree implements ActionListener {
return TreeNodeType.FOLDER;
}
public List<Class> getTreeItemClasses(String folderName, boolean gfx) {
List<Class> ret = null;
public List<Integer> getSwfFolderItemNestedTagIds(String folderName, boolean gfx) {
List<Integer> ret = null;
switch (folderName) {
case TagTreeModel.FOLDER_SHAPES:
ret = Arrays.asList((Class) DefineShapeTag.class, DefineShape2Tag.class, DefineShape3Tag.class, DefineShape4Tag.class);
ret = Arrays.asList(DefineShapeTag.ID, DefineShape2Tag.ID, DefineShape3Tag.ID, DefineShape4Tag.ID);
break;
case TagTreeModel.FOLDER_MORPHSHAPES:
ret = Arrays.asList((Class) DefineMorphShapeTag.class, DefineMorphShape2Tag.class);
ret = Arrays.asList(DefineMorphShapeTag.ID, DefineMorphShape2Tag.ID);
break;
case TagTreeModel.FOLDER_SPRITES:
ret = Arrays.asList((Class) DefineSpriteTag.class);
ret = Arrays.asList(DefineSpriteTag.ID);
break;
case TagTreeModel.FOLDER_TEXTS:
ret = Arrays.asList((Class) DefineTextTag.class, DefineText2Tag.class, DefineEditTextTag.class);
ret = Arrays.asList(DefineTextTag.ID, DefineText2Tag.ID, DefineEditTextTag.ID);
break;
case TagTreeModel.FOLDER_IMAGES:
ret = Arrays.asList((Class) DefineBitsTag.class, DefineBitsJPEG2Tag.class, DefineBitsJPEG3Tag.class, DefineBitsJPEG4Tag.class, DefineBitsLosslessTag.class, DefineBitsLossless2Tag.class);
ret = Arrays.asList(DefineBitsTag.ID, DefineBitsJPEG2Tag.ID, DefineBitsJPEG3Tag.ID, DefineBitsJPEG4Tag.ID, DefineBitsLosslessTag.ID, DefineBitsLossless2Tag.ID);
break;
case TagTreeModel.FOLDER_MOVIES:
ret = Arrays.asList((Class) DefineVideoStreamTag.class);
ret = Arrays.asList(DefineVideoStreamTag.ID);
break;
case TagTreeModel.FOLDER_SOUNDS:
ret = Arrays.asList((Class) DefineSoundTag.class, SoundStreamHeadTag.class, SoundStreamHead2Tag.class);
ret = Arrays.asList(DefineSoundTag.ID);
break;
case TagTreeModel.FOLDER_BUTTONS:
ret = Arrays.asList((Class) DefineButtonTag.class, DefineButton2Tag.class);
ret = Arrays.asList(DefineButtonTag.ID, DefineButton2Tag.ID);
break;
case TagTreeModel.FOLDER_FONTS:
ret = Arrays.asList((Class) DefineFontTag.class, DefineFont2Tag.class, DefineFont3Tag.class, DefineFont4Tag.class);
ret = Arrays.asList(DefineFontTag.ID, DefineFont2Tag.ID, DefineFont3Tag.ID, DefineFont4Tag.ID);
if (gfx) {
ret.add(DefineCompactedFont.class);
ret.add(DefineCompactedFont.ID);
}
break;
case TagTreeModel.FOLDER_BINARY_DATA:
ret = Arrays.asList((Class) DefineBinaryDataTag.class);
ret = Arrays.asList(DefineBinaryDataTag.ID);
break;
case TagTreeModel.FOLDER_FRAMES:
ret = new ArrayList<>();
break;
case TagTreeModel.FOLDER_OTHERS:
ret = new ArrayList<>();
ret = Arrays.asList(CSMTextSettingsTag.ID, DebugIDTag.ID, DefineButtonCxformTag.ID, DefineButtonSoundTag.ID,
DefineFontAlignZonesTag.ID, DefineFontInfoTag.ID, DefineFontInfo2Tag.ID, DefineFontNameTag.ID,
DefineScalingGridTag.ID, DefineSceneAndFrameLabelDataTag.ID,
DoABCDefineTag.ID, DoABCTag.ID, DoActionTag.ID, DoInitActionTag.ID,
EnableDebuggerTag.ID, EnableDebugger2Tag.ID, EnableTelemetryTag.ID,
ExportAssetsTag.ID, FileAttributesTag.ID, ImportAssetsTag.ID, ImportAssets2Tag.ID,
JPEGTablesTag.ID, MetadataTag.ID, ProductInfoTag.ID, ProtectTag.ID, ScriptLimitsTag.ID,
SetBackgroundColorTag.ID, SetTabIndexTag.ID, SymbolClassTag.ID);
break;
}
return ret;
}
JMenuItem expandRecursiveMenuItem;
JMenuItem removeMenuItem;
JMenuItem removeWithDependenciesMenuItem;
JMenuItem exportSelectionMenuItem;
JMenuItem replaceSelectionMenuItem;
JMenuItem rawEditMenuItem;
JMenuItem jumpToCharacterMenuItem;
JMenuItem closeSelectionMenuItem;
JMenu addTagMenu;
JMenu moveTagMenu;
JMenuItem openSWFInsideTagMenuItem;
public JPopupMenu contextPopupMenu;
public List<SWFList> swfs;
public List<Integer> 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);
}
public void createContextMenu(final List<SWFList> swfs) {
final JPopupMenu contextPopupMenu = new JPopupMenu();
public void createContextMenu(final List<SWFList> swfs) {
this.swfs = swfs;
@@ -457,6 +501,108 @@ public class TagTree extends JTree implements ActionListener {
openSWFInsideTagMenuItem.setVisible(false);
if (paths.length == 1) {
final TreeItem item = (TreeItem) paths[0].getLastPathComponent();
if (item instanceof ImageTag && ((ImageTag) item).importSupported()) {
replaceSelectionMenuItem.setVisible(true);
}
if (item instanceof DefineBinaryDataTag) {
replaceSelectionMenuItem.setVisible(true);
DefineBinaryDataTag bin = (DefineBinaryDataTag) item;
if (bin.binaryData.length > 8) {
String signature = new String(bin.binaryData, 0, 3, Utf8Helper.charset);
if (Arrays.asList(
"FWS", //Uncompressed Flash
"CWS", //ZLib compressed Flash
"ZWS", //LZMA compressed Flash
"GFX", //Uncompressed ScaleForm GFx
"CFX" //Compressed ScaleForm GFx
).contains(signature)) {
openSWFInsideTagMenuItem.setVisible(true);
}
}
}
if (item instanceof DefineSoundTag) {
replaceSelectionMenuItem.setVisible(true);
}
if (item instanceof SWF) {
closeSelectionMenuItem.setVisible(true);
}
List<Integer> allowedTagTypes = null;
if (item instanceof FolderItem) {
allowedTagTypes = getSwfFolderItemNestedTagIds(((FolderItem) item).getName(), item.getSwf().gfx);
} else if (item instanceof DefineSpriteTag) {
allowedTagTypes = getSpriteNestedTagIds();
}
addTagMenu.removeAll();
if (allowedTagTypes != null) {
for (Integer tagId : allowedTagTypes) {
final Class cl = TagIdClassMap.getClassByTagId(tagId);
JMenuItem tagItem = new JMenuItem(cl.getSimpleName());
tagItem.addActionListener(new ActionListener() {
@Override
@SuppressWarnings("unchecked")
public void actionPerformed(ActionEvent ae) {
try {
SWF swf = item.getSwf();
Tag t = (Tag) cl.getDeclaredConstructor(SWF.class).newInstance(new Object[]{swf});
boolean isDefineSprite = item instanceof DefineSpriteTag;
Timelined timelined = isDefineSprite ? (DefineSpriteTag) item : swf;
t.setTimelined(timelined);
if (isDefineSprite) {
((DefineSpriteTag) item).subTags.add(t);
} else {
swf.tags.add(t);
}
timelined.getTimeline().reset();
swf.updateCharacters();
mainPanel.refreshTree();
} catch (InstantiationException | IllegalAccessException | NoSuchMethodException | SecurityException | IllegalArgumentException | InvocationTargetException ex) {
Logger.getLogger(TagTree.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
addTagMenu.add(tagItem);
}
addTagMenu.setVisible(true);
}
if (item instanceof Tag && swfs.size() > 1) {
final Tag tag = (Tag) item;
moveTagMenu.removeAll();
for (SWFList targetSwfList : swfs) {
for (final SWF targetSwf : targetSwfList) {
if (targetSwf != tag.getSwf()) {
JMenuItem swfItem = new JMenuItem(targetSwf.getShortFileName());
swfItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
tag.getSwf().tags.remove(tag);
tag.setSwf(targetSwf);
targetSwf.tags.add(tag);
mainPanel.refreshTree();
}
});
moveTagMenu.add(swfItem);
}
}
}
moveTagMenu.setVisible(true);
}
TreeModel model = getModel();
expandRecursiveMenuItem.setVisible(model.getChildCount(item) > 0);
jumpToCharacterMenuItem.setVisible(item instanceof CharacterIdTag && !(item instanceof CharacterTag));
rawEditMenuItem.setVisible(item instanceof Tag);
TreeItem item = (TreeItem) paths[0].getLastPathComponent();
List<TreeItem> li = new ArrayList<>();
li.add(item);