diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e1a2cd8d..971a72b5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ All notable changes to this project will be documented in this file. - AS1/2 P-code curly braces pair highlighting - [#2478] Simple editor - editing texts (not WYSIWYG, textual as in classic editor) - [#2478] Simple editor - remembering last frame / timeline +- Optional heap memory status widget in the titlebar ### Fixed - [#2474] Gotos incorrectly decompiled diff --git a/lib/substance-fix.jar b/lib/substance-fix.jar index 77204c70e..b4b563051 100644 Binary files a/lib/substance-fix.jar and b/lib/substance-fix.jar differ 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 d5238947c..d87c9b291 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 @@ -1154,6 +1154,10 @@ public final class Configuration { @ConfigurationDefaultBoolean(false) @ConfigurationCategory("script") public static ConfigurationItem skipDetectionOfUnitializedClassFields = null; + + @ConfigurationDefaultBoolean(false) + @ConfigurationInternal + public static ConfigurationItem showHeapStatusWidget = null; private static Map configurationDescriptions = new LinkedHashMap<>(); private static Map configurationTitles = new LinkedHashMap<>(); diff --git a/src/com/jpexs/decompiler/flash/gui/AppDialog.java b/src/com/jpexs/decompiler/flash/gui/AppDialog.java index 0f820f883..1282dd920 100644 --- a/src/com/jpexs/decompiler/flash/gui/AppDialog.java +++ b/src/com/jpexs/decompiler/flash/gui/AppDialog.java @@ -21,6 +21,8 @@ import java.awt.Window; import java.util.ResourceBundle; import javax.swing.JDialog; import javax.swing.JRootPane; +import org.pushingpixels.substance.api.SubstanceConstants; +import org.pushingpixels.substance.api.SubstanceLookAndFeel; /** * @author JPEXS @@ -50,6 +52,7 @@ public abstract class AppDialog extends JDialog { if (Configuration.useRibbonInterface.get()) { getRootPane().setWindowDecorationStyle(JRootPane.FRAME); } + SubstanceLookAndFeel.setWidgetVisible(this.rootPane, false, SubstanceConstants.SubstanceWidgetType.TITLE_PANE_HEAP_STATUS); } public ResourceBundle getResourceBundle() { diff --git a/src/com/jpexs/decompiler/flash/gui/Main.java b/src/com/jpexs/decompiler/flash/gui/Main.java index ddb7cd275..85340a569 100644 --- a/src/com/jpexs/decompiler/flash/gui/Main.java +++ b/src/com/jpexs/decompiler/flash/gui/Main.java @@ -155,6 +155,7 @@ import javax.swing.UnsupportedLookAndFeelException; import javax.swing.filechooser.FileFilter; import javax.swing.tree.TreePath; import jsyntaxpane.DefaultSyntaxKit; +import org.pushingpixels.substance.api.SubstanceConstants; import org.pushingpixels.substance.api.SubstanceLookAndFeel; /** diff --git a/src/com/jpexs/decompiler/flash/gui/MainFrameRibbon.java b/src/com/jpexs/decompiler/flash/gui/MainFrameRibbon.java index b1db2cc22..5f94a4150 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainFrameRibbon.java +++ b/src/com/jpexs/decompiler/flash/gui/MainFrameRibbon.java @@ -55,8 +55,11 @@ import javax.swing.JFrame; import javax.swing.plaf.RootPaneUI; import org.pushingpixels.flamingo.api.ribbon.JRibbon; import org.pushingpixels.flamingo.internal.ui.ribbon.appmenu.JRibbonApplicationMenuButton; +import org.pushingpixels.substance.api.SubstanceConstants; +import org.pushingpixels.substance.api.SubstanceLookAndFeel; import org.pushingpixels.substance.flamingo.ribbon.ui.SubstanceRibbonRootPaneUI; import org.pushingpixels.substance.internal.utils.SubstanceSizeUtils; +import org.pushingpixels.substance.internal.utils.SubstanceTitlePane; /** * @author JPEXS @@ -69,7 +72,7 @@ public final class MainFrameRibbon extends AppRibbonFrame { public MainFrameRibbon() { super(); - + Container cnt = getContentPane(); cnt.setLayout(new BorderLayout()); JRibbon ribbon = getRibbon(); @@ -182,7 +185,7 @@ public final class MainFrameRibbon extends AppRibbonFrame { } } }); - + View.centerScreenMain(this); enableAeroSnap(); @@ -276,11 +279,14 @@ public final class MainFrameRibbon extends AppRibbonFrame { private void updateRect() { int appButtonSize = (int) Math.round(trans.getScaleX() * Integer.getInteger("peacock.appButtonSize", 24)); + SubstanceTitlePane.HeapStatusPanel h = new SubstanceTitlePane.HeapStatusPanel(); + int heapWidth = Configuration.showHeapStatusWidget.get() ? 5 + h.getPreferredWidth() : 0; int titleIconsWidth = 3 + SubstanceSizeUtils.getTitlePaneIconSize() //close + 10 + SubstanceSizeUtils.getTitlePaneIconSize() //maximize / restore + 2 + SubstanceSizeUtils.getTitlePaneIconSize() //minimize + 2 + SubstanceSizeUtils.getTitlePaneIconSize() //always on top + + heapWidth ; dragRect = new Rectangle( diff --git a/src/com/jpexs/decompiler/flash/gui/TextPanel.java b/src/com/jpexs/decompiler/flash/gui/TextPanel.java index c717d85f1..997e6fafd 100644 --- a/src/com/jpexs/decompiler/flash/gui/TextPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/TextPanel.java @@ -208,7 +208,7 @@ public class TextPanel extends JPanel implements TagEditorPanel { textValue.setCaretPosition(0); setModified(false); setEditText(false); - boolean readOnly = ((Tag) textTag).isReadOnly(); + boolean readOnly = textTag == null ? true : ((Tag) textTag).isReadOnly(); if (readOnly) { textValue.setEditable(false); } diff --git a/src/com/jpexs/decompiler/flash/gui/View.java b/src/com/jpexs/decompiler/flash/gui/View.java index e03d6ecab..f74bc18d8 100644 --- a/src/com/jpexs/decompiler/flash/gui/View.java +++ b/src/com/jpexs/decompiler/flash/gui/View.java @@ -115,6 +115,8 @@ import org.pushingpixels.substance.internal.utils.SubstanceColorSchemeUtilities; * @author JPEXS */ public class View { + + private static boolean heapWidgetInited = false; public static Color getDefaultBackgroundColor() { if (Configuration.useRibbonInterface.get() && SubstanceLookAndFeel.getCurrentSkin() != null) { @@ -175,6 +177,7 @@ public class View { } try { + //UIManager.put(SubstanceLookAndFeel.WINDOW_HEAP_STATUS_VISIBLE, Boolean.TRUE); LookAndFeel oldLookAndFeel = UIManager.getLookAndFeel(); if (!(oldLookAndFeel instanceof SubstanceOfficeBlue2007LookAndFeel)) { UIManager.setLookAndFeel(new SubstanceOfficeBlue2007LookAndFeel()); @@ -194,6 +197,12 @@ public class View { } UIManager.put(SubstanceLookAndFeel.COLORIZATION_FACTOR, 0.999); //This works for not changing labels color and not changing Dialogs title + + if (Configuration.showHeapStatusWidget.get() && !heapWidgetInited) { + SubstanceLookAndFeel.setWidgetVisible(null, true, SubstanceConstants.SubstanceWidgetType.TITLE_PANE_HEAP_STATUS); + } + heapWidgetInited = true; + if (View.isOceanic()) { UIManager.put("Tree.expandedIcon", getIcon("expand16")); UIManager.put("Tree.collapsedIcon", getIcon("collapse16")); diff --git a/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog.properties b/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog.properties index 0b5b6375e..62231b4fe 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog.properties @@ -630,3 +630,6 @@ config.description.showCodeCompletionOnDot = Automatically show code completion #after 24.0.1 config.name.skipDetectionOfUnitializedClassFields = AS2: Skip detection of uninitialized class fields config.description.skipDetectionOfUnitializedClassFields = Skips detection of uninitialized attributes in AS2 classes which includes decompilation of all scripts in current SWF before accessing any class. Set this to true if you have large obfuscated file and you want to see at least something (= incomplete class). + +config.name.showHeapStatusWidget = Show heap status widget +config.description.showHeapStatusWidget = Displays used memory widget in the titlebar. \ No newline at end of file diff --git a/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog_cs.properties b/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog_cs.properties index ec97e63ff..5a539ff3b 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog_cs.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog_cs.properties @@ -630,3 +630,6 @@ config.description.showCodeCompletionOnDot = Automaticky zobraz\u00ed okno dokon #after 24.0.1 config.name.skipDetectionOfUnitializedClassFields = AS2: P\u0159esko\u010dit detekci neinicializovan\u00fdch pol\u00ed t\u0159\u00edd config.description.skipDetectionOfUnitializedClassFields = P\u0159esko\u010d\u00ed detekci neinicializovan\u00fdch atribut\u016f v AS2 t\u0159\u00edd\u00e1ch kter\u00e1 zahrnuje dekompilaci v\u0161ech skript\u016f v aktu\u00e1ln\u00edm SWF p\u0159ed p\u0159\u00edstupem k jak\u00e9koli t\u0159\u00edd\u011b. Nastavte toto na true pokud m\u00e1te velk\u00fd obfuskovan\u00fd soubor a chcete vid\u011bt alespo\u0148 n\u011bco (= nekompletn\u00ed t\u0159\u00eddu). + +config.name.showHeapStatusWidget = Zobrazit widget se stavem heapu +config.description.showHeapStatusWidget = Zobraz\u00ed widget s pou\u017eitou pam\u011bt\u00ed v titulku okna. \ No newline at end of file