// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.preferences.advanced;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.swing.AbstractAction;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileFilter;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.actions.DiskAccessAction;
import org.openstreetmap.josm.data.CustomConfigurator;
import org.openstreetmap.josm.data.Preferences;
import org.openstreetmap.josm.data.preferences.Setting;
import org.openstreetmap.josm.gui.widgets.AbstractFileChooser;
import org.openstreetmap.josm.tools.Utils;
/**
* Action that exports some fragment of settings to custom configuration file
*/
public class ExportProfileAction extends AbstractAction {
private final String prefPattern;
private final String schemaKey;
private final transient Preferences prefs;
/**
* Constructs a new {@code ExportProfileAction}.
* @param prefs preferences
* @param schemaKey filename prefix
* @param prefPattern preference key pattern used to determine which entries are exported
*/
public ExportProfileAction(Preferences prefs, String schemaKey, String prefPattern) {
super(tr("Save {0} profile", tr(schemaKey)));
this.prefs = prefs;
this.prefPattern = prefPattern;
this.schemaKey = schemaKey;
}
@Override
public void actionPerformed(ActionEvent ae) {
List<String> keys = new ArrayList<>();
Map<String, Setting<?>> all = prefs.getAllSettings();
for (String key: all.keySet()) {
if (key.matches(prefPattern)) {
keys.add(key);
}
}
if (keys.isEmpty()) {
if (!GraphicsEnvironment.isHeadless()) {
JOptionPane.showMessageDialog(Main.parent,
tr("All the preferences of this group are default, nothing to save"), tr("Warning"), JOptionPane.WARNING_MESSAGE);
}
return;
}
File f = askUserForCustomSettingsFile();
if (f != null)
CustomConfigurator.exportPreferencesKeysToFile(f.getAbsolutePath(), false, keys);
}
private File askUserForCustomSettingsFile() {
String title = tr("Choose profile file");
FileFilter filter = new FileFilter() {
@Override
public boolean accept(File f) {
return f.isDirectory() || (Utils.hasExtension(f, "xml") && f.getName().toLowerCase(Locale.ENGLISH).startsWith(schemaKey));
}
@Override
public String getDescription() {
return tr("JOSM custom settings files (*.xml)");
}
};
if (!GraphicsEnvironment.isHeadless()) {
AbstractFileChooser fc = DiskAccessAction.createAndOpenFileChooser(false, false, title, filter,
JFileChooser.FILES_ONLY, "customsettings.lastDirectory");
if (fc != null) {
File sel = fc.getSelectedFile();
if (!sel.getName().endsWith(".xml"))
sel = new File(sel.getAbsolutePath()+".xml");
if (!sel.getName().startsWith(schemaKey)) {
sel = new File(sel.getParentFile().getAbsolutePath()+'/'+schemaKey+'_'+sel.getName());
}
return sel;
}
}
return null;
}
}