Tag preview in dump view

This commit is contained in:
Jindra Petřík
2016-01-24 09:12:23 +01:00
parent b9cb48c5e2
commit ea0a2d5569
9 changed files with 242 additions and 108 deletions

View File

@@ -305,6 +305,10 @@ public class Configuration {
@ConfigurationName("gui.timeLineSplitPane.dividerLocationPercent")
public static final ConfigurationItem<Double> guiTimeLineSplitPaneDividerLocationPercent = null;
@ConfigurationDefaultDouble(0.6)
@ConfigurationName("gui.dump.splitPane.dividerLocationPercent")
public static final ConfigurationItem<Double> guiDumpSplitPaneDividerLocationPercent = null;
@ConfigurationDefaultString("com.jpexs.decompiler.flash.gui.OceanicSkin")
@ConfigurationName("gui.skin")
@ConfigurationCategory("ui")

View File

@@ -16,11 +16,16 @@
*/
package com.jpexs.decompiler.flash.dumpview;
import com.jpexs.decompiler.flash.SWFInputStream;
import com.jpexs.decompiler.flash.tags.Tag;
import com.jpexs.decompiler.flash.tags.TagStub;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
@@ -34,6 +39,8 @@ public class DumpInfo {
public TagStub tagToResolve = null;
public Tag resolvedTag = null;
public Object previewValue;
public long startByte;
@@ -117,4 +124,25 @@ public class DumpInfo {
String value = previewValue == null ? "" : previewValue.toString();
return name + " (" + type + ")" + (value.isEmpty() ? "" : " = " + value);
}
public void resolveTag() {
if (tagToResolve != null) {
TagStub tagStub = tagToResolve;
try {
SWFInputStream sis = tagStub.getDataStream();
sis.seek(tagStub.getDataPos());
sis.dumpInfo = this;
resolvedTag = SWFInputStream.resolveTag(tagStub, 0, false, true, false);
} catch (InterruptedException | IOException ex) {
Logger.getLogger(DumpInfo.class.getName()).log(Level.SEVERE, null, ex);
}
tagToResolve = null;
}
}
public Tag getTag() {
resolveTag();
return resolvedTag;
}
}

View File

@@ -44,8 +44,11 @@ public final class MainFrameClassic extends AppFrame implements MainFrame {
super();
FlashPlayerPanel flashPanel = null;
FlashPlayerPanel flashPanel2 = null;
try {
flashPanel = new FlashPlayerPanel(this);
flashPanel2 = new FlashPlayerPanel(this);
} catch (FlashUnsupportedException fue) {
}
@@ -53,7 +56,7 @@ public final class MainFrameClassic extends AppFrame implements MainFrame {
mainMenu = new MainFrameClassicMenu(this, externalFlashPlayerUnavailable);
mainMenu.createMenuBar();
panel = new MainPanel(this, mainMenu, flashPanel);
panel = new MainPanel(this, mainMenu, flashPanel, flashPanel2);
int w = Configuration.guiWindowWidth.get();
int h = Configuration.guiWindowHeight.get();

View File

@@ -51,8 +51,11 @@ public final class MainFrameRibbon extends AppRibbonFrame {
super();
FlashPlayerPanel flashPanel = null;
FlashPlayerPanel flashPanel2 = null;
try {
flashPanel = new FlashPlayerPanel(this);
flashPanel2 = new FlashPlayerPanel(this);
} catch (FlashUnsupportedException fue) {
}
@@ -65,7 +68,7 @@ public final class MainFrameRibbon extends AppRibbonFrame {
mainMenu = new MainFrameRibbonMenu(this, ribbon, externalFlashPlayerUnavailable);
mainMenu.createMenuBar();
panel = new MainPanel(this, mainMenu, flashPanel);
panel = new MainPanel(this, mainMenu, flashPanel, flashPanel2);
panel.setBackground(Color.yellow);
cnt.add(panel, BorderLayout.CENTER);

View File

@@ -200,6 +200,7 @@ import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
@@ -248,6 +249,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
public DumpTree dumpTree;
private final FlashPlayerPanel flashPanel;
private final FlashPlayerPanel flashPanel2;
private final JPanel contentPanel;
@@ -283,6 +285,10 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
private static final String TIMELINE_PANEL = "TIMELINEPANEL";
private static final String RESOURCES_VIEW = "RESOURCES";
private static final String DUMP_VIEW = "DUMP";
private static final String TIMELINE_VIEW = "TIMELINE";
private final JPersistentSplitPane splitPane1;
private final JPersistentSplitPane splitPane2;
@@ -304,6 +310,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
private DumpViewPanel dumpViewPanel;
private final JPanel treePanel;
private final PreviewPanel dumpPreviewPanel;
private final TagInfoPanel tagInfoPanel;
@@ -425,12 +432,13 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
return mainFrame.translate(key);
}
public MainPanel(MainFrame mainFrame, MainFrameMenu mainMenu, FlashPlayerPanel flashPanel) {
public MainPanel(MainFrame mainFrame, MainFrameMenu mainMenu, FlashPlayerPanel flashPanel, FlashPlayerPanel previewFlashPanel) {
super();
this.mainFrame = mainFrame;
this.mainMenu = mainMenu;
this.flashPanel = flashPanel;
this.flashPanel2 = previewFlashPanel;
mainFrame.setTitle(ApplicationInfo.applicationVerName);
@@ -638,6 +646,10 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
DefaultSyntaxKit.initKit();
previewPanel = new PreviewPanel(this, flashPanel);
dumpPreviewPanel = new PreviewPanel(this, previewFlashPanel);
dumpPreviewPanel.setReadOnly(true);
displayPanel.add(previewPanel, CARDPREVIEWPANEL);
displayPanel.add(createFolderPreviewCard(), CARDFOLDERPREVIEWPANEL);
displayPanel.add(createDumpPreviewCard(), CARDDUMPVIEW);
@@ -660,11 +672,11 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
}
});
searchPanel.add(closeSearchButton, BorderLayout.EAST);
treePanel = new JPanel(new BorderLayout());
treePanel.add(searchPanel, BorderLayout.SOUTH);
searchPanel.setVisible(false);
treePanel = new JPanel(new CardLayout());
treePanel.add(createResourcesViewCard(), RESOURCES_VIEW);
treePanel.add(createDumpViewCard(), DUMP_VIEW);
//treePanel.add(searchPanel, BorderLayout.SOUTH);
//searchPanel.setVisible(false);
filterField.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void changedUpdate(DocumentEvent e) {
@@ -2829,10 +2841,23 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
Object source = e.getSource();
if (source == dumpTree) {
reload(false);
Object sel = e.getPath().getLastPathComponent();
if (sel instanceof DumpInfo) {
DumpInfo di = (DumpInfo) sel;
Tag t = di.getTag();
if (t != null) {
showPreview(t, dumpPreviewPanel);
} else {
showPreview(null, dumpPreviewPanel);
}
} else {
showPreview(null, dumpPreviewPanel);
}
return;
}
TreeItem treeItem = (TreeItem) e.getPath().getLastPathComponent();
if (!(treeItem instanceof SWFList)) {
SWF swf = treeItem.getSwf();
if (swfs.isEmpty()) {
@@ -2860,6 +2885,13 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
// ignore
}
}
if (flashPanel2 != null) {
try {
flashPanel2.close();
} catch (IOException ex) {
// ignore
}
}
}
public void clearDebuggerColors() {
@@ -2879,6 +2911,11 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
flashPanel.stopSWF();
}
}
if (flashPanel2 != null) {
if (!flashPanel2.isStopped()) {
flashPanel2.stopSWF();
}
}
}
public boolean isInternalFlashViewerSelected() {
@@ -2914,29 +2951,41 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
}
}
private JPanel createDumpViewCard() {
JPanel r = new JPanel(new BorderLayout());
r.add(new JPersistentSplitPane(JSplitPane.VERTICAL_SPLIT, new JScrollPane(dumpTree), dumpPreviewPanel, Configuration.guiDumpSplitPaneDividerLocationPercent), BorderLayout.CENTER);
return r;
}
private JPanel createResourcesViewCard() {
JPanel r = new JPanel(new BorderLayout());
r.add(new JScrollPane(tagTree), BorderLayout.CENTER);
r.add(searchPanel, BorderLayout.SOUTH);
return r;
}
public boolean showView(int view) {
CardLayout cl = (CardLayout) (contentPanel.getLayout());
CardLayout cl2 = (CardLayout) (treePanel.getLayout());
setTreeModel(view);
switch (view) {
case VIEW_DUMP:
if (!isWelcomeScreen) {
cl.show(contentPanel, SPLIT_PANE1);
}
treePanel.removeAll();
treePanel.add(new JScrollPane(dumpTree), BorderLayout.CENTER);
cl2.show(treePanel, DUMP_VIEW);
treePanelMode = TreePanelMode.DUMP_TREE;
showDetail(DETAILCARDEMPTYPANEL);
reload(true);
treePanel.revalidate();
return true;
case VIEW_RESOURCES:
if (!isWelcomeScreen) {
cl.show(contentPanel, SPLIT_PANE1);
}
treePanel.removeAll();
treePanel.add(new JScrollPane(tagTree), BorderLayout.CENTER);
treePanel.add(searchPanel, BorderLayout.SOUTH);
cl2.show(treePanel, RESOURCES_VIEW);
treePanelMode = TreePanelMode.TAG_TREE;
treePanel.addComponentListener(new ComponentAdapter() {
@@ -2949,7 +2998,6 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
});
reload(true);
treePanel.revalidate();
return true;
case VIEW_TIMELINE:
final SWF swf = getCurrentSwf();
@@ -3040,6 +3088,85 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
previewPanel.closeTag();
}
public void showPreview(TreeItem treeItem, PreviewPanel previewPanel) {
if (treeItem == null) {
previewPanel.showEmpty();
return;
}
boolean internalViewer = isInternalFlashViewerSelected();
if (treeItem instanceof SWF) {
SWF swf = (SWF) treeItem;
if (internalViewer) {
previewPanel.showImagePanel(swf, swf, -1);
} else {
previewPanel.setParametersPanelVisible(false);
if (flashPanel != null) { //same for flashPanel2
previewPanel.showFlashViewerPanel();
previewPanel.showSwf(swf);
}
}
} else if (treeItem instanceof MetadataTag) {
MetadataTag metadataTag = (MetadataTag) treeItem;
previewPanel.showMetaDataPanel(metadataTag);
} else if (treeItem instanceof DefineBinaryDataTag) {
DefineBinaryDataTag binaryTag = (DefineBinaryDataTag) treeItem;
previewPanel.showBinaryPanel(binaryTag);
} else if (treeItem instanceof ImageTag) {
ImageTag imageTag = (ImageTag) treeItem;
previewPanel.setImageReplaceButtonVisible(!((Tag) imageTag).isReadOnly() && imageTag.importSupported(), imageTag instanceof DefineBitsJPEG3Tag || imageTag instanceof DefineBitsJPEG4Tag);
previewPanel.showImagePanel(imageTag.getImage());
} else if ((treeItem instanceof DrawableTag) && (!(treeItem instanceof TextTag)) && (!(treeItem instanceof FontTag)) && internalViewer) {
final Tag tag = (Tag) treeItem;
DrawableTag d = (DrawableTag) tag;
Timelined timelined;
if (treeItem instanceof Timelined && !(treeItem instanceof ButtonTag)) {
timelined = (Timelined) tag;
} else {
timelined = makeTimelined(tag);
}
previewPanel.setParametersPanelVisible(false);
previewPanel.showImagePanel(timelined, tag.getSwf(), -1);
} else if (treeItem instanceof Frame && internalViewer) {
Frame fn = (Frame) treeItem;
SWF swf = fn.getSwf();
Timelined timelined = swf;
if (fn.timeline.timelined instanceof DefineSpriteTag) {
DefineSpriteTag parentSprite = (DefineSpriteTag) fn.timeline.timelined;
timelined = parentSprite;
}
previewPanel.showImagePanel(timelined, swf, fn.frame);
} else if ((treeItem instanceof SoundTag)) { //&& isInternalFlashViewerSelected() && (Arrays.asList("mp3", "wav").contains(((SoundTag) tagObj).getExportFormat())))) {
previewPanel.showImagePanel(new SerializableImage(View.loadImage("sound32")));
previewPanel.setImageReplaceButtonVisible(((Tag) treeItem).isReadOnly() && (treeItem instanceof DefineSoundTag), false);
try {
SoundTagPlayer soundThread = new SoundTagPlayer((SoundTag) treeItem, Configuration.loopMedia.get() ? Integer.MAX_VALUE : 1, true);
previewPanel.setMedia(soundThread);
} catch (LineUnavailableException | IOException | UnsupportedAudioFileException ex) {
logger.log(Level.SEVERE, null, ex);
}
} else if ((treeItem instanceof FontTag) && internalViewer) {
previewPanel.showFontPanel((FontTag) treeItem);
} else if ((treeItem instanceof TextTag) && internalViewer) {
previewPanel.showTextPanel((TextTag) treeItem);
} else if ((treeItem instanceof Frame) || (treeItem instanceof CharacterTag) || (treeItem instanceof FontTag) || (treeItem instanceof SoundStreamHeadTypeTag)) {
previewPanel.createAndShowTempSwf(treeItem);
if (treeItem instanceof TextTag) {
previewPanel.showTextPanel((TextTag) treeItem);
} else if (treeItem instanceof FontTag) {
previewPanel.showFontPanel((FontTag) treeItem);
} else {
previewPanel.setParametersPanelVisible(false);
}
} else {
previewPanel.showEmpty();
}
}
public void reload(boolean forceReload) {
tagTree.scrollPathToVisible(tagTree.getSelectionPath());
if (Configuration.dumpView.get()) {
@@ -3163,83 +3290,37 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
} else if (treeItem instanceof FolderItem) {
showFolderPreview((FolderItem) treeItem);
} else if (treeItem instanceof SWF) {
SWF swf = (SWF) treeItem;
if (internalViewer) {
previewPanel.showImagePanel(swf, swf, -1);
} else {
previewPanel.setParametersPanelVisible(false);
if (flashPanel != null) {
previewPanel.showFlashViewerPanel();
previewPanel.showSwf(swf);
}
}
showPreview(treeItem, previewPanel);
showCard(CARDPREVIEWPANEL);
} else if (treeItem instanceof MetadataTag) {
MetadataTag metadataTag = (MetadataTag) treeItem;
previewPanel.showMetaDataPanel(metadataTag);
showPreview(treeItem, previewPanel);
showCard(CARDPREVIEWPANEL);
} else if (treeItem instanceof DefineBinaryDataTag) {
DefineBinaryDataTag binaryTag = (DefineBinaryDataTag) treeItem;
previewPanel.showBinaryPanel(binaryTag);
showPreview(treeItem, previewPanel);
showCard(CARDPREVIEWPANEL);
} else if (treeItem instanceof ASMSource && (!(treeItem instanceof DrawableTag) || preferScript)) {
getActionPanel().setSource((ASMSource) treeItem, !forceReload);
showCard(CARDACTIONSCRIPTPANEL);
} else if (treeItem instanceof ImageTag) {
ImageTag imageTag = (ImageTag) treeItem;
previewPanel.setImageReplaceButtonVisible(!((Tag) imageTag).isReadOnly() && imageTag.importSupported(), imageTag instanceof DefineBitsJPEG3Tag || imageTag instanceof DefineBitsJPEG4Tag);
previewPanel.showImagePanel(imageTag.getImage());
showPreview(treeItem, previewPanel);
showCard(CARDPREVIEWPANEL);
} else if ((treeItem instanceof DrawableTag) && (!(treeItem instanceof TextTag)) && (!(treeItem instanceof FontTag)) && internalViewer) {
final Tag tag = (Tag) treeItem;
DrawableTag d = (DrawableTag) tag;
Timelined timelined;
if (treeItem instanceof Timelined && !(treeItem instanceof ButtonTag)) {
timelined = (Timelined) tag;
} else {
timelined = makeTimelined(tag);
}
previewPanel.setParametersPanelVisible(false);
previewPanel.showImagePanel(timelined, tag.getSwf(), -1);
showPreview(treeItem, previewPanel);
showCard(CARDPREVIEWPANEL);
} else if ((treeItem instanceof FontTag) && internalViewer) {
showFontTag((FontTag) treeItem);
} else if ((treeItem instanceof TextTag) && internalViewer) {
showTextTag((TextTag) treeItem);
} else if (treeItem instanceof Frame && internalViewer) {
Frame fn = (Frame) treeItem;
SWF swf = fn.getSwf();
Timelined timelined = swf;
if (fn.timeline.timelined instanceof DefineSpriteTag) {
DefineSpriteTag parentSprite = (DefineSpriteTag) fn.timeline.timelined;
timelined = parentSprite;
}
previewPanel.showImagePanel(timelined, swf, fn.frame);
showPreview(treeItem, previewPanel);
showCard(CARDPREVIEWPANEL);
} else if ((treeItem instanceof SoundTag)) { //&& isInternalFlashViewerSelected() && (Arrays.asList("mp3", "wav").contains(((SoundTag) tagObj).getExportFormat())))) {
previewPanel.showImagePanel(new SerializableImage(View.loadImage("sound32")));
previewPanel.setImageReplaceButtonVisible(((Tag) treeItem).isReadOnly() && (treeItem instanceof DefineSoundTag), false);
try {
SoundTagPlayer soundThread = new SoundTagPlayer((SoundTag) treeItem, Configuration.loopMedia.get() ? Integer.MAX_VALUE : 1, true);
previewPanel.setMedia(soundThread);
} catch (LineUnavailableException | IOException | UnsupportedAudioFileException ex) {
logger.log(Level.SEVERE, null, ex);
}
} else if ((treeItem instanceof TextTag) && internalViewer) {
showPreview(treeItem, previewPanel);
showCard(CARDPREVIEWPANEL);
} else if (treeItem instanceof Frame && internalViewer) {
showPreview(treeItem, previewPanel);
showCard(CARDPREVIEWPANEL);
} else if ((treeItem instanceof SoundTag)) { //&& isInternalFlashViewerSelected() && (Arrays.asList("mp3", "wav").contains(((SoundTag) tagObj).getExportFormat())))) {
showPreview(treeItem, previewPanel);
showCard(CARDPREVIEWPANEL);
} else if ((treeItem instanceof Frame) || (treeItem instanceof CharacterTag) || (treeItem instanceof FontTag) || (treeItem instanceof SoundStreamHeadTypeTag)) {
previewPanel.createAndShowTempSwf(treeItem);
if (treeItem instanceof TextTag) {
showTextTag((TextTag) treeItem);
} else if (treeItem instanceof FontTag) {
showFontTag((FontTag) treeItem);
} else {
previewPanel.setParametersPanelVisible(false);
}
showPreview(treeItem, previewPanel);
showCard(CARDPREVIEWPANEL);
} else if (treeItem instanceof Tag) {
@@ -3259,18 +3340,6 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
showCard(CARDPREVIEWPANEL);
}
private void showFontTag(FontTag ft) {
previewPanel.showFontPanel(ft);
showCard(CARDPREVIEWPANEL);
}
private void showTextTag(TextTag textTag) {
previewPanel.showTextPanel(textTag);
showCard(CARDPREVIEWPANEL);
}
public void showTextTagWithNewValue(TextTag textTag, TextTag newTextTag) {
previewPanel.showTextComparePanel(textTag, newTextTag);

View File

@@ -128,6 +128,8 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel
private static final String METADATA_TAG_CARD = "METADATATAG";
private static final String EMPTY_CARD = "EMPTY";
private static final String CARDTEXTPANEL = "Text card";
private static final String CARDFONTPANEL = "Font card";
@@ -190,6 +192,15 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel
private MetadataTag metadataTag;
private boolean readOnly = false;
public void setReadOnly(boolean readOnly) {
this.readOnly = readOnly;
if (readOnly) {
parametersPanel.setVisible(false);
}
}
public PreviewPanel(MainPanel mainPanel, FlashPlayerPanel flashPanel) {
super(JSplitPane.HORIZONTAL_SPLIT, Configuration.guiPreviewSplitPaneDividerLocationPercent);
this.mainPanel = mainPanel;
@@ -203,6 +214,7 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel
viewerCards.add(createBinaryCard(), BINARY_TAG_CARD);
viewerCards.add(createMetadataCard(), METADATA_TAG_CARD);
viewerCards.add(createGenericTagCard(), GENERIC_TAG_CARD);
viewerCards.add(createEmptyCard(), EMPTY_CARD);
setLeftComponent(viewerCards);
createParametersPanel();
@@ -210,6 +222,12 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel
showCardLeft(FLASH_VIEWER_CARD);
}
private JPanel createEmptyCard() {
JPanel ret = new JPanel();
ret.add(new JLabel("-"));
return ret;
}
private void createParametersPanel() {
displayWithPreview = new JPanel(new CardLayout());
@@ -398,10 +416,10 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel
private void updateMetadataButtonsVisibility() {
boolean edit = metadataEditor.isEditable();
boolean editorMode = Configuration.editorMode.get();
metadataEditButton.setVisible(!edit);
metadataSaveButton.setVisible(edit);
metadataEditButton.setVisible(!readOnly && !edit);
metadataSaveButton.setVisible(!readOnly && edit);
boolean metadataModified = isMetadataModified();
metadataCancelButton.setVisible(edit);
metadataCancelButton.setVisible(!readOnly && edit);
metadataCancelButton.setEnabled(metadataModified || !editorMode);
}
@@ -472,7 +490,9 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel
showFontPage(fontTag);
showCardRight(CARDFONTPANEL);
parametersPanel.setVisible(true);
if (!readOnly) {
parametersPanel.setVisible(true);
}
fontPanel.showFontTag(fontTag);
int pageCount = getFontPageCount(fontTag);
@@ -496,13 +516,19 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel
return pageCount;
}
public void showEmpty() {
showCardLeft(EMPTY_CARD);
}
public void showTextPanel(TextTag textTag) {
if (mainPanel.isInternalFlashViewerSelected() /*|| ft instanceof GFxDefineCompactedFont*/) {
showImagePanel(MainPanel.makeTimelined(textTag), textTag.getSwf(), 0);
}
showCardRight(CARDTEXTPANEL);
parametersPanel.setVisible(true);
if (!readOnly) {
parametersPanel.setVisible(true);
}
textPanel.setText(textTag);
}
@@ -554,7 +580,7 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel
public void showMetaDataPanel(MetadataTag metadataTag) {
showCardLeft(METADATA_TAG_CARD);
this.metadataTag = metadataTag;
metadataEditor.setEditable(Configuration.editorMode.get());
metadataEditor.setEditable(!readOnly && !metadataTag.isReadOnly() && Configuration.editorMode.get());
metadataEditor.setText(formatMetadata(metadataTag.xmlMetadata, 4));
setMetadataModified(false);
updateMetadataButtonsVisibility();
@@ -577,6 +603,10 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel
}
public void setImageReplaceButtonVisible(boolean show, boolean showAlpha) {
if (readOnly) {
show = false;
showAlpha = false;
}
replaceImageButton.setVisible(show);
replaceImageAlphaButton.setVisible(showAlpha);
prevFontsButton.setVisible(false);

View File

@@ -19,6 +19,7 @@ package com.jpexs.decompiler.flash.gui.dumpview;
import com.jpexs.decompiler.flash.SWF;
import com.jpexs.decompiler.flash.SWFInputStream;
import com.jpexs.decompiler.flash.dumpview.DumpInfo;
import com.jpexs.decompiler.flash.tags.Tag;
import com.jpexs.decompiler.flash.tags.TagStub;
import com.jpexs.decompiler.flash.treeitems.SWFList;
import java.io.IOException;
@@ -112,18 +113,7 @@ public final class DumpTreeModel implements TreeModel {
@Override
public int getChildCount(Object o) {
DumpInfo di = (DumpInfo) o;
if (di.tagToResolve != null) {
TagStub tagStub = di.tagToResolve;
try {
SWFInputStream sis = tagStub.getDataStream();
sis.seek(tagStub.getDataPos());
sis.dumpInfo = di;
SWFInputStream.resolveTag(tagStub, 0, false, true, false);
} catch (InterruptedException | IOException ex) {
Logger.getLogger(DumpTreeModel.class.getName()).log(Level.SEVERE, null, ex);
}
di.tagToResolve = null;
}
di.resolveTag();
return di.getChildCount();
}

View File

@@ -18,6 +18,8 @@ package com.jpexs.decompiler.flash.gui.dumpview;
import com.jpexs.decompiler.flash.dumpview.DumpInfo;
import com.jpexs.decompiler.flash.dumpview.DumpInfoSwfNode;
import com.jpexs.decompiler.flash.gui.Main;
import com.jpexs.decompiler.flash.gui.PreviewPanel;
import com.jpexs.decompiler.flash.gui.hexview.HexView;
import com.jpexs.decompiler.flash.gui.hexview.HexViewListener;
import com.jpexs.helpers.Helper;

View File

@@ -57,6 +57,8 @@ public final class FlashPlayerPanel extends Panel implements Closeable, MediaDis
private boolean stopped = true;
private boolean closed = false;
private float frameRate;
@Override
@@ -197,7 +199,9 @@ public final class FlashPlayerPanel extends Panel implements Closeable, MediaDis
@Override
public void run() {
if (closed) {
return;
}
try {
ShockwaveFlash flash1 = flash;
@@ -308,8 +312,9 @@ public final class FlashPlayerPanel extends Panel implements Closeable, MediaDis
}
@Override
public void close() throws IOException {
public synchronized void close() throws IOException {
timer.cancel();
closed = true;
}
@Override