// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.actions.mapmode;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.data.coor.LatLon;
import org.openstreetmap.josm.data.osm.NoteData;
import org.openstreetmap.josm.gui.NoteInputDialog;
import org.openstreetmap.josm.gui.Notification;
import org.openstreetmap.josm.gui.util.KeyPressReleaseListener;
import org.openstreetmap.josm.tools.CheckParameterUtil;
import org.openstreetmap.josm.tools.ImageProvider;
/**
* Map mode to add a new note. Listens for a mouse click and then
* prompts the user for text and adds a note to the note layer
*/
public class AddNoteAction extends MapMode implements KeyPressReleaseListener {
private final transient NoteData noteData;
/**
* Construct a new map mode.
* @param data Note data container. Must not be null
* @since 11713
*/
public AddNoteAction(NoteData data) {
super(tr("Add a new Note"), "addnote", tr("Add note mode"),
ImageProvider.getCursor("crosshair", "create_note"));
CheckParameterUtil.ensureParameterNotNull(data, "data");
noteData = data;
}
@Override
public String getModeHelpText() {
return tr("Click the location where you wish to create a new note");
}
@Override
public void enterMode() {
super.enterMode();
Main.map.mapView.addMouseListener(this);
Main.map.keyDetector.addKeyListener(this);
}
@Override
public void exitMode() {
super.exitMode();
Main.map.mapView.removeMouseListener(this);
Main.map.keyDetector.removeKeyListener(this);
}
@Override
public void mouseClicked(MouseEvent e) {
if (!SwingUtilities.isLeftMouseButton(e)) {
// allow to pan without distraction
return;
}
Main.map.selectMapMode(Main.map.mapModeSelect);
NoteInputDialog dialog = new NoteInputDialog(Main.parent, tr("Create new note"), tr("Create note"));
dialog.showNoteDialog(tr("Enter a detailed comment to create a note"), ImageProvider.get("dialogs/notes", "note_new"));
if (dialog.getValue() != 1) {
Main.debug("User aborted note creation");
return;
}
String input = dialog.getInputText();
if (input != null && !input.isEmpty()) {
LatLon latlon = Main.map.mapView.getLatLon(e.getPoint().x, e.getPoint().y);
noteData.createNote(latlon, input);
} else {
new Notification(tr("You must enter a comment to create a new note")).setIcon(JOptionPane.WARNING_MESSAGE).show();
}
}
@Override
public void doKeyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
Main.map.selectMapMode(Main.map.mapModeSelect);
}
}
@Override
public void doKeyReleased(KeyEvent e) {
// Do nothing
}
}