Ticket #10766: note_save.patch
File note_save.patch, 10.3 KB (added by , 11 years ago) |
---|
-
src/org/openstreetmap/josm/actions/ExtensionFileFilter.java
96 96 "org.openstreetmap.josm.io.OsmGzipExporter", 97 97 "org.openstreetmap.josm.io.OsmBzip2Exporter", 98 98 "org.openstreetmap.josm.io.GeoJSONExporter", 99 "org.openstreetmap.josm.io.WMSLayerExporter" 99 "org.openstreetmap.josm.io.WMSLayerExporter", 100 "org.openstreetmap.josm.io.NoteExporter" 100 101 }; 101 102 102 103 for (String classname : exporterNames) { -
src/org/openstreetmap/josm/data/osm/NoteData.java
36 36 */ 37 37 public NoteData(List<Note> notes) { 38 38 noteList = notes; 39 for (Note note : notes) { 40 if (note.getId() <= newNoteId) { 41 newNoteId = note.getId() - 1; 42 } 43 } 39 44 } 40 45 41 46 /** -
src/org/openstreetmap/josm/gui/layer/NoteLayer.java
8 8 import java.awt.Point; 9 9 import java.awt.event.MouseEvent; 10 10 import java.awt.event.MouseListener; 11 import java.io.File; 11 12 import java.text.SimpleDateFormat; 12 13 import java.util.ArrayList; 13 14 import java.util.List; … … 18 19 import javax.swing.JToolTip; 19 20 20 21 import org.openstreetmap.josm.Main; 22 import org.openstreetmap.josm.actions.SaveActionBase; 21 23 import org.openstreetmap.josm.data.Bounds; 22 24 import org.openstreetmap.josm.data.notes.Note; 23 25 import org.openstreetmap.josm.data.notes.Note.State; … … 28 30 import org.openstreetmap.josm.gui.dialogs.LayerListDialog; 29 31 import org.openstreetmap.josm.gui.dialogs.LayerListPopup; 30 32 import org.openstreetmap.josm.gui.dialogs.NoteDialog; 33 import org.openstreetmap.josm.io.NoteExporter; 31 34 import org.openstreetmap.josm.io.XmlWriter; 32 35 import org.openstreetmap.josm.tools.ColorHelper; 33 36 … … 81 84 } 82 85 83 86 @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 84 98 public void paint(Graphics2D g, MapView mv, Bounds box) { 85 99 for (Note note : noteData.getNotes()) { 86 100 Point p = mv.getPoint(note.getLatLon()); … … 107 121 //closing a note creates an empty comment that we don't want to show 108 122 if (commentText != null && commentText.trim().length() > 0) { 109 123 sb.append(sep); 110 String userName = comment.getUser().getName();124 String userName = XmlWriter.encode(comment.getUser().getName()); 111 125 if (userName == null || userName.trim().length() == 0) { 112 126 userName = "<Anonymous>"; 113 127 } … … 190 204 actions.add(LayerListDialog.getInstance().createShowHideLayerAction()); 191 205 actions.add(LayerListDialog.getInstance().createDeleteLayerAction()); 192 206 actions.add(new LayerListPopup.InfoAction(this)); 207 actions.add(new LayerSaveAction(this)); 208 actions.add(new LayerSaveAsAction(this)); 193 209 return actions.toArray(new Action[actions.size()]); 194 210 } 195 211 … … 216 232 } 217 233 218 234 @Override 235 public File createAndOpenSaveFileChooser() { 236 return SaveActionBase.createAndOpenSaveFileChooser(tr("Save GPX file"), NoteExporter.FILE_FILTER); 237 } 238 239 @Override 219 240 public void mousePressed(MouseEvent e) { } 220 241 221 242 @Override -
src/org/openstreetmap/josm/io/NoteExporter.java
1 // License: GPL. For details, see LICENSE file. 2 package org.openstreetmap.josm.io; 3 4 import static org.openstreetmap.josm.tools.I18n.tr; 5 6 import java.io.File; 7 import java.io.FileOutputStream; 8 import java.io.IOException; 9 import java.io.OutputStream; 10 11 import org.openstreetmap.josm.Main; 12 import org.openstreetmap.josm.actions.ExtensionFileFilter; 13 import org.openstreetmap.josm.gui.layer.Layer; 14 import org.openstreetmap.josm.gui.layer.NoteLayer; 15 16 /** 17 * Exporter to write note data to an XML file 18 */ 19 public 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
136 136 } 137 137 if("comment".equals(qName)) { 138 138 User commentUser = User.createOsmUser(commentUid, commentUsername); 139 if (commentUid == 0) { 140 commentUser = User.getAnonymous(); 141 } 139 142 if(parseMode == NoteParseMode.API) { 140 143 commentIsNew = false; 141 144 } … … 164 167 case "date_created": 165 168 thisNote.setCreatedAt(parseDate(NOTE_DATE_FORMAT, buffer.toString())); 166 169 break; 170 case "date_closed": 171 thisNote.setClosedAt(parseDate(NOTE_DATE_FORMAT, buffer.toString())); 172 break; 167 173 case "date": 168 174 commentCreateDate = parseDate(NOTE_DATE_FORMAT, buffer.toString()); 169 175 break; -
src/org/openstreetmap/josm/io/NoteWriter.java
1 // License: GPL. For details, see LICENSE file. 2 package org.openstreetmap.josm.io; 3 4 import java.io.BufferedWriter; 5 import java.io.OutputStream; 6 import java.io.OutputStreamWriter; 7 import java.io.PrintWriter; 8 import java.nio.charset.StandardCharsets; 9 import java.text.SimpleDateFormat; 10 import java.util.Locale; 11 12 import org.openstreetmap.josm.data.notes.Note; 13 import org.openstreetmap.josm.data.notes.NoteComment; 14 import org.openstreetmap.josm.data.osm.NoteData; 15 import 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 */ 23 public 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 }