content: /*
   * Universal Password Manager
   * Copyright (C) 2005-2013 Adrian Smith
   *
   * This file is part of Universal Password Manager.
   *
   * Universal Password Manager is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
   * Universal Password Manager is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with Universal Password Manager; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
   */
  package com._17od.upm.gui;
  
  import java.awt.Container;
  import java.awt.FlowLayout;
  import java.awt.GridBagConstraints;
  import java.awt.GridBagLayout;
  import java.awt.Insets;
  import java.awt.event.ActionEvent;
  import java.awt.event.ActionListener;
  import java.awt.event.ItemEvent;
  import java.awt.event.ItemListener;
  import java.io.File;
  import java.util.Locale;
  
  import javax.swing.BorderFactory;
  import javax.swing.Box;
  import javax.swing.BoxLayout;
  import javax.swing.JButton;
  import javax.swing.JCheckBox;
  import javax.swing.JComboBox;
  import javax.swing.JFileChooser;
  import javax.swing.JFrame;
  import javax.swing.JLabel;
  import javax.swing.JOptionPane;
  import javax.swing.JPanel;
  import javax.swing.JPasswordField;
  import javax.swing.JTextField;
  import javax.swing.border.Border;
  import javax.swing.border.EtchedBorder;
  
  import org.apache.commons.codec.binary.Base64;
  
  import com._17od.upm.util.Preferences;
  import com._17od.upm.util.Translator;
  import com._17od.upm.util.Util;
  
  public class OptionsDialog extends EscapeDialog {
  
  	private static final long serialVersionUID = 1L;
  
  	private JTextField dbToLoadOnStartup;
  	private JCheckBox enableProxyCheckbox;
  	private JCheckBox hideAccountPasswordCheckbox;
  	private JCheckBox inclEscCharstoPassCheckbox;
  	private JCheckBox storeWindowPosCheckbox;
  	private JCheckBox appAlwaysonTopCheckbox;
  	private JLabel accountPasswordLengthLabel;
  	private JTextField accountPasswordLength;
  	private JTextField httpProxyHost;
  	private JTextField httpProxyPort;
  	private JTextField httpProxyUsername;
  	private JPasswordField httpProxyPassword;
  	private JCheckBox hidePasswordCheckbox;
  	private JCheckBox databaseAutoLockCheckbox;
  	private JTextField databaseAutoLockTime;
  	private JCheckBox acceptSelfSignedCertsCheckbox;
  	private JLabel proxyLabel;
  	private JLabel proxyPortLabel;
  	private JLabel proxyUsernameLabel;
  	private JLabel proxyPasswordLabel;
  	private JComboBox localeComboBox;
  	private boolean okClicked = false;
  	private JFrame parentFrame;
  	private boolean languageChanged;
  	private char defaultEchoChar;
  
  	public OptionsDialog(JFrame frame) {
  		super(frame, Translator.translate("options"), true);
  
  		Container container = getContentPane();
  
  		// Create a pane with an empty border for spacing
  		Border emptyBorder = BorderFactory.createEmptyBorder(2, 5, 5, 5);
  		JPanel emptyBorderPanel = new JPanel();
  		emptyBorderPanel.setLayout(new BoxLayout(emptyBorderPanel, BoxLayout.Y_AXIS));
  		emptyBorderPanel.setBorder(emptyBorder);
  		container.add(emptyBorderPanel);
  
  		// ******************
  		// *** The DB TO Load On Startup Section
  		// ******************
  		// Create a pane with an title etched border
  		Border etchedBorder = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);
  		Border etchedTitleBorder = BorderFactory.createTitledBorder(etchedBorder,
  				' ' + Translator.translate("general") + ' ');
  		JPanel mainPanel = new JPanel(new GridBagLayout());
  		mainPanel.setBorder(etchedTitleBorder);
  		emptyBorderPanel.add(mainPanel);
  
  		GridBagConstraints c = new GridBagConstraints();
  
  		// The "Database to Load on Startup" row
  		JLabel urlLabel = new JLabel(Translator.translate("dbToLoadOnStartup"));
  		c.gridx = 0;
  		c.gridy = 0;
  		c.anchor = GridBagConstraints.LINE_START;
  		c.insets = new Insets(0, 5, 3, 0);
  		c.weightx = 1;
  		c.weighty = 0;
  		c.gridwidth = 2;
  		c.fill = GridBagConstraints.NONE;
  		mainPanel.add(urlLabel, c);
  
  		// The "Database to Load on Startup" input field row
  		dbToLoadOnStartup = new JTextField(Preferences.get(Preferences.ApplicationOptions.DB_TO_LOAD_ON_STARTUP), 25);
  		dbToLoadOnStartup.setHorizontalAlignment(JTextField.LEFT);
  		c.gridx = 0;
  		c.gridy = 1;
  		c.anchor = GridBagConstraints.LINE_START;
  		c.insets = new Insets(0, 5, 5, 5);
  		c.weightx = 1;
  		c.weighty = 0;
  		c.gridwidth = 1;
  		c.fill = GridBagConstraints.HORIZONTAL;
  		mainPanel.add(dbToLoadOnStartup, c);
  
  		JButton dbToLoadOnStartupButton = new JButton("...");
  		dbToLoadOnStartupButton.addActionListener(new ActionListener() {
  			public void actionPerformed(ActionEvent e) {
  				getDBToLoadOnStartup();
  			}
  		});
  		c.gridx = 1;
  		c.gridy = 1;
  		c.anchor = GridBagConstraints.LINE_END;
  		c.insets = new Insets(0, 0, 5, 5);
  		c.weightx = 0;
  		c.weighty = 0;
  		c.gridwidth = 1;
  		c.fill = GridBagConstraints.NONE;
  		mainPanel.add(dbToLoadOnStartupButton, c);
  
  		// The "Language" label row
  		JLabel localeLabel = new JLabel(Translator.translate("language"));
  		c.gridx = 0;
  		c.gridy = 2;
  		c.anchor = GridBagConstraints.LINE_START;
  		c.insets = new Insets(0, 5, 3, 0);
  		c.weightx = 1;
  		c.weighty = 0;
  		c.gridwidth = 2;
  		c.fill = GridBagConstraints.NONE;
  		mainPanel.add(localeLabel, c);
  
  		// The "Locale" field row
  		localeComboBox = new JComboBox(getSupportedLocaleNames());
  		for (int i = 0; i < localeComboBox.getItemCount(); i++) {
  			// If the locale language is blank then set it to the English
  			// language
  			// I'm not sure why this happens. Maybe it's because the default
  			// locale
  			// is English???
  			String currentLanguage = Translator.getCurrentLocale().getLanguage();
  			if (currentLanguage.equals("")) {
  				currentLanguage = "en";
  			}
  
  			if (currentLanguage.equals(Translator.SUPPORTED_LOCALES[i].getLanguage())) {
  				localeComboBox.setSelectedIndex(i);
  				break;
  			}
  		}
  		c.gridx = 0;
  		c.gridy = 3;
  		c.anchor = GridBagConstraints.LINE_START;
  		c.insets = new Insets(0, 5, 8, 5);
  		c.weightx = 1;
  		c.weighty = 0;
  		c.gridwidth = 2;
  		c.fill = GridBagConstraints.HORIZONTAL;
  		mainPanel.add(localeComboBox, c);
  
  		// The "Hide account password" row
  		Boolean hideAccountPassword = new Boolean(
  				Preferences.get(Preferences.ApplicationOptions.ACCOUNT_HIDE_PASSWORD, "true"));
  		hideAccountPasswordCheckbox = new JCheckBox(Translator.translate("hideAccountPassword"),
  				hideAccountPassword.booleanValue());
  		c.gridx = 0;
  		c.gridy = 4;
  		c.anchor = GridBagConstraints.LINE_START;
  		c.insets = new Insets(0, 2, 5, 0);
  		c.weightx = 1;
  		c.weighty = 0;
  		c.gridwidth = 1;
  		c.fill = GridBagConstraints.NONE;
  		mainPanel.add(hideAccountPasswordCheckbox, c);
  
  		// The "Database auto lock" row
  		Boolean databaseAutoLock = new Boolean(
  				Preferences.get(Preferences.ApplicationOptions.DATABASE_AUTO_LOCK, "false"));
  		databaseAutoLockCheckbox = new JCheckBox(Translator.translate("databaseAutoLock"),
  				databaseAutoLock.booleanValue());
  		c.gridx = 0;
  		c.gridy = 5;
  		c.anchor = GridBagConstraints.LINE_START;
  		c.insets = new Insets(0, 2, 5, 0);
  		c.weightx = 1;
  		c.weighty = 0;
  		c.gridwidth = 1;
  		c.fill = GridBagConstraints.NONE;
  		mainPanel.add(databaseAutoLockCheckbox, c);
  		databaseAutoLockCheckbox.addItemListener(new ItemListener() {
  			public void itemStateChanged(ItemEvent e) {
  				databaseAutoLockTime.setEnabled(e.getStateChange() == ItemEvent.SELECTED);
  			}
  		});
  
  		// The "Database auto lock" field row
  		databaseAutoLockTime = new JTextField(Preferences.get(Preferences.ApplicationOptions.DATABASE_AUTO_LOCK_TIME),
  				5);
  		c.gridx = 1;
  		c.gridy = 5;
  		c.anchor = GridBagConstraints.LINE_START;
  		c.insets = new Insets(0, 5, 5, 0);
  		c.weightx = 1;
  		c.weighty = 0;
  		c.gridwidth = 1;
  		c.fill = GridBagConstraints.HORIZONTAL;
  		mainPanel.add(databaseAutoLockTime, c);
  		databaseAutoLockTime.setEnabled(databaseAutoLockCheckbox.isSelected());
  
  		// The "Generated password length" row
  		accountPasswordLengthLabel = new JLabel(Translator.translate("generatedPasswodLength"));
  		c.gridx = 0;
  		c.gridy = 6;
  		c.anchor = GridBagConstraints.LINE_START;
  		c.insets = new Insets(0, 2, 5, 0);
  		c.weightx = 1;
  		c.weighty = 0;
  		c.gridwidth = 1;
  		c.fill = GridBagConstraints.NONE;
  		mainPanel.add(accountPasswordLengthLabel, c);
  
  		accountPasswordLength = new JTextField(
  				Preferences.get(Preferences.ApplicationOptions.ACCOUNT_PASSWORD_LENGTH, "8"), 5);
  		c.gridx = 1;
  		c.gridy = 6;
  		c.anchor = GridBagConstraints.LINE_START;
  		c.insets = new Insets(0, 5, 5, 0);
  		c.weightx = 1;
  		c.weighty = 0;
  		c.gridwidth = 1;
  		c.fill = GridBagConstraints.HORIZONTAL;
  		mainPanel.add(accountPasswordLength, c);
  
  		// The "Include Escape Characters to Generated Passwords" row
  		Boolean inclEscCharstoPass = new Boolean(
  				Preferences.get(Preferences.ApplicationOptions.INCLUDE_ESCAPE_CHARACTERS, "true"));
  		inclEscCharstoPassCheckbox = new JCheckBox((Translator.translate("includePunctuationCharacters")),
  				inclEscCharstoPass.booleanValue());
  		c.gridx = 0;
  		c.gridy = 7;
  		c.anchor = GridBagConstraints.LINE_START;
  		c.insets = new Insets(0, 2, 5, 0);
  		c.weightx = 1;
  		c.weighty = 0;
  		c.gridwidth = 1;
  		c.fill = GridBagConstraints.NONE;
  		mainPanel.add(inclEscCharstoPassCheckbox, c);
  
  		// The "Store Window position" row
  		Boolean storeWindowPos = Boolean
  				.valueOf(Preferences.get(Preferences.ApplicationOptions.REMEMBER_WINDOW_POSITION, "false"));
  		storeWindowPosCheckbox = new JCheckBox((Translator.translate("storeWindowPosition")),
  				storeWindowPos.booleanValue());
  		c.gridx = 0;
  		c.gridy = 8;
  		c.anchor = GridBagConstraints.LINE_START;
  		c.insets = new Insets(0, 2, 5, 0);
  		c.weightx = 1;
  		c.weighty = 0;
  		c.gridwidth = 1;
  		c.fill = GridBagConstraints.NONE;
  		mainPanel.add(storeWindowPosCheckbox, c);
  
  		// The "Application always on top" row
  		Boolean appAlwaysonTop = new Boolean(
  				Preferences.get(Preferences.ApplicationOptions.MAINWINDOW_ALWAYS_ON_TOP, "false"));
  		appAlwaysonTopCheckbox = new JCheckBox((Translator.translate("applicationAlwaysonTop")),
  				appAlwaysonTop.booleanValue());
  		c.gridx = 0;
  		c.gridy = 9;
  		c.anchor = GridBagConstraints.LINE_START;
  		c.insets = new Insets(0, 2, 5, 0);
  		c.weightx = 1;
  		c.weighty = 0;
  		c.gridwidth = 1;
  		c.fill = GridBagConstraints.NONE;
  		mainPanel.add(appAlwaysonTopCheckbox, c);
  
  		// Some spacing
  		emptyBorderPanel.add(Box.createVerticalGlue());
  
  		// ******************
  		// *** The HTTPS Section
  		// ******************
  		// Create a pane with an title etched border
  		Border httpsEtchedTitleBorder = BorderFactory.createTitledBorder(etchedBorder, " HTTPS ");
  		final JPanel httpsPanel = new JPanel(new GridBagLayout());
  		httpsPanel.setBorder(httpsEtchedTitleBorder);
  		emptyBorderPanel.add(httpsPanel);
  
  		// The "Accept Self Sigend Certificates" checkbox row
  		Boolean acceptSelfSignedCerts = new Boolean(
  				Preferences.get(Preferences.ApplicationOptions.HTTPS_ACCEPT_SELFSIGNED_CERTS, "false"));
  		acceptSelfSignedCertsCheckbox = new JCheckBox(Translator.translate("acceptSelfSignedCerts"),
  				acceptSelfSignedCerts.booleanValue());
  		c.gridx = 0;
  		c.gridy = 0;
  		c.anchor = GridBagConstraints.LINE_START;
  		c.insets = new Insets(0, 2, 5, 0);
  		c.weightx = 1;
  		c.weighty = 0;
  		c.gridwidth = 1;
  		c.fill = GridBagConstraints.HORIZONTAL;
  		httpsPanel.add(acceptSelfSignedCertsCheckbox, c);
  
  		// ******************
  		// *** The Proxy Section
  		// ******************
  		// Create a pane with an title etched border
  		Border proxyEtchedTitleBorder = BorderFactory.createTitledBorder(etchedBorder,
  				' ' + Translator.translate("httpProxy") + ' ');
  		final JPanel proxyPanel = new JPanel(new GridBagLayout());
  		proxyPanel.setBorder(proxyEtchedTitleBorder);
  		emptyBorderPanel.add(proxyPanel);
  
  		// The "Enable Proxy" row
  		Boolean proxyEnabled = new Boolean(Preferences.get(Preferences.ApplicationOptions.HTTP_PROXY_ENABLED));
  		enableProxyCheckbox = new JCheckBox(Translator.translate("enableProxy"), proxyEnabled.booleanValue());
  		enableProxyCheckbox.addItemListener(new ItemListener() {
  			public void itemStateChanged(ItemEvent e) {
  				if (e.getStateChange() == ItemEvent.SELECTED) {
  					enableProxyComponents(true);
  				} else {
  					enableProxyComponents(false);
  				}
  			}
  		});
  		c.gridx = 0;
  		c.gridy = 0;
  		c.anchor = GridBagConstraints.LINE_START;
  		c.insets = new Insets(0, 2, 5, 0);
  		c.weightx = 1;
  		c.weighty = 0;
  		c.gridwidth = 1;
  		c.fill = GridBagConstraints.NONE;
  		proxyPanel.add(enableProxyCheckbox, c);
  
  		// The "HTTP Proxy" label row
  		proxyLabel = new JLabel(Translator.translate("httpProxy"));
  		c.gridx = 0;
  		c.gridy = 1;
  		c.anchor = GridBagConstraints.LINE_START;
  		c.insets = new Insets(0, 5, 3, 0);
  		c.weightx = 1;
  		c.weighty = 0;
  		c.gridwidth = 2;
  		c.fill = GridBagConstraints.NONE;
  		proxyPanel.add(proxyLabel, c);
  
  		// The "HTTP Proxy Port" label
  		proxyPortLabel = new JLabel(Translator.translate("port"));
  		c.gridx = 1;
  		c.gridy = 1;
  		c.anchor = GridBagConstraints.LINE_START;
  		c.insets = new Insets(0, 5, 3, 5);
  		c.weightx = 1;
  		c.weighty = 0;
  		c.gridwidth = 1;
  		c.fill = GridBagConstraints.NONE;
  		proxyPanel.add(proxyPortLabel, c);
  
  		// The "HTTP Proxy" field row
  		httpProxyHost = new JTextField(Preferences.get(Preferences.ApplicationOptions.HTTP_PROXY_HOST), 20);
  		c.gridx = 0;
  		c.gridy = 2;
  		c.anchor = GridBagConstraints.LINE_START;
  		c.insets = new Insets(0, 5, 5, 0);
  		c.weightx = 1;
  		c.weighty = 0;
  		c.gridwidth = 1;
  		c.fill = GridBagConstraints.HORIZONTAL;
  		proxyPanel.add(httpProxyHost, c);
  
  		httpProxyPort = new JTextField(Preferences.get(Preferences.ApplicationOptions.HTTP_PROXY_PORT), 6);
  		c.gridx = 1;
  		c.gridy = 2;
  		c.anchor = GridBagConstraints.LINE_START;
  		c.insets = new Insets(0, 5, 5, 5);
  		c.weightx = 0;
  		c.weighty = 0;
  		c.gridwidth = 1;
  		c.fill = GridBagConstraints.HORIZONTAL;
  		proxyPanel.add(httpProxyPort, c);
  
  		// The "HTTP Proxy Username" label row
  		proxyUsernameLabel = new JLabel(Translator.translate("httpProxyUsername"));
  		c.gridx = 0;
  		c.gridy = 3;
  		c.anchor = GridBagConstraints.LINE_START;
  		c.insets = new Insets(0, 5, 3, 0);
  		c.weightx = 1;
  		c.weighty = 0;
  		c.gridwidth = 2;
  		c.fill = GridBagConstraints.NONE;
  		proxyPanel.add(proxyUsernameLabel, c);
  
  		// The "HTTP Proxy Username" field row
  		httpProxyUsername = new JTextField(Preferences.get(Preferences.ApplicationOptions.HTTP_PROXY_USERNAME), 20);
  		c.gridx = 0;
  		c.gridy = 4;
  		c.anchor = GridBagConstraints.LINE_START;
  		c.insets = new Insets(0, 5, 5, 5);
  		c.weightx = 1;
  		c.weighty = 0;
  		c.gridwidth = 2;
  		c.fill = GridBagConstraints.HORIZONTAL;
  		proxyPanel.add(httpProxyUsername, c);
  
  		// The "HTTP Proxy Password" label row
  		proxyPasswordLabel = new JLabel(Translator.translate("httpProxyPassword"));
  		c.gridx = 0;
  		c.gridy = 5;
  		c.anchor = GridBagConstraints.LINE_START;
  		c.insets = new Insets(0, 5, 3, 0);
  		c.weightx = 1;
  		c.weighty = 0;
  		c.gridwidth = 2;
  		c.fill = GridBagConstraints.NONE;
  		proxyPanel.add(proxyPasswordLabel, c);
  
  		// The "HTTP Proxy Password" field row
  		String encodedPassword = Preferences.get(Preferences.ApplicationOptions.HTTP_PROXY_PASSWORD);
  		String decodedPassword = null;
  		if (encodedPassword != null) {
  			decodedPassword = new String(Base64.decodeBase64(encodedPassword.getBytes()));
  		}
  		httpProxyPassword = new JPasswordField(decodedPassword, 20);
  		c.gridx = 0;
  		c.gridy = 6;
  		c.anchor = GridBagConstraints.LINE_START;
  		c.insets = new Insets(0, 5, 5, 5);
  		c.weightx = 1;
  		c.weighty = 0;
  		c.gridwidth = 1;
  		c.fill = GridBagConstraints.HORIZONTAL;
  		proxyPanel.add(httpProxyPassword, c);
  
  		hidePasswordCheckbox = new JCheckBox(Translator.translate("hide"), true);
  		defaultEchoChar = httpProxyPassword.getEchoChar();
  		hidePasswordCheckbox.addItemListener(new ItemListener() {
  			public void itemStateChanged(ItemEvent e) {
  				if (e.getStateChange() == ItemEvent.SELECTED) {
  					httpProxyPassword.setEchoChar(defaultEchoChar);
  				} else {
  					httpProxyPassword.setEchoChar((char) 0);
  				}
  			}
  		});
  		c.gridx = 1;
  		c.gridy = 6;
  		c.anchor = GridBagConstraints.LINE_START;
  		c.insets = new Insets(0, 5, 5, 0);
  		c.weightx = 0;
  		c.weighty = 0;
  		c.gridwidth = 1;
  		c.fill = GridBagConstraints.NONE;
  		proxyPanel.add(hidePasswordCheckbox, c);
  
  		// Some spacing
  		emptyBorderPanel.add(Box.createVerticalGlue());
  
  		// The buttons row
  		JPanel buttonPanel = new JPanel(new FlowLayout());
  		emptyBorderPanel.add(buttonPanel);
  		JButton okButton = new JButton(Translator.translate("ok"));
  		// Link Enter key to okButton
  		getRootPane().setDefaultButton(okButton);
  		okButton.addActionListener(new ActionListener() {
  			public void actionPerformed(ActionEvent e) {
  				okButtonAction();
  			}
  		});
  		buttonPanel.add(okButton);
  
  		JButton cancelButton = new JButton(Translator.translate("cancel"));
  		cancelButton.addActionListener(new ActionListener() {
  			public void actionPerformed(ActionEvent e) {
  				setVisible(false);
  				dispose();
  			}
  		});
  		buttonPanel.add(cancelButton);
  
  		enableProxyComponents(proxyEnabled.booleanValue());
  	}
  
  	private void enableProxyComponents(boolean enable) {
  		httpProxyHost.setEnabled(enable);
  		httpProxyPort.setEnabled(enable);
  		httpProxyUsername.setEnabled(enable);
  		httpProxyPassword.setEnabled(enable);
  		proxyLabel.setEnabled(enable);
  		proxyPortLabel.setEnabled(enable);
  		proxyUsernameLabel.setEnabled(enable);
  		proxyPasswordLabel.setEnabled(enable);
  		hidePasswordCheckbox.setEnabled(enable);
  	}
  
  	public boolean okClicked() {
  		return okClicked;
  	}
  
  	private void okButtonAction() {
  		try {
  			if (databaseAutoLockCheckbox.isSelected()) {
  				if (databaseAutoLockTime.getText() == null || databaseAutoLockTime.getText().trim().equals("")
  						|| !Util.isNumeric(databaseAutoLockTime.getText())) {
  					JOptionPane.showMessageDialog(OptionsDialog.this,
  							Translator.translate("invalidValueForDatabaseAutoLockTime"),
  							Translator.translate("problem"), JOptionPane.ERROR_MESSAGE);
  					databaseAutoLockTime.requestFocusInWindow();
  					return;
  				}
  			}
  
  			if (accountPasswordLength.getText() == null || accountPasswordLength.getText().trim().equals("")
  					|| !Util.isNumeric(accountPasswordLength.getText())) {
  				JOptionPane.showMessageDialog(OptionsDialog.this,
  						Translator.translate("invalidValueForAccountPasswordLength"), Translator.translate("problem"),
  						JOptionPane.ERROR_MESSAGE);
  				databaseAutoLockTime.requestFocusInWindow();
  				return;
  			}
  
  			Preferences.set(Preferences.ApplicationOptions.DB_TO_LOAD_ON_STARTUP, dbToLoadOnStartup.getText());
  			Preferences.set(Preferences.ApplicationOptions.ACCOUNT_HIDE_PASSWORD,
  					String.valueOf(hideAccountPasswordCheckbox.isSelected()));
  			Preferences.set(Preferences.ApplicationOptions.INCLUDE_ESCAPE_CHARACTERS,
  					String.valueOf(inclEscCharstoPassCheckbox.isSelected()));
  			Preferences.set(Preferences.ApplicationOptions.REMEMBER_WINDOW_POSITION,
  					String.valueOf(storeWindowPosCheckbox.isSelected()));
  			Preferences.set(Preferences.ApplicationOptions.MAINWINDOW_ALWAYS_ON_TOP,
  					String.valueOf(appAlwaysonTopCheckbox.isSelected()));
  			Preferences.set(Preferences.ApplicationOptions.DATABASE_AUTO_LOCK,
  					String.valueOf(databaseAutoLockCheckbox.isSelected()));
  			Preferences.set(Preferences.ApplicationOptions.DATABASE_AUTO_LOCK_TIME, databaseAutoLockTime.getText());
  			Preferences.set(Preferences.ApplicationOptions.ACCOUNT_PASSWORD_LENGTH, accountPasswordLength.getText());
  			Preferences.set(Preferences.ApplicationOptions.HTTPS_ACCEPT_SELFSIGNED_CERTS,
  					String.valueOf(acceptSelfSignedCertsCheckbox.isSelected()));
  			Preferences.set(Preferences.ApplicationOptions.HTTP_PROXY_HOST, httpProxyHost.getText());
  			Preferences.set(Preferences.ApplicationOptions.HTTP_PROXY_PORT, httpProxyPort.getText());
  			Preferences.set(Preferences.ApplicationOptions.HTTP_PROXY_USERNAME, httpProxyUsername.getText());
  			String encodedPassword = new String(
  					Base64.encodeBase64(new String(httpProxyPassword.getPassword()).getBytes()));
  			Preferences.set(Preferences.ApplicationOptions.HTTP_PROXY_PASSWORD, encodedPassword);
  			Preferences.set(Preferences.ApplicationOptions.HTTP_PROXY_ENABLED,
  					String.valueOf(enableProxyCheckbox.isSelected()));
  
  			MainWindow.setAppAlwaysonTop(appAlwaysonTopCheckbox.isSelected());
  
  			// Save the new language and set a flag if it has changed
  			String beforeLocale = Preferences.get(Preferences.ApplicationOptions.LOCALE);
  			Locale selectedLocale = Translator.SUPPORTED_LOCALES[localeComboBox.getSelectedIndex()];
  			String afterLocale = selectedLocale.getLanguage();
  			if (!afterLocale.equals(beforeLocale)) {
  				Preferences.set(Preferences.ApplicationOptions.LOCALE, selectedLocale.getLanguage());
  				Translator.loadBundle(selectedLocale);
  				languageChanged = true;
  			}
  
  			Preferences.save();
  			setVisible(false);
  			dispose();
  			okClicked = true;
  		} catch (Exception e) {
  			JOptionPane.showMessageDialog(parentFrame, e.getStackTrace(), Translator.translate("error"),
  					JOptionPane.ERROR_MESSAGE);
  		}
  	}
  
  	private void getDBToLoadOnStartup() {
  		JFileChooser fc = new JFileChooser();
  		fc.setDialogTitle(Translator.translate("dbToOpenOnStartup"));
  		int returnVal = fc.showOpenDialog(this);
  
  		if (returnVal == JFileChooser.APPROVE_OPTION) {
  			File databaseFile = fc.getSelectedFile();
  			dbToLoadOnStartup.setText(databaseFile.getAbsoluteFile().toString());
  		}
  	}
  
  	private Object[] getSupportedLocaleNames() {
  		Object[] names = new Object[Translator.SUPPORTED_LOCALES.length];
  
  		for (int i = 0; i < Translator.SUPPORTED_LOCALES.length; i++) {
  			names[i] = Translator.SUPPORTED_LOCALES[i].getDisplayLanguage(Translator.getCurrentLocale()) + " ("
  					+ Translator.SUPPORTED_LOCALES[i].getDisplayLanguage(Translator.SUPPORTED_LOCALES[i]) + ')';
  		}
  
  		return names;
  	}
  
  	public boolean hasLanguageChanged() {
  		return languageChanged;
  	}
  
  }