// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.fixAddresses;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.Collection;
import org.openstreetmap.josm.actions.JosmAction;
import org.openstreetmap.josm.data.SelectionChangedListener;
import org.openstreetmap.josm.data.osm.DataSet;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.plugins.fixAddresses.gui.AddressEditDialog;
import org.openstreetmap.josm.tools.Shortcut;
/**
* Action to find and fix addresses without (valid) streets. It launches an dialog
* instance of {@link AddressEditDialog}.
*
* @author Oliver Wieland <oliver.wieland@online.de>
*/
@SuppressWarnings("serial")
public class FixUnresolvedStreetsAction extends JosmAction implements SelectionChangedListener {
private AddressEditContainer addressEditContainer;
private Collection<? extends OsmPrimitive> newSelection;
public FixUnresolvedStreetsAction() {
super(tr("Fix street addresses"), "fixstreets_24",
tr("Find and fix addresses without (valid) streets."),
Shortcut.registerShortcut("tools:AddressEdit", tr("Tool: {0}",
tr("Address Edit")), KeyEvent.VK_X, Shortcut.CTRL_SHIFT), false);
setEnabled(false);
addressEditContainer = new AddressEditContainer();
DataSet.addSelectionListener(this);
}
@Override
public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
/* remember new selection for actionPerformed */
this.newSelection = newSelection;
}
@Override
public void actionPerformed(ActionEvent arg0) {
if (addressEditContainer != null) {
addressEditContainer.attachToDataSet(newSelection);
try {
//generateTagCode(addressEditContainer);
AddressEditDialog dlg = new AddressEditDialog(addressEditContainer);
dlg.setVisible(true);
} finally {
addressEditContainer.detachFromDataSet();
}
}
}
@Override
protected void updateEnabledState() {
setEnabled(getLayerManager().getEditDataSet() != null);
}
@Override
protected void updateEnabledState(
Collection<? extends OsmPrimitive> selection) {
// Enable button if there is either a selection or at least a data set
setEnabled((selection != null && !selection.isEmpty()) || getLayerManager().getEditDataSet() != null);
}
/* This code is abused to generate tag utility code */
@SuppressWarnings("unused")
private void generateTagCode(AddressEditContainer addrVisitor) {
for (String tag : addrVisitor.getTags()) {
String methodName = createMethodName(tag);
// CHECKSTYLE.OFF: LineLength
System.out.println(String.format(
"/** Check if OSM primitive has a tag '%s'.\n * @param osmPrimitive The OSM entity to check.*/\npublic static boolean has%sTag(OsmPrimitive osmPrimitive) {\n return osmPrimitive != null ? osmPrimitive.hasKey(%s_TAG) : false;\n}\n",
tag, methodName, tag.toUpperCase()
.replaceAll(":", "_")));
System.out.println(String.format(
"/** Gets the value of tag '%s'.\n * @param osmPrimitive The OSM entity to check.*/\npublic static String get%sValue(OsmPrimitive osmPrimitive) {\n return osmPrimitive != null ? osmPrimitive.get(%s_TAG) : null;\n}\n",
tag, methodName, tag.toUpperCase()
.replaceAll(":", "_")));
// CHECKSTYLE.ON: LineLength
}
for (String tag : addrVisitor.getTags()) {
System.out.println(String.format(
"public static final String %s_TAG = \"%s\";", tag
.toUpperCase().replaceAll(":", "_"), tag));
}
for (String value : addrVisitor.getValues().keySet()) {
String tag = addrVisitor.getValues().get(value);
String tags = tag.toUpperCase().replaceAll(":", "_");
String values = value.toUpperCase().replaceAll(":", "_");
System.out.println(String.format(
"public static final String %s_%s_VALUE = \"%s\";", tags, values, value));
}
}
private String createMethodName(String osmName) {
StringBuffer result = new StringBuffer(osmName.length());
boolean nextUp = false;
for (int i = 0; i < osmName.length(); i++) {
char c = osmName.charAt(i);
if (i == 0) {
result.append(Character.toUpperCase(c));
continue;
}
if (c == '_' || c == ':') {
nextUp = true;
} else {
if (nextUp) {
result.append(Character.toUpperCase(c));
nextUp = false;
} else {
result.append(c);
}
}
}
return result.toString();
}
}