diff --git a/core/resources/l10n/messages.properties b/core/resources/l10n/messages.properties
index 0a33eaaef..842f0fdc7 100644
--- a/core/resources/l10n/messages.properties
+++ b/core/resources/l10n/messages.properties
@@ -289,6 +289,8 @@ pref.dlg.lbl.PositiontoinsertStages = Position to insert new stages:
pref.dlg.lbl.Confirmdeletion = Confirm deletion of simulations.
pref.dlg.checkbox.Runsimulations = Run out-dated simulations when you open the simulation tab.
pref.dlg.checkbox.Updateestimates = Update estimated flight parameters in design window
+pref.dlg.checkbox.AlwaysOpenLeftmost = Always open leftmost tab when opening a component edit dialog
+pref.dlg.checkbox.AlwaysOpenLeftmost.ttip = If checked, a component edit dialog will always pop up with the first tab selected.
If unchecked, the previous selected tab will be used.
pref.dlg.lbl.User-definedthrust = User-defined thrust curves:
pref.dlg.lbl.Windspeed = Wind speed
pref.dlg.Allthrustcurvefiles = All thrust curve files (*.eng; *.rse; *.zip; directories)
diff --git a/core/src/net/sf/openrocket/startup/Preferences.java b/core/src/net/sf/openrocket/startup/Preferences.java
index dd30d8e60..64f1de5a0 100644
--- a/core/src/net/sf/openrocket/startup/Preferences.java
+++ b/core/src/net/sf/openrocket/startup/Preferences.java
@@ -67,6 +67,7 @@ public abstract class Preferences implements ChangeSource {
// Node names
public static final String PREFERRED_THRUST_CURVE_MOTOR_NODE = "preferredThrustCurveMotors";
private static final String AUTO_OPEN_LAST_DESIGN = "AUTO_OPEN_LAST_DESIGN";
+ private static final String OPEN_LEFTMOST_DESIGN_TAB = "OPEN_LEFTMOST_DESIGN_TAB";
private static final String SHOW_ROCKSIM_FORMAT_WARNING = "SHOW_ROCKSIM_FORMAT_WARNING";
//Preferences related to 3D graphics
@@ -452,6 +453,22 @@ public abstract class Preferences implements ChangeSource {
public final boolean isAutoOpenLastDesignOnStartupEnabled() {
return this.getBoolean(AUTO_OPEN_LAST_DESIGN, false);
}
+
+ /**
+ * Enable/Disable the opening the leftmost tab on the component design panel, or using the tab that was opened last time.
+ */
+ public final void setAlwaysOpenLeftmostTab(boolean enabled) {
+ this.putBoolean(OPEN_LEFTMOST_DESIGN_TAB, enabled);
+ }
+
+ /**
+ * Answer if the always open leftmost tab is enabled.
+ *
+ * @return true if the application should always open the leftmost tab in the component design panel.
+ */
+ public final boolean isAlwaysOpenLeftmostTab() {
+ return this.getBoolean(OPEN_LEFTMOST_DESIGN_TAB, false);
+ }
/**
* Return the OpenRocket unique ID.
diff --git a/swing/src/net/sf/openrocket/gui/configdialog/ComponentConfigDialog.java b/swing/src/net/sf/openrocket/gui/configdialog/ComponentConfigDialog.java
index e66129c6c..fbf92a046 100644
--- a/swing/src/net/sf/openrocket/gui/configdialog/ComponentConfigDialog.java
+++ b/swing/src/net/sf/openrocket/gui/configdialog/ComponentConfigDialog.java
@@ -12,6 +12,7 @@ import javax.swing.JDialog;
import net.sf.openrocket.document.OpenRocketDocument;
import net.sf.openrocket.gui.util.GUIUtil;
+import net.sf.openrocket.gui.util.SwingPreferences;
import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.rocketcomponent.ComponentChangeEvent;
import net.sf.openrocket.rocketcomponent.ComponentChangeListener;
@@ -39,6 +40,8 @@ public class ComponentConfigDialog extends JDialog implements ComponentChangeLis
private OpenRocketDocument document = null;
private RocketComponent component = null;
private RocketComponentConfig configurator = null;
+
+ private static String previousSelectedTab = null; // Name of the previous selected tab
private final Window parent;
private static final Translator trans = Application.getTranslator();
@@ -102,6 +105,9 @@ public class ComponentConfigDialog extends JDialog implements ComponentChangeLis
configurator = getDialogContents();
this.setContentPane(configurator);
configurator.updateFields();
+
+ // Set the selected tab
+ configurator.setSelectedTab(previousSelectedTab);
//// configuration
setTitle(trans.get("ComponentCfgDlg.configuration1") + " " + component.getComponentName() + " " + trans.get("ComponentCfgDlg.configuration"));
@@ -204,11 +210,18 @@ public class ComponentConfigDialog extends JDialog implements ComponentChangeLis
* @param document the document to configure.
* @param component the component to configure.
* @param listeners config listeners for the component
+ * @param rememberPreviousTab if true, the previous tab will be remembered and used for the new dialog
*/
public static void showDialog(Window parent, OpenRocketDocument document,
- RocketComponent component, List listeners) {
- if (dialog != null)
+ RocketComponent component, List listeners, boolean rememberPreviousTab) {
+ if (dialog != null) {
+ previousSelectedTab = dialog.getSelectedTabName();
dialog.dispose();
+ }
+ final SwingPreferences preferences = (SwingPreferences) Application.getPreferences();
+ if (preferences.isAlwaysOpenLeftmostTab() || !rememberPreviousTab) {
+ previousSelectedTab = null;
+ }
dialog = new ComponentConfigDialog(parent, document, component, listeners);
dialog.setVisible(true);
@@ -220,19 +233,51 @@ public class ComponentConfigDialog extends JDialog implements ComponentChangeLis
/**
* A singleton configuration dialog. Will create and show a new dialog if one has not
* previously been used, or update the dialog and show it if a previous one exists.
+ * By default, the previous tab is remembered.
+ *
+ * @param document the document to configure.
+ * @param component the component to configure.
+ * @param listeners config listeners for the component
+ */
+ public static void showDialog(Window parent, OpenRocketDocument document,
+ RocketComponent component, List listeners) {
+ ComponentConfigDialog.showDialog(parent, document, component, listeners, true);
+ }
+
+ /**
+ * A singleton configuration dialog. Will create and show a new dialog if one has not
+ * previously been used, or update the dialog and show it if a previous one exists.
+ *
+ * @param document the document to configure.
+ * @param component the component to configure.
+ * @param rememberPreviousTab if true, the previous tab will be remembered and used for the new dialog
+ */
+ public static void showDialog(Window parent, OpenRocketDocument document,
+ RocketComponent component, boolean rememberPreviousTab) {
+ ComponentConfigDialog.showDialog(parent, document, component, null, rememberPreviousTab);
+ }
+
+ /**
+ * A singleton configuration dialog. Will create and show a new dialog if one has not
+ * previously been used, or update the dialog and show it if a previous one exists.
+ * By default, the previous tab is remembered.
*
* @param document the document to configure.
* @param component the component to configure.
*/
public static void showDialog(Window parent, OpenRocketDocument document,
RocketComponent component) {
- ComponentConfigDialog.showDialog(parent, document, component, null);
+ ComponentConfigDialog.showDialog(parent, document, component, null, true);
+ }
+
+ static void showDialog(RocketComponent component, List listeners, boolean rememberPreviousTab) {
+ showDialog(dialog.parent, dialog.document, component, listeners, rememberPreviousTab);
}
/* package */
static void showDialog(RocketComponent component, List listeners) {
- showDialog(dialog.parent, dialog.document, component, listeners);
+ showDialog(dialog.parent, dialog.document, component, listeners, true);
}
/* package */
@@ -256,5 +301,13 @@ public class ComponentConfigDialog extends JDialog implements ComponentChangeLis
public static boolean isDialogVisible() {
return (dialog != null) && (dialog.isVisible());
}
+
+ public String getSelectedTabName() {
+ if (configurator != null) {
+ return configurator.getSelectedTabName();
+ } else {
+ return null;
+ }
+ }
}
diff --git a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java
index 12ce67e1f..f49741d82 100644
--- a/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java
+++ b/swing/src/net/sf/openrocket/gui/configdialog/RocketComponentConfig.java
@@ -268,6 +268,26 @@ public class RocketComponentConfig extends JPanel {
}
return subPanel;
}
+
+ public String getSelectedTabName() {
+ if (tabbedPane != null) {
+ return tabbedPane.getTitleAt(tabbedPane.getSelectedIndex());
+ } else {
+ return "";
+ }
+ }
+
+ public void setSelectedTab(String tabName) {
+ if (tabbedPane != null) {
+ for (int i = 0; i < tabbedPane.getTabCount(); i++) {
+ if (tabbedPane.getTitleAt(i).equals(tabName)) {
+ tabbedPane.setSelectedIndex(i);
+ return;
+ }
+ }
+ tabbedPane.setSelectedIndex(0);
+ }
+ }
protected JPanel instanceablePanel( Instanceable inst ){
JPanel panel = new JPanel( new MigLayout("fill"));
diff --git a/swing/src/net/sf/openrocket/gui/dialogs/preferences/DesignPreferencesPanel.java b/swing/src/net/sf/openrocket/gui/dialogs/preferences/DesignPreferencesPanel.java
index b877f96e2..08ef4acb1 100644
--- a/swing/src/net/sf/openrocket/gui/dialogs/preferences/DesignPreferencesPanel.java
+++ b/swing/src/net/sf/openrocket/gui/dialogs/preferences/DesignPreferencesPanel.java
@@ -90,6 +90,21 @@ public class DesignPreferencesPanel extends PreferencesPanel {
});
this.add(autoOpenDesignFile, "wrap, growx, span 2");
+ // // Always open leftmost tab when opening a component edit dialog
+ final JCheckBox alwaysOpenLeftmostTab = new JCheckBox(
+ trans.get("pref.dlg.checkbox.AlwaysOpenLeftmost"));
+
+ alwaysOpenLeftmostTab.setSelected(preferences.isAlwaysOpenLeftmostTab());
+ alwaysOpenLeftmostTab.setToolTipText(trans.get("pref.dlg.checkbox.AlwaysOpenLeftmost.ttip"));
+ alwaysOpenLeftmostTab.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ preferences.setAlwaysOpenLeftmostTab(alwaysOpenLeftmostTab
+ .isSelected());
+ }
+ });
+ this.add(alwaysOpenLeftmostTab, "wrap, growx, span 2");
+
// // Update flight estimates in the design window
final JCheckBox updateEstimates = new JCheckBox(
trans.get("pref.dlg.checkbox.Updateestimates"));
@@ -102,6 +117,5 @@ public class DesignPreferencesPanel extends PreferencesPanel {
}
});
this.add(updateEstimates, "wrap, growx, sg combos ");
-
}
}
diff --git a/swing/src/net/sf/openrocket/gui/main/ComponentAddButtons.java b/swing/src/net/sf/openrocket/gui/main/ComponentAddButtons.java
index 9e4871848..8ed2338c9 100644
--- a/swing/src/net/sf/openrocket/gui/main/ComponentAddButtons.java
+++ b/swing/src/net/sf/openrocket/gui/main/ComponentAddButtons.java
@@ -488,7 +488,7 @@ public class ComponentAddButtons extends JPanel implements Scrollable {
}
}
- ComponentConfigDialog.showDialog(parent, document, component);
+ ComponentConfigDialog.showDialog(parent, document, component, false);
}
}