// License: GPL. For details, see LICENSE file.
package cadastre_fr;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.GridBagLayout;
import java.util.Collection;
import java.util.HashSet;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.actions.upload.UploadHook;
import org.openstreetmap.josm.command.ChangePropertyCommand;
import org.openstreetmap.josm.data.APIDataSet;
import org.openstreetmap.josm.data.osm.Node;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.data.osm.Way;
import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
import org.openstreetmap.josm.tools.GBC;
/**
* This hook is called at JOSM upload and will check if new nodes and ways provide
* a tag "source=". If not and if auto-sourcing is enabled, it will add
* automatically a tag "source"="Cadastre..." as defined in the plugin preferences.
*/
public class CheckSourceUploadHook implements UploadHook {
/**
* Add the tag "source" if it doesn't exist for all new Nodes and Ways before uploading
*/
@Override
public boolean checkUpload(APIDataSet apiDataSet) {
if (CadastrePlugin.autoSourcing && CadastrePlugin.pluginUsed && !apiDataSet.getPrimitivesToAdd().isEmpty()) {
Collection<OsmPrimitive> sel = new HashSet<>();
for (OsmPrimitive osm : apiDataSet.getPrimitivesToAdd()) {
if ((osm instanceof Way && (osm.getKeys().size() == 0 || !tagSourceExist(osm)))
|| (osm instanceof Node && osm.getKeys().size() > 0 && !tagSourceExist(osm))) {
sel.add(osm);
}
}
if (!sel.isEmpty()) {
displaySource(sel);
}
}
return true;
}
/**
* Check whenever one of the keys of the object is "source"
* @return true if one of keys is "source"
*/
private boolean tagSourceExist(OsmPrimitive osm) {
for (String key : osm.keySet()) {
if (key.equals("source")) {
return true;
}
}
return false;
}
/**
* Displays a screen with the list of objects which will be tagged with
* source="cadastre.." if it is approved.
* @param sel the list of elements added without a key "source"
*/
private void displaySource(Collection<OsmPrimitive> sel) {
if (!sel.isEmpty()) {
JPanel p = new JPanel(new GridBagLayout());
OsmPrimitivRenderer renderer = new OsmPrimitivRenderer();
p.add(new JLabel(tr("Add \"source=...\" to elements?")), GBC.eol());
JTextField tf = new JTextField(CadastrePlugin.source);
p.add(tf, GBC.eol());
JList<OsmPrimitive> l = new JList<>(sel.toArray(new OsmPrimitive[0]));
l.setCellRenderer(renderer);
l.setVisibleRowCount(l.getModel().getSize() < 6 ? l.getModel().getSize() : 10);
p.add(new JScrollPane(l), GBC.eol().fill());
boolean bContinue = JOptionPane.showConfirmDialog(Main.parent, p, tr("Add \"source=...\" to elements?"),
JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION;
if (bContinue)
Main.main.undoRedo.add(new ChangePropertyCommand(sel, "source", tf.getText()));
}
}
}