package net.sf.openrocket.gui.dialogs.preferences;
import java.awt.Dialog.ModalityType;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JTextField;
import javax.swing.Timer;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import net.miginfocom.swing.MigLayout;
import net.sf.openrocket.communication.UpdateInfo;
import net.sf.openrocket.communication.UpdateInfoRetriever;
import net.sf.openrocket.gui.components.DescriptionArea;
import net.sf.openrocket.gui.components.StyledLabel;
import net.sf.openrocket.gui.components.StyledLabel.Style;
import net.sf.openrocket.gui.dialogs.UpdateInfoDialog;
import net.sf.openrocket.gui.util.GUIUtil;
import net.sf.openrocket.gui.util.SimpleFileFilter;
import net.sf.openrocket.gui.util.SwingPreferences;
import net.sf.openrocket.l10n.L10N;
import net.sf.openrocket.logging.Markers;
import net.sf.openrocket.startup.Preferences;
import net.sf.openrocket.util.BuildProperties;
import net.sf.openrocket.util.Named;
import net.sf.openrocket.util.Utils;
public class GeneralPreferencesPanel extends PreferencesPanel {
public GeneralPreferencesPanel(JDialog parent) {
super(parent, new MigLayout("fillx, ins 30lp n n n"));
//// Language selector
Locale userLocale = null;
{
String locale = preferences.getString("locale", null);
userLocale = L10N.toLocale(locale);
}
List<Named<Locale>> locales = new ArrayList<Named<Locale>>();
for (Locale l : SwingPreferences.getSupportedLocales()) {
locales.add(new Named<Locale>(l, l.getDisplayLanguage(l) + "/" + l.getDisplayLanguage()));
}
Collections.sort(locales);
locales.add(0, new Named<Locale>(null, trans.get("generalprefs.languages.default")));
final JComboBox<?> languageCombo = new JComboBox<Object>(locales.toArray());
for (int i = 0; i < locales.size(); i++) {
if (Utils.equals(userLocale, locales.get(i).get())) {
languageCombo.setSelectedIndex(i);
}
}
languageCombo.addActionListener(new ActionListener() {
@Override
@SuppressWarnings("unchecked")
public void actionPerformed(ActionEvent e) {
Named<Locale> selection = (Named<Locale>) languageCombo.getSelectedItem();
Locale l = selection.get();
preferences.putString(Preferences.USER_LOCAL, l == null ? null : l.toString());
}
});
this.add(new JLabel(trans.get("generalprefs.lbl.language")), "gapright para");
this.add(languageCombo, "wrap rel, growx, sg combos");
this.add(new StyledLabel(trans.get("generalprefs.lbl.languageEffect"), -3, Style.ITALIC), "span, wrap para*2");
//// User-defined thrust curves:
this.add(new JLabel(trans.get("pref.dlg.lbl.User-definedthrust")), "spanx, wrap");
final JTextField field = new JTextField();
List<File> files = preferences.getUserThrustCurveFiles();
String str = "";
for (File file : files) {
if (str.length() > 0) {
str += ";";
}
str += file.getAbsolutePath();
}
field.setText(str);
field.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
changed();
}
@Override
public void insertUpdate(DocumentEvent e) {
changed();
}
@Override
public void changedUpdate(DocumentEvent e) {
changed();
}
private void changed() {
String text = field.getText();
List<File> list = new ArrayList<File>();
for (String s : text.split(";")) {
s = s.trim();
if (s.length() > 0) {
list.add(new File(s));
}
}
preferences.setUserThrustCurveFiles(list);
}
});
this.add(field, "w 100px, gapright unrel, spanx, growx, split");
//// Add button
JButton button = new JButton(trans.get("pref.dlg.but.add"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser chooser = new JFileChooser();
SimpleFileFilter filter =
new SimpleFileFilter(
//// All thrust curve files (*.eng; *.rse; *.zip; directories)
trans.get("pref.dlg.Allthrustcurvefiles"),
true, "eng", "rse", "zip");
chooser.addChoosableFileFilter(filter);
//// RASP motor files (*.eng)
chooser.addChoosableFileFilter(new SimpleFileFilter(trans.get("pref.dlg.RASPfiles"),
true, "eng"));
//// RockSim engine files (*.rse)
chooser.addChoosableFileFilter(new SimpleFileFilter(trans.get("pref.dlg.RockSimfiles"),
true, "rse"));
//// ZIP archives (*.zip)
chooser.addChoosableFileFilter(new SimpleFileFilter(trans.get("pref.dlg.ZIParchives"),
true, "zip"));
chooser.setFileFilter(filter);
chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
if (defaultDirectory != null) {
chooser.setCurrentDirectory(defaultDirectory);
}
//// Add
int returnVal = chooser.showDialog(GeneralPreferencesPanel.this, trans.get("pref.dlg.Add"));
if (returnVal == JFileChooser.APPROVE_OPTION) {
log.info(Markers.USER_MARKER, "Adding user thrust curve: " + chooser.getSelectedFile());
defaultDirectory = chooser.getCurrentDirectory();
String text = field.getText().trim();
if (text.length() > 0) {
text += ";";
}
text += chooser.getSelectedFile().getAbsolutePath();
field.setText(text);
}
}
});
this.add(button, "gapright unrel");
//// Reset button
button = new JButton(trans.get("pref.dlg.but.reset"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// First one sets to the default, but does not un-set the pref
field.setText(preferences.getDefaultUserThrustCurveFile().getAbsolutePath());
preferences.setUserThrustCurveFiles(null);
}
});
this.add(button, "wrap");
//// Add directories, RASP motor files (*.eng), RockSim engine files (*.rse) or ZIP archives separated by a semicolon (;) to load external thrust curves. Changes will take effect the next time you start OpenRocket.
DescriptionArea desc = new DescriptionArea(trans.get("pref.dlg.DescriptionArea.Adddirectories"), 3, -3, false);
desc.setBackground(getBackground());
this.add(desc, "spanx, growx, wrap 40lp");
//// Check for software updates at startup
final JCheckBox softwareUpdateBox =
new JCheckBox(trans.get("pref.dlg.checkbox.Checkupdates"));
softwareUpdateBox.setSelected(preferences.getCheckUpdates());
softwareUpdateBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
preferences.setCheckUpdates(softwareUpdateBox.isSelected());
}
});
this.add(softwareUpdateBox);
//// Check now button
button = new JButton(trans.get("pref.dlg.but.checknow"));
//// Check for software updates now
button.setToolTipText(trans.get("pref.dlg.ttip.Checkupdatesnow"));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
checkForUpdates();
}
});
this.add(button, "right, wrap");
//// Open most recent file on startup
final JCheckBox openRecentOnStartupBox = new JCheckBox(trans.get("pref.dlg.but.openlast"));
openRecentOnStartupBox.setSelected(preferences.isAutoOpenLastDesignOnStartupEnabled());
openRecentOnStartupBox.addActionListener( new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
preferences.setAutoOpenLastDesignOnStartup(openRecentOnStartupBox.isSelected());
}
});
this.add(openRecentOnStartupBox,"spanx, wrap");
//// Save RockSim Format warning dialog
final JCheckBox rocksimWarningDialogBox = new JCheckBox(trans.get("pref.dlg.lbl.RockSimWarning"));
rocksimWarningDialogBox.setSelected(preferences.getShowRockSimFormatWarning());
rocksimWarningDialogBox.addActionListener( new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
preferences.setShowRockSimFormatWarning(rocksimWarningDialogBox.isSelected());
}
});
this.add(rocksimWarningDialogBox,"spanx, wrap");
}
private void checkForUpdates() {
final UpdateInfoRetriever retriever = new UpdateInfoRetriever();
retriever.start();
// Progress dialog
final JDialog dialog1 = new JDialog(this.parentDialog, ModalityType.APPLICATION_MODAL);
JPanel panel = new JPanel(new MigLayout());
//// Checking for updates...
panel.add(new JLabel(trans.get("pref.dlg.lbl.Checkingupdates")), "wrap");
JProgressBar bar = new JProgressBar();
bar.setIndeterminate(true);
panel.add(bar, "growx, wrap para");
//// Cancel button
JButton cancel = new JButton(trans.get("dlg.but.cancel"));
cancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
dialog1.dispose();
}
});
panel.add(cancel, "right");
dialog1.add(panel);
GUIUtil.setDisposableDialogOptions(dialog1, cancel);
// Timer to monitor progress
final Timer timer = new Timer(100, null);
final long startTime = System.currentTimeMillis();
ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (!retriever.isRunning() || startTime + 10000 < System.currentTimeMillis()) {
timer.stop();
dialog1.dispose();
}
}
};
timer.addActionListener(listener);
timer.start();
// Wait for action
dialog1.setVisible(true);
// Check result
UpdateInfo info = retriever.getUpdateInfo();
if (info == null) {
JOptionPane.showMessageDialog(this,
//// An error occurred while communicating with the server.
trans.get("pref.dlg.lbl.msg1"),
//// Unable to retrieve update information
trans.get("pref.dlg.lbl.msg2"), JOptionPane.WARNING_MESSAGE, null);
} else if (info.getLatestVersion() == null ||
info.getLatestVersion().equals("") ||
BuildProperties.getVersion().equalsIgnoreCase(info.getLatestVersion())) {
JOptionPane.showMessageDialog(this,
//// You are running the latest version of OpenRocket.
trans.get("pref.dlg.lbl.msg3"),
//// No updates available
trans.get("pref.dlg.lbl.msg4"), JOptionPane.INFORMATION_MESSAGE, null);
} else {
UpdateInfoDialog infoDialog = new UpdateInfoDialog(info);
infoDialog.setVisible(true);
if (infoDialog.isReminderSelected()) {
preferences.putString(SwingPreferences.LAST_UPDATE, "");
} else {
preferences.putString(SwingPreferences.LAST_UPDATE, info.getLatestVersion());
}
}
}
}