Ticket #10766: note_save.patch

File note_save.patch, 10.3 KB (added by ToeBee, 11 years ago)
  • src/org/openstreetmap/josm/actions/ExtensionFileFilter.java

     
    9696                "org.openstreetmap.josm.io.OsmGzipExporter",
    9797                "org.openstreetmap.josm.io.OsmBzip2Exporter",
    9898                "org.openstreetmap.josm.io.GeoJSONExporter",
    99                 "org.openstreetmap.josm.io.WMSLayerExporter"
     99                "org.openstreetmap.josm.io.WMSLayerExporter",
     100                "org.openstreetmap.josm.io.NoteExporter"
    100101        };
    101102
    102103        for (String classname : exporterNames) {
  • src/org/openstreetmap/josm/data/osm/NoteData.java

     
    3636     */
    3737    public NoteData(List<Note> notes) {
    3838        noteList = notes;
     39        for (Note note : notes) {
     40            if (note.getId() <= newNoteId) {
     41                newNoteId = note.getId() - 1;
     42            }
     43        }
    3944    }
    4045
    4146    /**
  • src/org/openstreetmap/josm/gui/layer/NoteLayer.java

     
    88import java.awt.Point;
    99import java.awt.event.MouseEvent;
    1010import java.awt.event.MouseListener;
     11import java.io.File;
    1112import java.text.SimpleDateFormat;
    1213import java.util.ArrayList;
    1314import java.util.List;
     
    1819import javax.swing.JToolTip;
    1920
    2021import org.openstreetmap.josm.Main;
     22import org.openstreetmap.josm.actions.SaveActionBase;
    2123import org.openstreetmap.josm.data.Bounds;
    2224import org.openstreetmap.josm.data.notes.Note;
    2325import org.openstreetmap.josm.data.notes.Note.State;
     
    2830import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
    2931import org.openstreetmap.josm.gui.dialogs.LayerListPopup;
    3032import org.openstreetmap.josm.gui.dialogs.NoteDialog;
     33import org.openstreetmap.josm.io.NoteExporter;
    3134import org.openstreetmap.josm.io.XmlWriter;
    3235import org.openstreetmap.josm.tools.ColorHelper;
    3336
     
    8184    }
    8285
    8386    @Override
     87    public boolean isSavable() {
     88        return true;
     89    }
     90
     91    @Override
     92    public boolean requiresSaveToFile() {
     93        Main.debug("associated notes file: " + getAssociatedFile());
     94        return getAssociatedFile() != null && isModified();
     95    }
     96
     97    @Override
    8498    public void paint(Graphics2D g, MapView mv, Bounds box) {
    8599        for (Note note : noteData.getNotes()) {
    86100            Point p = mv.getPoint(note.getLatLon());
     
    107121                //closing a note creates an empty comment that we don't want to show
    108122                if (commentText != null && commentText.trim().length() > 0) {
    109123                    sb.append(sep);
    110                     String userName = comment.getUser().getName();
     124                    String userName = XmlWriter.encode(comment.getUser().getName());
    111125                    if (userName == null || userName.trim().length() == 0) {
    112126                        userName = "&lt;Anonymous&gt;";
    113127                    }
     
    190204        actions.add(LayerListDialog.getInstance().createShowHideLayerAction());
    191205        actions.add(LayerListDialog.getInstance().createDeleteLayerAction());
    192206        actions.add(new LayerListPopup.InfoAction(this));
     207        actions.add(new LayerSaveAction(this));
     208        actions.add(new LayerSaveAsAction(this));
    193209        return actions.toArray(new Action[actions.size()]);
    194210    }
    195211
     
    216232    }
    217233
    218234    @Override
     235    public File createAndOpenSaveFileChooser() {
     236        return SaveActionBase.createAndOpenSaveFileChooser(tr("Save GPX file"), NoteExporter.FILE_FILTER);
     237    }
     238
     239    @Override
    219240    public void mousePressed(MouseEvent e) { }
    220241
    221242    @Override
  • src/org/openstreetmap/josm/io/NoteExporter.java

     
     1// License: GPL. For details, see LICENSE file.
     2package org.openstreetmap.josm.io;
     3
     4import static org.openstreetmap.josm.tools.I18n.tr;
     5
     6import java.io.File;
     7import java.io.FileOutputStream;
     8import java.io.IOException;
     9import java.io.OutputStream;
     10
     11import org.openstreetmap.josm.Main;
     12import org.openstreetmap.josm.actions.ExtensionFileFilter;
     13import org.openstreetmap.josm.gui.layer.Layer;
     14import org.openstreetmap.josm.gui.layer.NoteLayer;
     15
     16/**
     17 * Exporter to write note data to an XML file
     18 */
     19public class NoteExporter extends FileExporter {
     20
     21    /** File extension filter for .osn files */
     22    public static final ExtensionFileFilter FILE_FILTER = new ExtensionFileFilter(
     23            "osn", "osn", tr("Note Files") + " (*.osn)");
     24
     25    /** Create a new note exporter with the default .osn file filter */
     26    public NoteExporter() {
     27        super(FILE_FILTER);
     28    }
     29
     30    @Override
     31    public boolean acceptFile(File pathname, Layer layer) {
     32        if (!(layer instanceof NoteLayer))
     33            return false;
     34        return super.acceptFile(pathname, layer);
     35    }
     36
     37    @Override
     38    public void exportData(File file, Layer layer) throws IOException {
     39        Main.info("exporting notes to file: " + file);
     40        if (layer instanceof NoteLayer) {
     41            OutputStream os = new FileOutputStream(file);
     42            NoteWriter writer = new NoteWriter(os);
     43            writer.write(((NoteLayer) layer).getNoteData());
     44            os.flush();
     45            writer.close();
     46        }
     47    }
     48}
  • src/org/openstreetmap/josm/io/NoteReader.java

     
    136136            }
    137137            if("comment".equals(qName)) {
    138138                User commentUser = User.createOsmUser(commentUid, commentUsername);
     139                if (commentUid == 0) {
     140                    commentUser = User.getAnonymous();
     141                }
    139142                if(parseMode == NoteParseMode.API) {
    140143                    commentIsNew = false;
    141144                }
     
    164167            case "date_created":
    165168                thisNote.setCreatedAt(parseDate(NOTE_DATE_FORMAT, buffer.toString()));
    166169                break;
     170            case "date_closed":
     171                thisNote.setClosedAt(parseDate(NOTE_DATE_FORMAT, buffer.toString()));
     172                break;
    167173            case "date":
    168174                commentCreateDate = parseDate(NOTE_DATE_FORMAT, buffer.toString());
    169175                break;
  • src/org/openstreetmap/josm/io/NoteWriter.java

     
     1// License: GPL. For details, see LICENSE file.
     2package org.openstreetmap.josm.io;
     3
     4import java.io.BufferedWriter;
     5import java.io.OutputStream;
     6import java.io.OutputStreamWriter;
     7import java.io.PrintWriter;
     8import java.nio.charset.StandardCharsets;
     9import java.text.SimpleDateFormat;
     10import java.util.Locale;
     11
     12import org.openstreetmap.josm.data.notes.Note;
     13import org.openstreetmap.josm.data.notes.NoteComment;
     14import org.openstreetmap.josm.data.osm.NoteData;
     15import org.openstreetmap.josm.data.osm.User;
     16
     17/**
     18 * Class to write a collection of notes out to XML.
     19 * The format is that of the note dump file with the addition of one
     20 * attribute in the comment element to indicate if the comment is a new local
     21 * comment that has not been uploaded to the OSM server yet.
     22 */
     23public class NoteWriter extends XmlWriter {
     24
     25    private final SimpleDateFormat ISO8601_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX", Locale.ENGLISH);
     26
     27    /**
     28     * Create a NoteWriter that will write to the given PrintWriter
     29     * @param out PrintWriter to write XML to
     30     */
     31    public NoteWriter(PrintWriter out) {
     32        super(out);
     33    }
     34
     35    /**
     36     * Create a NoteWriter that will write to a given OutputStream.
     37     * @param out OutputStream to write XML to
     38     */
     39    public NoteWriter(OutputStream out) {
     40        super(new PrintWriter(new BufferedWriter(new OutputStreamWriter(out, StandardCharsets.UTF_8))));
     41    }
     42
     43    /**
     44     * Write notes to designated output target
     45     * @param data Note collection to write
     46     */
     47    public void write(NoteData data) {
     48        out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
     49        out.println("<osm-notes>");
     50        for (Note note : data.getNotes()) {
     51            out.print("  <note ");
     52            out.print("id=\"" + note.getId() + "\" ");
     53            out.print("lat=\"" + note.getLatLon().lat() + "\" ");
     54            out.print("lon=\"" + note.getLatLon().lon() + "\" ");
     55            out.print("created_at=\"" + ISO8601_FORMAT.format(note.getCreatedAt()) + "\" ");
     56            if (note.getClosedAt() != null) {
     57                out.print("closed_at=\"" + ISO8601_FORMAT.format(note.getClosedAt()) + "\" ");
     58            }
     59
     60            out.println(">");
     61            for (NoteComment comment : note.getComments()) {
     62                writeComment(comment);
     63            }
     64            out.println("  </note>");
     65        }
     66
     67        out.println("</osm-notes>");
     68        out.flush();
     69    }
     70
     71    private void writeComment(NoteComment comment) {
     72        out.print("    <comment");
     73        out.print(" action=\"" + comment.getNoteAction() + "\" ");
     74        out.print("timestamp=\"" + ISO8601_FORMAT.format(comment.getCommentTimestamp()) + "\" ");
     75        if (comment.getUser() != null && !comment.getUser().equals(User.getAnonymous())) {
     76            out.print("uid=\"" + comment.getUser().getId() + "\" ");
     77            out.print("user=\"" + encode(comment.getUser().getName()) + "\" ");
     78        }
     79        out.print("is_new=\"" + comment.getIsNew() + "\" ");
     80        out.print(">");
     81        out.print(encode(comment.getText(), false));
     82        out.println("</comment>");
     83    }
     84}