package ch.rakudave.jnetmap.util;
import java.awt.BorderLayout;
import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Properties;
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.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingUtilities;
import javax.swing.filechooser.FileNameExtensionFilter;
import ch.rakudave.jnetmap.JNetMap;
import ch.rakudave.jnetmap.ui.UI;
public class Preferences {
private static Properties properties;
public static String get(String key) {
if (properties == null) load();
return properties.getProperty(key);
}
public static Properties getProperties() {
if (properties == null) load();
return properties;
}
public static void load() {
properties = new Properties();
try {
properties.loadFromXML(new FileInputStream(Resources.getPreferenceFile()));
} catch (Exception e) {
try {
File f = new File(Resources.getPreferenceFile());
f.createNewFile();
} catch (Exception ex) {
ex.printStackTrace();
System.out.println("Error: Failed to create preferences file!");
}
}
}
public static void save() {
if (properties == null) return;
try {
properties.storeToXML(new FileOutputStream(Resources.getPreferenceFile()), null, "UTF-8");
} catch (Exception e) {
e.printStackTrace();
System.out.println("Error: Failed to save preferences!");
}
}
private static void set(Object key, Object value) {
if (properties == null) load();
properties.put(key, value);
}
public static void set(Object key, Object value, boolean forceSave) {
set(key, value);
if (forceSave) save();
}
public static void show(final UI owner) {
if (properties == null) load();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
showDialog(owner);
}
});
}
private static void showDialog(final UI owner) {
final Dialog d = new Dialog(owner, Language.get("preferences_title"));
d.setLocation(new Point(owner.getLocation().x + 10, owner.getLocation().y + 45));
//d.setResizable(false);
d.setLayout(new BorderLayout());
d.addWindowListener(new WindowListener() {
@Override public void windowActivated(WindowEvent e) {}
@Override public void windowClosed(WindowEvent e) {}
@Override public void windowClosing(WindowEvent e) {save();d.dispose();}
@Override public void windowDeactivated(WindowEvent e) {}
@Override public void windowDeiconified(WindowEvent e) {}
@Override public void windowIconified(WindowEvent e) {}
@Override public void windowOpened(WindowEvent e) {}
});
d.setPreferredSize(new Dimension(400, 500));
d.setResizable(false);
JTabbedPane tabs = new JTabbedPane();
/* General */
JPanel tabGeneral = new JPanel();
tabGeneral.setLayout(new BoxLayout(tabGeneral, BoxLayout.PAGE_AXIS));
/* Theme */
JPanel generalTheme = new JPanel(new GridLayout(1,2,5,5));
generalTheme.setBorder(BorderFactory.createTitledBorder(Language.get("preferences_general_theme_title")));
generalTheme.setMaximumSize(new Dimension(400, 60));
final JComboBox themeCombo = new JComboBox(Resources.getThemes());
themeCombo.setSelectedItem(Resources.iconTheme);
themeCombo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
set("theme", themeCombo.getSelectedItem().toString(), true);
Resources.iconTheme = themeCombo.getSelectedItem().toString();
owner.constructMenu();
}
});
JButton themeImport = new JButton(Language.get("preferences_general_theme_import"), Resources.getIcon("import"));
themeImport.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
File themeZip = IO.openDialog(d, new FileNameExtensionFilter(".zip", "zip"));
if (themeZip == null) return;
File destination = new File(getClass().getResource(Resources.iconDir).getPath() + "/" + themeZip.getName().replaceFirst("\\.zip", ""));
destination.mkdir();
if (IO.unzip(themeZip, destination)) {
String imported = themeZip.getName().replaceFirst("\\.zip", "");
themeCombo.addItem(imported);
themeCombo.setSelectedItem(imported);
}
}
});
generalTheme.add(themeCombo);
generalTheme.add(themeImport);
/* Window */
JPanel generalWindow = new JPanel(new GridLayout(2, 1, 5, 5));
generalWindow.setMaximumSize(new Dimension(400, 40));
generalWindow.setBorder(BorderFactory.createTitledBorder(Language.get("preferences_general_window_title")));
final JCheckBox windowSize = new JCheckBox(
Language.get("preferences_general_window_size"),
"true".equals(Preferences.get("window.size.remember")));
windowSize.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
set("window.size.remember", windowSize.isSelected()+"");
}
});
final JCheckBox windowLocation = new JCheckBox(
Language.get("preferences_general_window_location"),
"true".equals(Preferences.get("window.location.remember")));
windowLocation.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
set("window.location.remember", windowLocation.isSelected()+"");
}
});
generalWindow.add(windowSize);
generalWindow.add(windowLocation);
tabGeneral.add(Language.getPreferencePanel(owner));
tabGeneral.add(generalTheme);
tabGeneral.add(generalWindow);
tabGeneral.add(Box.createVerticalGlue());
tabs.addTab(Language.get("preferences_general_title"),new JScrollPane(tabGeneral, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER));
tabs.addTab(Language.get("preferences_plugins_title"), JNetMap.getController().getPluginManager().getPreferencePanel());
/* Footer */
JPanel footer = new JPanel();
footer.setLayout(new BoxLayout(footer, BoxLayout.X_AXIS));
footer.setBorder(BorderFactory.createEmptyBorder(3, 8, 2, 3));
JButton footerClose = new JButton(Language.get("buttons_save"), Resources.getIcon("save"));
footerClose.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
save();
d.dispose();
}
});
footer.add(Box.createHorizontalGlue());
footer.add(footerClose);
d.add(tabs, BorderLayout.CENTER);
d.add(footer, BorderLayout.SOUTH);
d.pack();
d.setVisible(true);
}
}