001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.preferences.server;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.awt.GridBagLayout;
007import java.util.Arrays;
008
009import javax.swing.BorderFactory;
010import javax.swing.Box;
011import javax.swing.JCheckBox;
012import javax.swing.JLabel;
013import javax.swing.JPanel;
014
015import org.openstreetmap.josm.data.preferences.BooleanProperty;
016import org.openstreetmap.josm.data.preferences.CollectionProperty;
017import org.openstreetmap.josm.data.preferences.StringProperty;
018import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
019import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
020import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
021import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
022import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
023import org.openstreetmap.josm.gui.widgets.HistoryComboBox;
024import org.openstreetmap.josm.tools.GBC;
025
026/**
027 * Preferences related to Overpass API servers.
028 *
029 * @since 9142
030 */
031public class OverpassServerPreference implements SubPreferenceSetting {
032
033    private static final StringProperty OVERPASS_SERVER = new StringProperty("download.overpass.server",
034            "https://overpass-api.de/api/");
035    private static final CollectionProperty OVERPASS_SERVER_HISTORY = new CollectionProperty("download.overpass.servers",
036            Arrays.asList("https://overpass-api.de/api/", "http://overpass.osm.rambler.ru/cgi/"));
037    private static final BooleanProperty FOR_MULTI_FETCH = new BooleanProperty("download.overpass.for-multi-fetch", false);
038
039    private final HistoryComboBox overpassServer = new HistoryComboBox();
040    private final JCheckBox forMultiFetch = new JCheckBox(tr("Use Overpass server for object downloads"));
041
042    /**
043     * Factory used to create a new {@link OverpassServerPreference}.
044     */
045    public static class Factory implements PreferenceSettingFactory {
046        @Override
047        public PreferenceSetting createPreferenceSetting() {
048            return new OverpassServerPreference();
049        }
050    }
051
052    @Override
053    public TabPreferenceSetting getTabPreferenceSetting(PreferenceTabbedPane gui) {
054        return gui.getServerPreference();
055    }
056
057    @Override
058    public void addGui(PreferenceTabbedPane gui) {
059        final JPanel panel = new JPanel(new GridBagLayout());
060
061        panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
062        panel.add(new JLabel(tr("Overpass server: ")), GBC.std().insets(5, 5, 5, 5));
063        panel.add(overpassServer, GBC.eop().fill(GBC.HORIZONTAL));
064        overpassServer.setPossibleItems(OVERPASS_SERVER_HISTORY.get());
065        overpassServer.setText(OVERPASS_SERVER.get());
066
067        panel.add(forMultiFetch, GBC.eop());
068        forMultiFetch.setSelected(useForMultiFetch());
069
070        panel.add(Box.createVerticalGlue(), GBC.eol().fill());
071
072        getTabPreferenceSetting(gui).addSubTab(this, tr("Overpass server"), panel);
073    }
074
075    @Override
076    public boolean ok() {
077        OVERPASS_SERVER.put(overpassServer.getText());
078        OVERPASS_SERVER_HISTORY.put(overpassServer.getHistory());
079        FOR_MULTI_FETCH.put(forMultiFetch.isSelected());
080        return false;
081    }
082
083    @Override
084    public boolean isExpert() {
085        return true;
086    }
087
088    /**
089     * Returns the URL of the currently selected Overpass server.
090     * @return the URL of the currently selected Overpass server.
091     */
092    public static String getOverpassServer() {
093        return OVERPASS_SERVER.get();
094    }
095
096    /**
097     * Returns true if objects should be fetched from an Overpass server instead of the OSM API.
098     * @return true if objects should be fetched from an Overpass server instead of the OSM API.
099     */
100    public static boolean useForMultiFetch() {
101        return FOR_MULTI_FETCH.get();
102    }
103}