001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.preferences.advanced;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.awt.GraphicsEnvironment;
007import java.awt.event.ActionEvent;
008import java.io.File;
009import java.util.ArrayList;
010import java.util.List;
011import java.util.Locale;
012import java.util.Map;
013
014import javax.swing.AbstractAction;
015import javax.swing.JFileChooser;
016import javax.swing.JOptionPane;
017import javax.swing.filechooser.FileFilter;
018
019import org.openstreetmap.josm.actions.DiskAccessAction;
020import org.openstreetmap.josm.data.Preferences;
021import org.openstreetmap.josm.gui.MainApplication;
022import org.openstreetmap.josm.gui.io.CustomConfigurator;
023import org.openstreetmap.josm.gui.widgets.AbstractFileChooser;
024import org.openstreetmap.josm.spi.preferences.Setting;
025import org.openstreetmap.josm.tools.Utils;
026
027/**
028 * Action that exports some fragment of settings to custom configuration file
029 */
030public class ExportProfileAction extends AbstractAction {
031    private final String prefPattern;
032    private final String schemaKey;
033    private final transient Preferences prefs;
034
035    /**
036     * Constructs a new {@code ExportProfileAction}.
037     * @param prefs preferences
038     * @param schemaKey filename prefix
039     * @param prefPattern preference key pattern used to determine which entries are exported
040     */
041    public ExportProfileAction(Preferences prefs, String schemaKey, String prefPattern) {
042        super(tr("Save {0} profile", tr(schemaKey)));
043        this.prefs = prefs;
044        this.prefPattern = prefPattern;
045        this.schemaKey = schemaKey;
046    }
047
048    @Override
049    public void actionPerformed(ActionEvent ae) {
050        List<String> keys = new ArrayList<>();
051        Map<String, Setting<?>> all = prefs.getAllSettings();
052        for (String key: all.keySet()) {
053            if (key.matches(prefPattern)) {
054                keys.add(key);
055            }
056        }
057        if (keys.isEmpty()) {
058            JOptionPane.showMessageDialog(MainApplication.getMainFrame(),
059                    tr("All the preferences of this group are default, nothing to save"), tr("Warning"), JOptionPane.WARNING_MESSAGE);
060            return;
061        }
062        File f = askUserForCustomSettingsFile();
063        if (f != null)
064           CustomConfigurator.exportPreferencesKeysToFile(f.getAbsolutePath(), false, keys);
065    }
066
067    private File askUserForCustomSettingsFile() {
068        String title = tr("Choose profile file");
069
070        FileFilter filter = new FileFilter() {
071            @Override
072            public boolean accept(File f) {
073                return f.isDirectory() || (Utils.hasExtension(f, "xml") && f.getName().toLowerCase(Locale.ENGLISH).startsWith(schemaKey));
074            }
075
076            @Override
077            public String getDescription() {
078                return tr("JOSM custom settings files (*.xml)");
079            }
080        };
081        if (!GraphicsEnvironment.isHeadless()) {
082            AbstractFileChooser fc = DiskAccessAction.createAndOpenFileChooser(false, false, title, filter,
083                    JFileChooser.FILES_ONLY, "customsettings.lastDirectory");
084            if (fc != null) {
085                File sel = fc.getSelectedFile();
086                if (!sel.getName().endsWith(".xml"))
087                    sel = new File(sel.getAbsolutePath()+".xml");
088                if (!sel.getName().startsWith(schemaKey)) {
089                    sel = new File(sel.getParentFile().getAbsolutePath()+'/'+schemaKey+'_'+sel.getName());
090                }
091                return sel;
092            }
093        }
094        return null;
095    }
096}