/*
* This scripts sets a sequence of consecutive house numbers on the currently selected nodes.
*
*/
import java.awt.event.WindowAdapter;
import java.awt.BorderLayout;
import javax.swing.JComponent;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowListener;
import javax.swing.KeyStroke;
import groovy.swing.SwingBuilder;
import groovy.util.ProxyGenerator;
import javax.swing.JOptionPane;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.command.ChangeCommand;
import org.openstreetmap.josm.command.SequenceCommand;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.gui.HelpAwareOptionPane;
import org.openstreetmap.josm.gui.layer.Layer;
import org.openstreetmap.josm.gui.layer.OsmDataLayer;
import org.openstreetmap.josm.gui.widgets.HtmlPanel;
import org.openstreetmap.josm.gui.widgets.SelectAllOnFocusGainedDecorator;
import org.openstreetmap.josm.tools.ImageProvider;
import org.openstreetmap.josm.tools.WindowGeometry;
import org.openstreetmap.josm.data.osm.DataSet
import org.openstreetmap.josm.data.osm.Node;
import javax.swing.JDialog;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JLabel;
import java.awt.event.FocusListener;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.JTextField;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.Dimension;
import java.awt.Dialog.ModalityType;
import java.awt.event.WindowEvent;
class AddHouseNumberDialog extends JDialog {
static private AddHouseNumberDialog instance;
static def AddHouseNumberDialog getInstance() {
if (instance == null){
instance = new AddHouseNumberDialog()
}
return instance
}
private JTextField tfStart;
private JTextField tfIncrement;
private def actApply;
public AddHouseNumberDialog(){
super(Main.parent,true)
build();
}
def buildInfoPanel() {
def info = new HtmlPanel(
"""
Enter the first house number to be applied to the currently selected nodes
and the increment between consecutive house numbers.
"""
)
}
def buildInputPanel() {
SwingBuilder swing = new SwingBuilder()
return swing.panel(){
emptyBorder([5,5,5,5],parent:true)
gridBagLayout()
label(text: "Start:",
horizontalAlignment: JLabel.LEFT,
constraints: gbc(gridx:0,gridy:0,weightx:0.0, weighty:0.0, fill: GridBagConstraints.NONE, anchor: GridBagConstraints.WEST)
)
tfStart = textField(constraints: gbc(gridx:1,gridy:0,weightx:1.0, weighty:0.0, fill: GridBagConstraints.HORIZONTAL, insets:[2,2,2,2]))
SelectAllOnFocusGainedDecorator.decorate(tfStart)
label(text: "Increment:", horizontalAlignment: JLabel.LEFT, constraints: gbc(gridx:0,gridy:1,weightx:0.0, weighty:0.0, anchor: GridBagConstraints.WEST, insets:[2,2,2,2]))
tfIncrement = textField(constraints: gbc(gridx:1,gridy:1,weightx:1.0, weighty:0.0, fill: GridBagConstraints.HORIZONTAL, anchor: GridBagConstraints.WEST, insets:[2,2,2,2]))
SelectAllOnFocusGainedDecorator.decorate(tfIncrement)
panel(constraints: gbc(gridx:0,gridy:2,weightx:1.0, weighty:1.0, gridwidth:2, fill: GridBagConstraints.BOTH, insets:[2,2,2,2]))
tfIncrement.text = "2"
}
}
def buildControlButtonPanel() {
SwingBuilder swing = new SwingBuilder()
return swing.panel(layout: new FlowLayout(FlowLayout.CENTER)) {
actApply = action(name: "Apply", smallIcon: ImageProvider.get("ok"), closure: {apply(); setVisible(false)})
def btnApply = button(action: actApply)
btnApply.setFocusable(true)
btnApply.registerKeyboardAction(actApply, KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0, false), JComponent.WHEN_FOCUSED)
button(text: "Cancel", icon: ImageProvider.get("cancel"), actionPerformed: {setVisible(false)})
}
}
def apply() {
def start
def incr
try {
start = tfStart.text.trim().toInteger()
incr = tfIncrement.text.trim().toInteger()
} catch(NumberFormatException e){
e.printStackTrace()
return
}
def nodes = Main?.map?.mapView?.editLayer?.data?.getSelectedNodes()?.asList()
if (nodes == null || nodes.isEmpty()) return
def cmds = nodes.collect { Node n ->
Node nn = new Node(n)
nn.put("addr:housenumber", start.toString())
start += incr
return new ChangeCommand(n, nn)
}
Main.main.undoRedo.add(new SequenceCommand("Setting house numbers", cmds))
}
def build() {
title = "Set house numbers"
def cp = getContentPane()
cp.setLayout(new BorderLayout())
cp.add(buildInfoPanel(), BorderLayout.NORTH)
cp.add(buildInputPanel(), BorderLayout.CENTER)
cp.add(buildControlButtonPanel(), BorderLayout.SOUTH)
addWindowListener([windowActivated: {tfStart.requestFocusInWindow()}] as WindowAdapter)
getRootPane().registerKeyboardAction(actApply, KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,KeyEvent.CTRL_MASK, false), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
}
@Override
public void setVisible(boolean b) {
if (b){
WindowGeometry.centerInWindow(getParent(), new Dimension(400,200)).applySafe(this)
}
super.setVisible(b);
}
}
AddHouseNumberDialog.instance.setVisible(true)