// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.opendata.core.gui;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.GridBagLayout;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting;
import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
import org.openstreetmap.josm.plugins.opendata.core.modules.ModuleDownloadTask;
import org.openstreetmap.josm.plugins.opendata.core.modules.ModuleInformation;
import org.openstreetmap.josm.tools.GBC;
public class OdPreferenceSetting extends DefaultTabPreferenceSetting {
//private final JRadioButton rbCC43 = new JRadioButton(tr("CC43"));
//private final JRadioButton rbWGS84 = new JRadioButton(tr("WGS84"));
private final JTextField oapi = new JTextField();
private final JTextField xapi = new JTextField();
private final JCheckBox rawData = new JCheckBox(tr("Raw data"));
public final JTabbedPane tabPane = new JTabbedPane();
public JPanel masterPanel;
private final ModulePreference modulePref = new ModulePreference();
public OdPreferenceSetting() {
super(OdConstants.ICON_CORE_48, tr("OpenData Preferences"),
tr("A special handler for various Open Data portals<br/><br/>"+
"Please read the Terms and Conditions of Use of each portal<br/>"+
"before any upload of data loaded by this plugin."));
}
/**
* Replies the collection of module site URLs from where module lists can be downloaded
*
* @return the collection of module site URLs from where module lists can be downloaded
*/
public static final Collection<String> getModuleSites() {
return Main.pref.getCollection(OdConstants.PREF_MODULES_SITES, Arrays.asList(OdConstants.DEFAULT_MODULE_SITES));
}
/**
* Sets the collection of module site URLs.
*
* @param sites the site URLs
*/
public static void setModuleSites(List<String> sites) {
Main.pref.putCollection(OdConstants.PREF_MODULES_SITES, sites);
}
@Override
public void addGui(PreferenceTabbedPane gui) {
masterPanel = gui.createPreferenceTab(this);
modulePref.addGui(gui);
tabPane.add(createGeneralSettings());
JScrollPane scrollpane = new JScrollPane(tabPane);
scrollpane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
masterPanel.add(scrollpane, GBC.eol().fill(GBC.BOTH));
}
protected JPanel createGeneralSettings() {
JPanel general = new JPanel(new GridBagLayout());
general.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
general.setName(tr("General settings"));
// option to enable raw data
rawData.setSelected(Main.pref.getBoolean(OdConstants.PREF_RAWDATA, OdConstants.DEFAULT_RAWDATA));
rawData.setToolTipText(tr("Import only raw data (i.e. do not add/delete tags or replace them by standard OSM tags)"));
general.add(rawData, GBC.eop().insets(0, 0, 0, 0));
// separator
general.add(new JSeparator(SwingConstants.HORIZONTAL), GBC.eol().fill(GBC.HORIZONTAL));
// option to select the coordinates to use
/* JLabel jLabelRes = new JLabel(tr("Coordinates system to read in CSV files:"));
p.add(jLabelRes, GBC.std().insets(0, 5, 10, 0));
ButtonGroup bgCoordinates = new ButtonGroup();
rbCC43.setToolTipText(tr("CC43"));
rbWGS84.setToolTipText(tr("WGS84"));
bgCoordinates.add(rbCC43);
bgCoordinates.add(rbWGS84);
String currentCoordinates = Main.pref.get(PREF_COORDINATES, VALUE_CC9ZONES);
if (currentCoordinates.equals(VALUE_WGS84))
rbWGS84.setSelected(true);
else
rbCC43.setSelected(true);
p.add(rbCC43, GBC.std().insets(5, 0, 5, 0));
p.add(rbWGS84, GBC.eol().fill(GBC.HORIZONTAL).insets(5, 5, 0, 5));*/
// option to set the Overpass API server
JLabel jLabelOapi = new JLabel(tr("Overpass API server:"));
oapi.setText(Main.pref.get(OdConstants.PREF_OAPI, OdConstants.DEFAULT_OAPI));
oapi.setToolTipText(tr("Overpass API server used to download OSM data"));
general.add(jLabelOapi, GBC.std().insets(0, 5, 10, 0));
general.add(oapi, GBC.eol().fill(GBC.HORIZONTAL).insets(5, 5, 200, 5));
// option to set the XAPI server
JLabel jLabelXapi = new JLabel(tr("XAPI server:"));
xapi.setText(Main.pref.get(OdConstants.PREF_XAPI, OdConstants.DEFAULT_XAPI));
xapi.setToolTipText(tr("XAPI server used to download OSM data when Overpass API is not available"));
general.add(jLabelXapi, GBC.std().insets(0, 5, 10, 0));
general.add(xapi, GBC.eol().fill(GBC.HORIZONTAL).insets(5, 5, 200, 5));
// end of dialog, scroll bar
general.add(Box.createVerticalGlue(), GBC.eol().fill(GBC.VERTICAL));
return general;
}
@Override
public boolean ok() {
boolean result = modulePref.ok();
//Main.pref.put(PREF_COORDINATES, rbWGS84.isSelected() ? VALUE_WGS84 : VALUE_CC9ZONES);
Main.pref.put(OdConstants.PREF_OAPI, oapi.getText());
Main.pref.put(OdConstants.PREF_XAPI, xapi.getText());
Main.pref.put(OdConstants.PREF_RAWDATA, rawData.isSelected());
// create a task for downloading modules if the user has activated, yet not downloaded,
// new modules
//
final List<ModuleInformation> toDownload = modulePref.getModulesScheduledForUpdateOrDownload();
final ModuleDownloadTask task;
if (toDownload != null && !toDownload.isEmpty()) {
task = new ModuleDownloadTask(masterPanel, toDownload, tr("Download modules"));
} else {
task = null;
}
// this is the task which will run *after* the modules are downloaded
//
final Runnable continuation = new Runnable() {
@Override
public void run() {
boolean requiresRestart = false;
if (task != null && !task.isCanceled()) {
if (!task.getDownloadedModules().isEmpty()) {
requiresRestart = true;
}
}
// build the messages. We only display one message, including the status
// information from the module download task and - if necessary - a hint
// to restart JOSM
//
StringBuilder sb = new StringBuilder();
sb.append("<html>");
if (task != null && !task.isCanceled()) {
sb.append(ModulePreference.buildDownloadSummary(task));
}
if (requiresRestart) {
sb.append(tr("You have to restart JOSM for some settings to take effect."));
}
sb.append("</html>");
// display the message, if necessary
//
if ((task != null && !task.isCanceled()) || requiresRestart) {
JOptionPane.showMessageDialog(
Main.parent,
sb.toString(),
tr("Warning"),
JOptionPane.WARNING_MESSAGE
);
}
Main.parent.repaint();
}
};
if (task != null) {
// if we have to launch a module download task we do it asynchronously, followed
// by the remaining "save preferences" activites run on the Swing EDT.
//
Main.worker.submit(task);
Main.worker.submit(
new Runnable() {
@Override
public void run() {
SwingUtilities.invokeLater(continuation);
}
}
);
} else {
// no need for asynchronous activities. Simply run the remaining "save preference"
// activities on this thread (we are already on the Swing EDT
//
continuation.run();
}
return task == null ? result : false;
}
}