Changeset 12683 in josm for trunk/src/org
- Timestamp:
- 2017-08-28T14:44:23+02:00 (7 years ago)
- Location:
- trunk/src/org/openstreetmap/josm
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/gui/datatransfer/importers/TextTagPaster.java
r12620 r12683 3 3 4 4 import static org.openstreetmap.josm.gui.help.HelpUtil.ht; 5 import static org.openstreetmap.josm.tools.I18n.tr; 5 6 7 import java.awt.GridBagLayout; 6 8 import java.awt.datatransfer.DataFlavor; 7 9 import java.awt.datatransfer.UnsupportedFlavorException; … … 9 11 import java.util.Map; 10 12 13 import javax.swing.JLabel; 14 import javax.swing.JOptionPane; 15 import javax.swing.JPanel; 11 16 import javax.swing.TransferHandler.TransferSupport; 12 17 18 import org.openstreetmap.josm.Main; 19 import org.openstreetmap.josm.gui.ExtendedDialog; 20 import org.openstreetmap.josm.gui.datatransfer.ClipboardUtils; 21 import org.openstreetmap.josm.gui.help.HelpUtil; 22 import org.openstreetmap.josm.gui.widgets.UrlLabel; 23 import org.openstreetmap.josm.io.XmlWriter; 24 import org.openstreetmap.josm.tools.GBC; 25 import org.openstreetmap.josm.tools.LanguageInfo.LocaleType; 13 26 import org.openstreetmap.josm.tools.Logging; 14 27 import org.openstreetmap.josm.tools.TextTagParser; 28 import org.openstreetmap.josm.tools.TextTagParser.TagWarningCallback; 15 29 16 30 /** … … 47 61 Map<String, String> tags = getTagsImpl(support); 48 62 if (tags.isEmpty()) { 49 TextTagParser.showBadBufferMessage(HELP);63 showBadBufferMessage(HELP); 50 64 throw new IOException("Invalid tags to paste."); 51 65 } 52 if (!TextTagParser.validateTags(tags )) {66 if (!TextTagParser.validateTags(tags, TextTagPaster::warning)) { 53 67 throw new IOException("Tags to paste are not valid."); 54 68 } … … 59 73 return TextTagParser.readTagsFromText((String) support.getTransferable().getTransferData(df)); 60 74 } 75 76 /** 77 * Default {@link TagWarningCallback} implementation. 78 * Displays a warning about a problematic tag and ask user what to do about it. 79 * @param text Message to display 80 * @param data Tag key and/or value 81 * @param code to use with {@code ExtendedDialog#toggleEnable(String)} 82 * @return 1 to validate and display next warnings if any, 2 to cancel operation, 3 to clear buffer, 4 to paste tags 83 * @since 12683 84 */ 85 public static int warning(String text, String data, String code) { 86 ExtendedDialog ed = new ExtendedDialog( 87 Main.parent, 88 tr("Do you want to paste these tags?"), 89 tr("Ok"), tr("Cancel"), tr("Clear buffer"), tr("Ignore warnings")); 90 ed.setButtonIcons("ok", "cancel", "dialogs/delete", "pastetags"); 91 ed.setContent("<html><b>"+text + "</b><br/><br/><div width=\"300px\">"+XmlWriter.encode(data, true)+"</html>"); 92 ed.setDefaultButton(2); 93 ed.setCancelButton(2); 94 ed.setIcon(JOptionPane.WARNING_MESSAGE); 95 ed.toggleEnable(code); 96 ed.showDialog(); 97 int r = ed.getValue(); 98 if (r == 0) r = 2; 99 // clean clipboard if user asked 100 if (r == 3) ClipboardUtils.copyString(""); 101 return r; 102 } 103 104 /** 105 * Shows message that the buffer can not be pasted, allowing user to clean the buffer 106 * @param helpTopic the help topic of the parent action 107 * TODO: Replace by proper HelpAwareOptionPane instead of self-made help link 108 */ 109 public static void showBadBufferMessage(String helpTopic) { 110 String msg = tr("<html><p> Sorry, it is impossible to paste tags from buffer. It does not contain any JOSM object" 111 + " or suitable text. </p></html>"); 112 JPanel p = new JPanel(new GridBagLayout()); 113 p.add(new JLabel(msg), GBC.eop()); 114 String helpUrl = HelpUtil.getHelpTopicUrl(HelpUtil.buildAbsoluteHelpTopic(helpTopic, LocaleType.DEFAULT)); 115 if (helpUrl != null) { 116 p.add(new UrlLabel(helpUrl), GBC.eop()); 117 } 118 119 ExtendedDialog ed = new ExtendedDialog( 120 Main.parent, 121 tr("Warning"), 122 tr("Ok"), tr("Clear buffer")) 123 .setButtonIcons("ok", "dialogs/delete") 124 .setContent(p) 125 .setDefaultButton(1) 126 .setCancelButton(1) 127 .setIcon(JOptionPane.WARNING_MESSAGE) 128 .toggleEnable("tags.paste.cleanbadbuffer"); 129 130 ed.showDialog(); 131 132 // clean clipboard if user asked 133 if (ed.getValue() == 2) ClipboardUtils.copyString(""); 134 } 61 135 } -
trunk/src/org/openstreetmap/josm/tools/TextTagParser.java
r12382 r12683 5 5 import static org.openstreetmap.josm.tools.I18n.trn; 6 6 7 import java.awt.GridBagLayout;8 7 import java.util.Arrays; 9 8 import java.util.HashMap; … … 13 12 import java.util.regex.Pattern; 14 13 15 import javax.swing.JLabel;16 import javax.swing.JOptionPane;17 import javax.swing.JPanel;18 19 14 import org.openstreetmap.josm.Main; 20 import org.openstreetmap.josm.gui.ExtendedDialog;21 import org.openstreetmap.josm.gui.datatransfer.ClipboardUtils;22 import org.openstreetmap.josm.gui.help.HelpUtil;23 import org.openstreetmap.josm.gui.widgets.UrlLabel;24 import org.openstreetmap.josm.io.XmlWriter;25 import org.openstreetmap.josm.tools.LanguageInfo.LocaleType;26 15 27 16 /** … … 211 200 * Gets a list of tags that are in the given text 212 201 * @param buf The text to parse 202 * @param callback warning callback 213 203 * @return The tags or <code>null</code> if the tags are not valid 214 */ 215 public static Map<String, String> getValidatedTagsFromText(String buf) { 204 * @since 12683 205 */ 206 public static Map<String, String> getValidatedTagsFromText(String buf, TagWarningCallback callback) { 216 207 Map<String, String> tags = readTagsFromText(buf); 217 return validateTags(tags ) ? tags : null;208 return validateTags(tags, callback) ? tags : null; 218 209 } 219 210 … … 258 249 * Check tags for correctness and display warnings if needed 259 250 * @param tags - map key->value to check 251 * @param callback warning callback 260 252 * @return true if the tags should be pasted 261 */ 262 public static boolean validateTags(Map<String, String> tags) { 253 * @since 12683 254 */ 255 public static boolean validateTags(Map<String, String> tags, TagWarningCallback callback) { 263 256 int r; 264 257 int s = tags.size(); 265 258 if (s > MAX_KEY_COUNT) { 266 259 // Use trn() even if for english it makes no sense, as s > 30 267 r = warning(trn("There was {0} tag found in the buffer, it is suspicious!",260 r = callback.warning(trn("There was {0} tag found in the buffer, it is suspicious!", 268 261 "There were {0} tags found in the buffer, it is suspicious!", s, 269 262 s), "", "tags.paste.toomanytags"); … … 274 267 String value = entry.getValue(); 275 268 if (key.length() > MAX_KEY_LENGTH) { 276 r = warning(tr("Key is too long (max {0} characters):", MAX_KEY_LENGTH), key+'='+value, "tags.paste.keytoolong");269 r = callback.warning(tr("Key is too long (max {0} characters):", MAX_KEY_LENGTH), key+'='+value, "tags.paste.keytoolong"); 277 270 if (r == 2 || r == 3) return false; if (r == 4) return true; 278 271 } 279 272 if (!key.matches(KEY_PATTERN)) { 280 r = warning(tr("Suspicious characters in key:"), key, "tags.paste.keydoesnotmatch");273 r = callback.warning(tr("Suspicious characters in key:"), key, "tags.paste.keydoesnotmatch"); 281 274 if (r == 2 || r == 3) return false; if (r == 4) return true; 282 275 } 283 276 if (value.length() > MAX_VALUE_LENGTH) { 284 r = warning(tr("Value is too long (max {0} characters):", MAX_VALUE_LENGTH), value, "tags.paste.valuetoolong");277 r = callback.warning(tr("Value is too long (max {0} characters):", MAX_VALUE_LENGTH), value, "tags.paste.valuetoolong"); 285 278 if (r == 2 || r == 3) return false; if (r == 4) return true; 286 279 } … … 289 282 } 290 283 291 private static int warning(String text, String data, String code) { 292 ExtendedDialog ed = new ExtendedDialog( 293 Main.parent, 294 tr("Do you want to paste these tags?"), 295 tr("Ok"), tr("Cancel"), tr("Clear buffer"), tr("Ignore warnings")); 296 ed.setButtonIcons("ok", "cancel", "dialogs/delete", "pastetags"); 297 ed.setContent("<html><b>"+text + "</b><br/><br/><div width=\"300px\">"+XmlWriter.encode(data, true)+"</html>"); 298 ed.setDefaultButton(2); 299 ed.setCancelButton(2); 300 ed.setIcon(JOptionPane.WARNING_MESSAGE); 301 ed.toggleEnable(code); 302 ed.showDialog(); 303 int r = ed.getValue(); 304 if (r == 0) r = 2; 305 // clean clipboard if user asked 306 if (r == 3) ClipboardUtils.copyString(""); 307 return r; 308 } 309 310 /** 311 * Shows message that the buffer can not be pasted, allowing user to clean the buffer 312 * @param helpTopic the help topic of the parent action 313 * TODO: Replace by proper HelpAwareOptionPane instead of self-made help link 314 */ 315 public static void showBadBufferMessage(String helpTopic) { 316 String msg = tr("<html><p> Sorry, it is impossible to paste tags from buffer. It does not contain any JOSM object" 317 + " or suitable text. </p></html>"); 318 JPanel p = new JPanel(new GridBagLayout()); 319 p.add(new JLabel(msg), GBC.eop()); 320 String helpUrl = HelpUtil.getHelpTopicUrl(HelpUtil.buildAbsoluteHelpTopic(helpTopic, LocaleType.DEFAULT)); 321 if (helpUrl != null) { 322 p.add(new UrlLabel(helpUrl), GBC.eop()); 323 } 324 325 ExtendedDialog ed = new ExtendedDialog( 326 Main.parent, 327 tr("Warning"), 328 tr("Ok"), tr("Clear buffer")) 329 .setButtonIcons("ok", "dialogs/delete") 330 .setContent(p) 331 .setDefaultButton(1) 332 .setCancelButton(1) 333 .setIcon(JOptionPane.WARNING_MESSAGE) 334 .toggleEnable("tags.paste.cleanbadbuffer"); 335 336 ed.showDialog(); 337 338 // clean clipboard if user asked 339 if (ed.getValue() == 2) ClipboardUtils.copyString(""); 284 /** 285 * Called when a problematic tag is encountered. 286 * @since 12683 287 */ 288 @FunctionalInterface 289 public interface TagWarningCallback { 290 /** 291 * Displays a warning about a problematic tag and ask user what to do about it. 292 * @param text Message to display 293 * @param data Tag key and/or value 294 * @param code to use with {@code ExtendedDialog#toggleEnable(String)} 295 * @return 1 to validate and display next warnings if any, 2 to cancel operation, 3 to clear buffer, 4 to paste tags 296 */ 297 int warning(String text, String data, String code); 340 298 } 341 299 }
Note:
See TracChangeset
for help on using the changeset viewer.