package rmblworx.tools.timey.gui.config;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Locale;
import java.util.Properties;
/*
* Copyright 2014-2015 Christian Raue
* MIT License http://opensource.org/licenses/mit-license.php
*/
/**
* Speichern/Laden der GUI-Konfiguration.
* @author Christian Raue {@literal <christian.raue@gmail.com>}
*/
public class ConfigStorage {
public static final String PROP_LOCALE = "locale";
public static final String PROP_MINIMIZE_TO_TRAY = "minimizeToTray";
public static final String PROP_STOPWATCH_SHOW_MILLIS = "stopwatchShowMilliseconds";
public static final String PROP_ACTIVE_TAB = "activeTab";
/**
* @param config zu speichernde Konfiguration
* @param outputStream Ausgabestream
* @throws IOException
*/
public final void saveConfig(final Config config, final OutputStream outputStream) throws IOException {
final Properties props = getConfigAsProperties(config);
props.storeToXML(outputStream, null);
config.setChanged(false);
}
/**
* @param inputStream Eingabestream
* @return geladene Konfiguration
* @throws IOException
*/
public final Config loadConfig(final InputStream inputStream) throws IOException {
return loadConfig(inputStream, false);
}
/**
* @param inputStream Eingabestream
* @param ignoreErrors ob Fehler ignoriert werden sollen
* @return geladene Konfiguration
* @throws IOException
*/
public final Config loadConfig(final InputStream inputStream, final boolean ignoreErrors) throws IOException {
try {
final Properties props = new Properties();
props.loadFromXML(inputStream);
final Config config = getPropertiesAsConfig(props);
config.setChanged(false);
return config;
} catch (final IOException e) {
if (!ignoreErrors) {
throw e;
}
return ConfigManager.getNewDefaultConfig();
}
}
/**
* @param config Konfiguration
* @return Konfiguration als {@code Properties}-Objekt
*/
public final Properties getConfigAsProperties(final Config config) {
final Properties props = new Properties();
props.setProperty(PROP_LOCALE, config.getLocale().toString());
props.setProperty(PROP_MINIMIZE_TO_TRAY, Boolean.toString(config.isMinimizeToTray()));
props.setProperty(PROP_STOPWATCH_SHOW_MILLIS, Boolean.toString(config.isStopwatchShowMilliseconds()));
props.setProperty(PROP_ACTIVE_TAB, Integer.toString(config.getActiveTab()));
return props;
}
/**
* @param props Konfiguration als {@code Properties}-Objekt
* @return Konfiguration
*/
public final Config getPropertiesAsConfig(final Properties props) {
final Config config = ConfigManager.getNewDefaultConfig();
final String propLocale = props.getProperty(PROP_LOCALE);
if (propLocale != null) {
final Locale locale = new Locale(propLocale);
if (Arrays.asList(Config.AVAILABLE_LOCALES).contains(locale)) {
config.setLocale(locale);
}
}
final String propMinimizeToTray = props.getProperty(PROP_MINIMIZE_TO_TRAY);
if (propMinimizeToTray != null) {
config.setMinimizeToTray(Boolean.parseBoolean(propMinimizeToTray));
}
final String propStopwatchShowMilliseconds = props.getProperty(PROP_STOPWATCH_SHOW_MILLIS);
if (propStopwatchShowMilliseconds != null) {
config.setStopwatchShowMilliseconds(Boolean.parseBoolean(propStopwatchShowMilliseconds));
}
try {
config.setActiveTab(Integer.parseInt(props.getProperty(PROP_ACTIVE_TAB)));
} catch (final NumberFormatException e) {
// ignorieren
}
return config;
}
}