diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java index e1e587663..5bb919c9e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java @@ -305,6 +305,10 @@ public class Configuration { @ConfigurationName("gui.timeLineSplitPane.dividerLocationPercent") public static final ConfigurationItem guiTimeLineSplitPaneDividerLocationPercent = null; + @ConfigurationDefaultDouble(0.6) + @ConfigurationName("gui.dump.splitPane.dividerLocationPercent") + public static final ConfigurationItem guiDumpSplitPaneDividerLocationPercent = null; + @ConfigurationDefaultString("com.jpexs.decompiler.flash.gui.OceanicSkin") @ConfigurationName("gui.skin") @ConfigurationCategory("ui") diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/dumpview/DumpInfo.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/dumpview/DumpInfo.java index 0c18e3f96..4eaf28ebf 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/dumpview/DumpInfo.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/dumpview/DumpInfo.java @@ -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; + } + } diff --git a/src/com/jpexs/decompiler/flash/gui/MainFrameClassic.java b/src/com/jpexs/decompiler/flash/gui/MainFrameClassic.java index 479eb4043..e3151e4f0 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainFrameClassic.java +++ b/src/com/jpexs/decompiler/flash/gui/MainFrameClassic.java @@ -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(); diff --git a/src/com/jpexs/decompiler/flash/gui/MainFrameRibbon.java b/src/com/jpexs/decompiler/flash/gui/MainFrameRibbon.java index fb010b285..a0956cffa 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainFrameRibbon.java +++ b/src/com/jpexs/decompiler/flash/gui/MainFrameRibbon.java @@ -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); diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index bfd870f5b..2bed7ca99 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -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); diff --git a/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java b/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java index 3c278343b..2b78537d3 100644 --- a/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java @@ -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); diff --git a/src/com/jpexs/decompiler/flash/gui/dumpview/DumpTreeModel.java b/src/com/jpexs/decompiler/flash/gui/dumpview/DumpTreeModel.java index 736f23f0a..8d543d1a3 100644 --- a/src/com/jpexs/decompiler/flash/gui/dumpview/DumpTreeModel.java +++ b/src/com/jpexs/decompiler/flash/gui/dumpview/DumpTreeModel.java @@ -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(); } diff --git a/src/com/jpexs/decompiler/flash/gui/dumpview/DumpViewPanel.java b/src/com/jpexs/decompiler/flash/gui/dumpview/DumpViewPanel.java index 09fdb08b4..7b6c644bc 100644 --- a/src/com/jpexs/decompiler/flash/gui/dumpview/DumpViewPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/dumpview/DumpViewPanel.java @@ -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; diff --git a/src/com/jpexs/decompiler/flash/gui/player/FlashPlayerPanel.java b/src/com/jpexs/decompiler/flash/gui/player/FlashPlayerPanel.java index f0fb55501..cbcc3fb33 100644 --- a/src/com/jpexs/decompiler/flash/gui/player/FlashPlayerPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/player/FlashPlayerPanel.java @@ -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