diff --git a/CHANGELOG.md b/CHANGELOG.md index bf00ef8c1..d77561a7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ All notable changes to this project will be documented in this file. - [#1006] AS3 - Warning - Function value used where type Boolean was expected - AS3 - Resolving types on static protected namespaced properties - Hiding selection after raw editation save +- Proper disabling switching items or other actions on editation ### Changed - Quick search needs minimum of 3 characters diff --git a/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java b/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java index ebf435c4c..b0fe06506 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java +++ b/src/com/jpexs/decompiler/flash/gui/MainFrameMenu.java @@ -128,6 +128,9 @@ public abstract class MainFrameMenu implements MenuBuilder { if (Main.isWorking()) { return false; } + if (mainFrame.getPanel().checkEdited()) { + return false; + } Main.openFileDialog(); return true; @@ -182,6 +185,9 @@ public abstract class MainFrameMenu implements MenuBuilder { } protected void newActionPerformed(ActionEvent evt) { + if (mainFrame.getPanel().checkEdited()) { + return; + } Main.newFile(); } @@ -189,6 +195,9 @@ public abstract class MainFrameMenu implements MenuBuilder { if (Main.isWorking()) { return false; } + if (mainFrame.getPanel().checkEdited()) { + return false; + } return saveOpenable(openable); } @@ -196,6 +205,9 @@ public abstract class MainFrameMenu implements MenuBuilder { if (Main.isWorking()) { return false; } + if (mainFrame.getPanel().checkEdited()) { + return false; + } if (openable != null) { if (saveAs(openable, SaveFileMode.SAVEAS)) { @@ -230,6 +242,9 @@ public abstract class MainFrameMenu implements MenuBuilder { if (Main.isWorking()) { return; } + if (mainFrame.getPanel().checkEdited()) { + return; + } if (openable != null) { saveAs(openable, SaveFileMode.EXE); @@ -255,6 +270,9 @@ public abstract class MainFrameMenu implements MenuBuilder { if (Main.isWorking()) { return; } + if (mainFrame.getPanel().checkEdited()) { + return; + } Set listsToClose = new LinkedHashSet<>(); for (TreeItem item : mainFrame.getPanel().getCurrentTree().getSelected()) { if (item instanceof OpenableList) { @@ -285,6 +303,9 @@ public abstract class MainFrameMenu implements MenuBuilder { if (Main.isWorking()) { return false; } + if (mainFrame.getPanel().checkEdited()) { + return false; + } if (openable != null) { boolean result = Main.closeAll(); @@ -308,6 +329,9 @@ public abstract class MainFrameMenu implements MenuBuilder { if (Main.isWorking()) { return; } + if (mainFrame.getPanel().checkEdited()) { + return; + } mainFrame.getPanel().importText((SWF) openable); } @@ -316,6 +340,9 @@ public abstract class MainFrameMenu implements MenuBuilder { if (Main.isWorking()) { return; } + if (mainFrame.getPanel().checkEdited()) { + return; + } mainFrame.getPanel().importScript(openable); } @@ -324,6 +351,9 @@ public abstract class MainFrameMenu implements MenuBuilder { if (Main.isWorking()) { return; } + if (mainFrame.getPanel().checkEdited()) { + return; + } mainFrame.getPanel().importImage((SWF) openable); } @@ -331,6 +361,9 @@ public abstract class MainFrameMenu implements MenuBuilder { if (Main.isWorking()) { return; } + if (mainFrame.getPanel().checkEdited()) { + return; + } mainFrame.getPanel().importShape((SWF) openable, false); } @@ -338,6 +371,9 @@ public abstract class MainFrameMenu implements MenuBuilder { if (Main.isWorking()) { return; } + if (mainFrame.getPanel().checkEdited()) { + return; + } mainFrame.getPanel().importShape((SWF) openable, true); } @@ -345,6 +381,9 @@ public abstract class MainFrameMenu implements MenuBuilder { if (Main.isWorking()) { return; } + if (mainFrame.getPanel().checkEdited()) { + return; + } mainFrame.getPanel().importSymbolClass((SWF) openable); } @@ -353,6 +392,9 @@ public abstract class MainFrameMenu implements MenuBuilder { if (Main.isWorking()) { return false; } + if (mainFrame.getPanel().checkEdited()) { + return false; + } return export(false); } @@ -361,6 +403,9 @@ public abstract class MainFrameMenu implements MenuBuilder { if (Main.isWorking()) { return false; } + if (mainFrame.getPanel().checkEdited()) { + return false; + } return export(true); } @@ -380,6 +425,9 @@ public abstract class MainFrameMenu implements MenuBuilder { if (Main.isWorking()) { return; } + if (mainFrame.getPanel().checkEdited()) { + return; + } mainFrame.getPanel().exportFla((SWF) openable); } @@ -388,6 +436,9 @@ public abstract class MainFrameMenu implements MenuBuilder { if (Main.isWorking()) { return; } + if (mainFrame.getPanel().checkEdited()) { + return; + } mainFrame.getPanel().importSwfXml(mainFrame.getPanel().getCurrentTree().getSelected()); } @@ -396,6 +447,9 @@ public abstract class MainFrameMenu implements MenuBuilder { if (Main.isWorking()) { return; } + if (mainFrame.getPanel().checkEdited()) { + return; + } mainFrame.getPanel().exportSwfXml(mainFrame.getPanel().getCurrentTree().getSelected()); } @@ -436,6 +490,9 @@ public abstract class MainFrameMenu implements MenuBuilder { if (Main.isWorking()) { return; } + if (mainFrame.getPanel().checkEdited()) { + return; + } Main.showProxy(); } @@ -449,6 +506,9 @@ public abstract class MainFrameMenu implements MenuBuilder { if (Main.isWorking()) { return; } + if (mainFrame.getPanel().checkEdited()) { + return; + } mainFrame.getPanel().renameOneIdentifier((SWF) openable); } @@ -459,6 +519,9 @@ public abstract class MainFrameMenu implements MenuBuilder { if (Main.isWorking()) { return; } + if (mainFrame.getPanel().checkEdited()) { + return; + } mainFrame.getPanel().renameColliding(openable); } @@ -469,6 +532,9 @@ public abstract class MainFrameMenu implements MenuBuilder { if (Main.isWorking()) { return; } + if (mainFrame.getPanel().checkEdited()) { + return; + } mainFrame.getPanel().renameIdentifiers(openable); } @@ -477,6 +543,9 @@ public abstract class MainFrameMenu implements MenuBuilder { if (Main.isWorking()) { return; } + if (mainFrame.getPanel().checkEdited()) { + return; + } mainFrame.getPanel().deobfuscate(); } @@ -485,6 +554,9 @@ public abstract class MainFrameMenu implements MenuBuilder { if (Main.isWorking()) { return; } + if (mainFrame.getPanel().checkEdited()) { + return; + } AbstractButton button = (AbstractButton) evt.getSource(); boolean selected = button.isSelected(); @@ -600,6 +672,9 @@ public abstract class MainFrameMenu implements MenuBuilder { if (Main.isWorking()) { return; } + if (mainFrame.getPanel().checkEdited()) { + return; + } if (!Main.checkForUpdates()) { ViewMessages.showMessageDialog(Main.getDefaultMessagesComponent(), translate("update.check.nonewversion"), translate("update.check.title"), JOptionPane.INFORMATION_MESSAGE); @@ -610,6 +685,9 @@ public abstract class MainFrameMenu implements MenuBuilder { if (Main.isWorking()) { return; } + if (mainFrame.getPanel().checkEdited()) { + return; + } String helpUsURL = ApplicationInfo.PROJECT_PAGE; if (!View.navigateUrl(helpUsURL)) { @@ -621,6 +699,9 @@ public abstract class MainFrameMenu implements MenuBuilder { if (Main.isWorking()) { return; } + if (mainFrame.getPanel().checkEdited()) { + return; + } String homePageURL = ApplicationInfo.PROJECT_PAGE; if (!View.navigateUrl(homePageURL)) { @@ -632,11 +713,17 @@ public abstract class MainFrameMenu implements MenuBuilder { if (Main.isWorking()) { return; } + if (mainFrame.getPanel().checkEdited()) { + return; + } Main.about(); } protected boolean reloadActionPerformed(ActionEvent evt) { + if (mainFrame.getPanel().checkEdited()) { + return false; + } if (openable != null) { if (!Configuration.showCloseConfirmation.get() || ViewMessages.showConfirmDialog(Main.getDefaultMessagesComponent(), translate("message.confirm.reload"), translate("message.warning"), JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION) { if (openable.getOpenableList() == null) { @@ -655,6 +742,9 @@ public abstract class MainFrameMenu implements MenuBuilder { } protected boolean reloadAllActionPerformed(ActionEvent evt) { + if (mainFrame.getPanel().checkEdited()) { + return false; + } if (openable != null) { if (!Configuration.showCloseConfirmation.get() || ViewMessages.showConfirmDialog(Main.getDefaultMessagesComponent(), translate("message.confirm.reloadAll"), translate("message.warning"), JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE) == JOptionPane.YES_OPTION) { Main.reloadApp(); @@ -668,6 +758,9 @@ public abstract class MainFrameMenu implements MenuBuilder { } protected void advancedSettingsActionPerformed(ActionEvent evt) { + if (mainFrame.getPanel().checkEdited()) { + return; + } Main.advancedSettings(); } @@ -719,6 +812,9 @@ public abstract class MainFrameMenu implements MenuBuilder { } }*/ protected void setLanguageActionPerformed(ActionEvent evt) { + if (mainFrame.getPanel().checkEdited()) { + return; + } new SelectLanguageDialog(Main.getDefaultDialogsOwner()).display(); } @@ -1303,15 +1399,37 @@ public abstract class MainFrameMenu implements MenuBuilder { public void showTagListView() { viewTagListActionPerformed(null); } + + private void reselectView() { + switch(mainFrame.getPanel().getCurrentView()) { + case MainPanel.VIEW_RESOURCES: + setMenuChecked("/file/view/viewResources", true); + break; + case MainPanel.VIEW_TAGLIST: + setMenuChecked("/file/view/viewTagList", true); + break; + case MainPanel.VIEW_DUMP: + setMenuChecked("/file/view/viewHex", true); + break; + } + } private void viewResourcesActionPerformed(ActionEvent evt) { + if (mainFrame.getPanel().checkEdited()) { + reselectView(); + return; + } Configuration.dumpView.set(false); mainFrame.getPanel().showView(MainPanel.VIEW_RESOURCES); setGroupSelection("view", "/file/view/viewResources"); setMenuChecked("/tools/timeline", false); - } - + } + private void viewHexActionPerformed(ActionEvent evt) { + if (mainFrame.getPanel().checkEdited()) { + reselectView(); + return; + } Configuration.dumpView.set(true); MainPanel mainPanel = mainFrame.getPanel(); if (mainPanel.isModified()) { @@ -1324,6 +1442,10 @@ public abstract class MainFrameMenu implements MenuBuilder { } private void viewTagListActionPerformed(ActionEvent evt) { + if (mainFrame.getPanel().checkEdited()) { + reselectView(); + return; + } Configuration.dumpView.set(false); MainPanel mainPanel = mainFrame.getPanel(); mainPanel.showView(MainPanel.VIEW_TAGLIST); diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index 88b91bc46..904c5a0b4 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -660,35 +660,37 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se public boolean isClipboardCut() { return clipboardCut; + } + + public boolean checkEdited() { + if (abcPanel != null && abcPanel.isEditing()) { + abcPanel.tryAutoSave(); + } + + if (actionPanel != null && actionPanel.isEditing()) { + actionPanel.tryAutoSave(); + } + + if (previewPanel.isEditing()) { + previewPanel.tryAutoSave(); + } + + if (headerPanel.isEditing()) { + headerPanel.tryAutoSave(); + } + + return (abcPanel != null && abcPanel.isEditing()) + || (actionPanel != null && actionPanel.isEditing()) + || previewPanel.isEditing() || headerPanel.isEditing(); } private class MyTreeSelectionModel extends DefaultTreeSelectionModel { - private boolean isModified() { - if (abcPanel != null && abcPanel.isEditing()) { - abcPanel.tryAutoSave(); - } - - if (actionPanel != null && actionPanel.isEditing()) { - actionPanel.tryAutoSave(); - } - - if (previewPanel.isEditing()) { - previewPanel.tryAutoSave(); - } - - if (headerPanel.isEditing()) { - headerPanel.tryAutoSave(); - } - - return (abcPanel != null && abcPanel.isEditing()) - || (actionPanel != null && actionPanel.isEditing()) - || previewPanel.isEditing() || headerPanel.isEditing(); - } + @Override public void addSelectionPath(TreePath path) { - if (isModified()) { + if (checkEdited()) { return; } @@ -697,7 +699,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se @Override public void addSelectionPaths(TreePath[] paths) { - if (isModified()) { + if (checkEdited()) { return; } @@ -706,7 +708,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se @Override public void setSelectionPath(TreePath path) { - if (isModified()) { + if (checkEdited()) { return; } @@ -715,7 +717,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se @Override public void setSelectionPaths(TreePath[] pPaths) { - if (isModified()) { + if (checkEdited()) { return; } @@ -724,7 +726,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se @Override public void clearSelection() { - if (isModified()) { + if (checkEdited()) { return; } @@ -732,7 +734,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se } public void setSelection(TreePath[] selection) { - if (isModified()) { + if (checkEdited()) { return; } @@ -741,7 +743,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se @Override public void removeSelectionPath(TreePath path) { - if (isModified()) { + if (checkEdited()) { return; } @@ -750,7 +752,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se @Override public void removeSelectionPaths(TreePath[] paths) { - if (isModified()) { + if (checkEdited()) { return; } @@ -1900,7 +1902,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se ScriptExportSettings scriptExportSettings = new ScriptExportSettings(export.getValue(ScriptExportMode.class), singleScriptFile, false); String singleFileName = Path.combine(scriptsFolder, openable.getShortFileName() + scriptExportSettings.getFileExtension()); - try ( FileTextWriter writer = scriptExportSettings.singleFile ? new FileTextWriter(Configuration.getCodeFormatting(), new FileOutputStream(singleFileName)) : null) { + try (FileTextWriter writer = scriptExportSettings.singleFile ? new FileTextWriter(Configuration.getCodeFormatting(), new FileOutputStream(singleFileName)) : null) { scriptExportSettings.singleFileWriter = writer; if (swf.isAS3()) { ret.addAll(new AS3ScriptExporter().exportActionScript3(swf, handler, scriptsFolder, as3scripts, scriptExportSettings, parallel, evl)); @@ -2007,7 +2009,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se ScriptExportSettings scriptExportSettings = new ScriptExportSettings(export.getValue(ScriptExportMode.class), singleScriptFile, false); String singleFileName = Path.combine(scriptsFolder, swf.getShortFileName() + scriptExportSettings.getFileExtension()); - try ( FileTextWriter writer = scriptExportSettings.singleFile ? new FileTextWriter(Configuration.getCodeFormatting(), new FileOutputStream(singleFileName)) : null) { + try (FileTextWriter writer = scriptExportSettings.singleFile ? new FileTextWriter(Configuration.getCodeFormatting(), new FileOutputStream(singleFileName)) : null) { scriptExportSettings.singleFileWriter = writer; swf.exportActionScript(handler, scriptsFolder, scriptExportSettings, parallel, evl); } @@ -2124,7 +2126,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se ScriptExportSettings scriptExportSettings = new ScriptExportSettings(exportMode, singleScriptFile, false); String singleFileName = Path.combine(scriptsFolder, swf.getShortFileName() + scriptExportSettings.getFileExtension()); - try ( FileTextWriter writer = scriptExportSettings.singleFile ? new FileTextWriter(Configuration.getCodeFormatting(), new FileOutputStream(singleFileName)) : null) { + try (FileTextWriter writer = scriptExportSettings.singleFile ? new FileTextWriter(Configuration.getCodeFormatting(), new FileOutputStream(singleFileName)) : null) { scriptExportSettings.singleFileWriter = writer; swf.exportActionScript(handler, scriptsFolder, scriptExportSettings, parallel, evl); } @@ -3528,7 +3530,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se if (selectedFile != null) { File selfile = Helper.fixDialogFile(selectedFile); try { - try ( FileInputStream fis = new FileInputStream(selfile)) { + try (FileInputStream fis = new FileInputStream(selfile)) { new SwfXmlImporter().importSwf(swf, fis); } swf.clearAllCache(); diff --git a/src/com/jpexs/decompiler/flash/gui/PinsPanel.java b/src/com/jpexs/decompiler/flash/gui/PinsPanel.java index 5143decc7..55100e9d2 100644 --- a/src/com/jpexs/decompiler/flash/gui/PinsPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/PinsPanel.java @@ -157,6 +157,9 @@ public class PinsPanel extends JPanel { pinButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { + if (mainPanel.checkEdited()) { + return; + } current = pinButton.getItem(); if (lastSelectedButton != null) { lastSelectedButton.setSelected(false); diff --git a/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java b/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java index 07e572f69..4449287b1 100644 --- a/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java @@ -1212,7 +1212,8 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel public boolean isEditing() { return textPanel.isEditing() || (genericSaveButton.isVisible() && genericSaveButton.isEnabled()) - || (metadataSaveButton.isVisible() && metadataSaveButton.isEnabled()); + || (metadataSaveButton.isVisible() && metadataSaveButton.isEnabled()) + || (placeSaveButton.isVisible() && placeSaveButton.isEnabled()); } public void selectImageDepth(int depth) {