diff --git a/swing/src/net/sf/openrocket/gui/configdialog/ComponentConfigDialog.java b/swing/src/net/sf/openrocket/gui/configdialog/ComponentConfigDialog.java index 38bc115e4..2298bf3a7 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/ComponentConfigDialog.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/ComponentConfigDialog.java @@ -2,6 +2,8 @@ package net.sf.openrocket.gui.configdialog; import java.awt.Window; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; @@ -30,10 +32,9 @@ public class ComponentConfigDialog extends JDialog implements ComponentChangeLis private static final String CONFIGDIALOGPACKAGE = "net.sf.openrocket.gui.configdialog"; private static final String CONFIGDIALOGPOSTFIX = "Config"; - + // Static Value -- This is a singleton value, and we should only have zero or one active at any time private static ComponentConfigDialog dialog = null; - private OpenRocketDocument document = null; private RocketComponent component = null; private RocketComponentConfig configurator = null; @@ -41,8 +42,7 @@ public class ComponentConfigDialog extends JDialog implements ComponentChangeLis private final Window parent; private static final Translator trans = Application.getTranslator(); - private ComponentConfigDialog(Window parent, OpenRocketDocument document, - RocketComponent component) { + private ComponentConfigDialog(Window parent, OpenRocketDocument document, RocketComponent component) { super(parent); this.parent = parent; @@ -50,6 +50,22 @@ public class ComponentConfigDialog extends JDialog implements ComponentChangeLis GUIUtil.setDisposableDialogOptions(this, null); GUIUtil.rememberWindowPosition(this); + + // overrides common defaults in 'GUIUTIL.setDisposableDialogOptions', above + setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); + addWindowListener(new WindowAdapter() { + /** + * Triggered by the 'Close' Button on the ConfigDialogs. AND Esc. AND the [x] button (on Windows) + * In fact, it should trigger for any method of closing the dialog. + */ + public void windowClosed(WindowEvent e){ + configurator.invalidate(); + document.getRocket().removeComponentChangeListener(ComponentConfigDialog.this); + ComponentConfigDialog.this.dispose(); + } + + public void windowClosing(WindowEvent e){} + }); } @@ -102,14 +118,6 @@ public class ComponentConfigDialog extends JDialog implements ComponentChangeLis throw new BugException("Unable to find any configurator for " + component); } - - private void closeDialog() { - this.setVisible(false); - this.dispose(); - this.configurator.invalidateModels(); - } - - @Override public void componentChanged(ComponentChangeEvent e) { if (e.isTreeChange() || e.isUndoChange()) { @@ -200,7 +208,7 @@ public class ComponentConfigDialog extends JDialog implements ComponentChangeLis */ public static void hideDialog() { if (dialog != null) { - dialog.closeDialog(); + dialog.setVisible(false); } } diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java index 69dd02966..072dde1a2 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java @@ -3,10 +3,7 @@ package net.sf.openrocket.gui.configdialog; import java.awt.Component; import java.awt.Container; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.FocusEvent; -import java.awt.event.FocusListener; +import java.awt.event.*; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -43,11 +40,8 @@ import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.material.Material; import net.sf.openrocket.preset.ComponentPreset; import net.sf.openrocket.rocketcomponent.ComponentAssembly; -import net.sf.openrocket.rocketcomponent.ExternalComponent; +import net.sf.openrocket.rocketcomponent.*; import net.sf.openrocket.rocketcomponent.ExternalComponent.Finish; -import net.sf.openrocket.rocketcomponent.Instanceable; -import net.sf.openrocket.rocketcomponent.NoseCone; -import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.position.AxialMethod; import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; @@ -111,11 +105,11 @@ public class RocketComponentConfig extends JPanel { //// Override and Mass and CG override options tabbedPane.addTab(trans.get("RocketCompCfg.tab.Override"), null, overrideTab(), trans.get("RocketCompCfg.tab.MassandCGoverride")); - if (component.isMassive()) - + if (component.isMassive()) { //// Appearance options tabbedPane.addTab(trans.get("RocketCompCfg.tab.Appearance"), null, new AppearancePanel(document, component), "Appearance Tool Tip"); + } //// Comment and Specify a comment for the component tabbedPane.addTab(trans.get("RocketCompCfg.tab.Comment"), null, commentTab(), @@ -622,12 +616,12 @@ public class RocketComponentConfig extends JPanel { this.invalidatables.add(model); } - public void invalidateModels() { + public void invalidate() { + super.invalidate(); for (Invalidatable i : invalidatables) { i.invalidate(); } ((ComponentPresetDatabase) Application.getComponentPresetDao()).removeChangeListener(presetModel); - }