/**
* Copyright by Christof Dallermassl
* This program is free software and licensed under GPL.
*/
package at.dallermassl.josm.plugin.colorscheme;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
import org.openstreetmap.josm.gui.preferences.display.ColorPreference;
import org.openstreetmap.josm.tools.GBC;
public class ColorSchemePreference implements SubPreferenceSetting {
private static final String PREF_KEY_SCHEMES_PREFIX = "colorschemes.";
private static final String PREF_KEY_SCHEMES_NAMES = PREF_KEY_SCHEMES_PREFIX + "names";
public static final String PREF_KEY_COLOR_PREFIX = "color.";
private JList<String> schemesList;
private DefaultListModel<String> listModel;
private List<String>colorKeys;
private ColorPreference colorPreference;
/**
* Default Constructor
*/
public ColorSchemePreference() {
}
@Override
public void addGui(final PreferenceTabbedPane gui) {
JPanel panel = new JPanel(new GridBagLayout());
panel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
Map<String, String> colorMap = Main.pref.getAllPrefix(PREF_KEY_COLOR_PREFIX);
colorKeys = new ArrayList<>(colorMap.keySet());
Collections.sort(colorKeys);
listModel = new DefaultListModel<>();
schemesList = new JList<>(listModel);
String schemes = Main.pref.get(PREF_KEY_SCHEMES_NAMES);
StringTokenizer st = new StringTokenizer(schemes, ";");
String schemeName;
while (st.hasMoreTokens()) {
schemeName = st.nextToken();
listModel.addElement(schemeName);
}
JButton useScheme = new JButton(tr("Use"));
useScheme.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
if (schemesList.getSelectedIndex() == -1)
JOptionPane.showMessageDialog(Main.parent, tr("Please select a scheme to use."));
else {
String schemeName = (String) listModel.get(schemesList.getSelectedIndex());
getColorPreference(gui).setColorModel(getColorMap(schemeName));
}
}
});
JButton addScheme = new JButton(tr("Add"));
addScheme.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
String schemeName = JOptionPane.showInputDialog(Main.parent, tr("Color Scheme"));
if (schemeName == null)
return;
schemeName = schemeName.replaceAll("\\.", "_");
setColorScheme(schemeName, getColorPreference(gui).getColorModel());
listModel.addElement(schemeName);
saveSchemeNamesToPref();
}
});
JButton deleteScheme = new JButton(tr("Delete"));
deleteScheme.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
if (schemesList.getSelectedIndex() == -1)
JOptionPane.showMessageDialog(Main.parent, tr("Please select the scheme to delete."));
else {
String schemeName = (String) listModel.get(schemesList.getSelectedIndex());
removeColorSchemeFromPreferences(schemeName);
listModel.remove(schemesList.getSelectedIndex());
saveSchemeNamesToPref();
}
}
});
schemesList.setVisibleRowCount(3);
//schemesList.setToolTipText(tr("The sources (url or filename) of annotation preset definition files. See http://josm.eigenheimstrasse.de/wiki/AnnotationPresets for help."));
useScheme.setToolTipText(tr("Use the selected scheme from the list."));
addScheme.setToolTipText(tr("Use the current colors as a new color scheme."));
deleteScheme.setToolTipText(tr("Delete the selected scheme from the list."));
panel.add(new JLabel(tr("Color Schemes")), GBC.eol().insets(0,5,0,0));
panel.add(new JScrollPane(schemesList), GBC.eol().fill(GBC.BOTH));
JPanel buttonPanel = new JPanel(new GridBagLayout());
panel.add(buttonPanel, GBC.eol().fill(GBC.HORIZONTAL));
buttonPanel.add(Box.createHorizontalGlue(), GBC.std().fill(GBC.HORIZONTAL));
buttonPanel.add(useScheme, GBC.std().insets(0,5,5,0));
buttonPanel.add(addScheme, GBC.std().insets(0,5,5,0));
buttonPanel.add(deleteScheme, GBC.std().insets(0,5,5,0));
JScrollPane scrollpane = new JScrollPane(panel);
scrollpane.setBorder(BorderFactory.createEmptyBorder( 0, 0, 0, 0 ));
gui.getDisplayPreference().getTabPane().addTab(tr("Color Schemes"), scrollpane);
}
@Override
public TabPreferenceSetting getTabPreferenceSetting(final PreferenceTabbedPane gui) {
return gui.getDisplayPreference();
}
/**
* Saves the names of the schemes to the preferences.
*/
public void saveSchemeNamesToPref() {
if (schemesList.getModel().getSize() > 0) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < schemesList.getModel().getSize(); ++i)
sb.append(";"+schemesList.getModel().getElementAt(i));
Main.pref.put(PREF_KEY_SCHEMES_NAMES, sb.toString().substring(1));
} else
Main.pref.put(PREF_KEY_SCHEMES_NAMES, null);
}
@Override
public boolean ok() {
return false;// nothing to do
}
@Override
public boolean isExpert() {
return false;
}
/**
* Remove all color entries for the given scheme from the preferences.
* @param schemeName the name of the scheme.
*/
public void removeColorSchemeFromPreferences(String schemeName) {
// delete color entries for scheme in preferences:
Map<String, String> colors = Main.pref.getAllPrefix(PREF_KEY_SCHEMES_PREFIX + schemeName + ".");
for(String key : colors.keySet()) {
Main.pref.put(key, null);
}
}
/**
* Copy all color entries from the given map to entries in preferences with the scheme name.
* @param schemeName the name of the scheme.
* @param the map containing the color key (without prefix) and the html color values.
*/
public void setColorScheme(String schemeName, Map<String, String> colorMap) {
String key;
for(String colorKey : colorMap.keySet()) {
key = PREF_KEY_SCHEMES_PREFIX + schemeName + "." + PREF_KEY_COLOR_PREFIX + colorKey;
Main.pref.put(key, colorMap.get(colorKey));
}
}
/**
* Reads all colors for a scheme and returns them in a map (key = color key without prefix,
* value = html color code).
* @param schemeName the name of the scheme.
*/
public Map<String, String> getColorMap(String schemeName) {
String colorKey;
String prefix = PREF_KEY_SCHEMES_PREFIX + schemeName + "." + PREF_KEY_COLOR_PREFIX;
Map<String, String>colorMap = new HashMap<>();
for(String schemeColorKey : Main.pref.getAllPrefix(prefix).keySet()) {
colorKey = schemeColorKey.substring(prefix.length());
colorMap.put(colorKey, Main.pref.get(schemeColorKey));
}
return colorMap;
}
public ColorPreference getColorPreference(PreferenceTabbedPane gui) {
if(colorPreference == null) {
for(PreferenceSetting setting : gui.getSettings()) {
if(setting instanceof ColorPreference) {
colorPreference = (ColorPreference) setting;
break;
}
}
}
return colorPreference;
}
}