// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.trustosm.actions;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import javax.swing.JOptionPane;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.actions.JosmAction;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.plugins.trustosm.TrustOSMplugin;
import org.openstreetmap.josm.plugins.trustosm.data.TrustOsmPrimitive;
import org.openstreetmap.josm.plugins.trustosm.gui.DownloadSignedOsmDataTask;
import org.openstreetmap.josm.tools.Shortcut;
public class GetMissingDataAction extends JosmAction {
public GetMissingDataAction() {
super(tr("Download OSM"), "getmissing", tr("Get all referenced but not actually present OSM objects from OSM server."),
Shortcut.registerShortcut("gpg:download", tr("Download referenced osm objects..."), KeyEvent.VK_T, Shortcut.CTRL), true);
}
@Override
public void actionPerformed(ActionEvent arg0) {
if (!isEnabled())
return;
downloadMissing();
}
public boolean downloadMissing() {
Collection<OsmPrimitive> missingData = new HashSet<>();
Map<String, TrustOsmPrimitive> trustitems = TrustOSMplugin.signedItems;
getMissing(trustitems, missingData);
int missingCount = missingData.size();
int itemCount = trustitems.size();
if (missingCount == 0) {
JOptionPane.showMessageDialog(Main.parent, tr("{0} Signatures loaded. All referenced OSM objects found.", itemCount));
} else {
int n = JOptionPane.showOptionDialog(Main.parent,
tr("{0} of {1} OSM objects are referenced but not there.\nDo you want to load them from OSM-Server?",
missingCount, itemCount),
tr("Load objects from server"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null);
if (n == JOptionPane.YES_OPTION) {
Main.worker.submit(new DownloadSignedOsmDataTask(missingData, Main.getLayerManager().getEditLayer()));
return true;
}
}
return false;
}
public void getMissing(Map<String, TrustOsmPrimitive> trustitems, Collection<OsmPrimitive> missingData) {
Collection<OsmPrimitive> presentData = Main.getLayerManager().getEditDataSet().allPrimitives();
for (TrustOsmPrimitive t : trustitems.values()) {
OsmPrimitive osm = t.getOsmPrimitive();
if (!presentData.contains(osm))
missingData.add(osm);
}
}
}