Changeset 7299 in josm
- Timestamp:
- 2014-07-09T22:15:41+02:00 (11 years ago)
- Location:
- trunk/src/org/openstreetmap/josm
- Files:
-
- 2 added
- 1 deleted
- 30 edited
- 3 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/actions/search/SearchCompiler.java
r7012 r7299 27 27 import org.openstreetmap.josm.data.osm.RelationMember; 28 28 import org.openstreetmap.josm.data.osm.Way; 29 import org.openstreetmap.josm.tools.DateUtils;30 29 import org.openstreetmap.josm.tools.Geometry; 31 30 import org.openstreetmap.josm.tools.Predicate; 31 import org.openstreetmap.josm.tools.date.DateUtils; 32 32 33 33 /** -
trunk/src/org/openstreetmap/josm/data/gpx/WayPoint.java
r7005 r7299 12 12 import org.openstreetmap.josm.data.coor.LatLon; 13 13 import org.openstreetmap.josm.data.projection.Projections; 14 import org.openstreetmap.josm.tools.PrimaryDateParser; 14 import org.openstreetmap.josm.tools.date.PrimaryDateParser; 15 15 import org.openstreetmap.josm.tools.template_engine.TemplateEngineDataProvider; 16 16 -
trunk/src/org/openstreetmap/josm/data/imagery/WmsCache.java
r7132 r7299 14 14 import java.lang.ref.SoftReference; 15 15 import java.net.URLConnection; 16 import java.text.SimpleDateFormat;17 16 import java.util.ArrayList; 18 17 import java.util.Calendar; … … 45 44 import org.openstreetmap.josm.tools.ImageProvider; 46 45 import org.openstreetmap.josm.tools.Utils; 46 import org.openstreetmap.josm.tools.date.DateUtils; 47 47 48 48 public class WmsCache { … … 558 558 559 559 public static String printDate(Calendar c) { 560 return (new SimpleDateFormat("yyyy-MM-dd")).format(c.getTime());560 return DateUtils.newIsoDateFormat().format(c.getTime()); 561 561 } 562 562 -
trunk/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java
r7005 r7299 46 46 import org.openstreetmap.josm.gui.mappaint.xml.XmlStyleSource; 47 47 import org.openstreetmap.josm.gui.widgets.JosmTextArea; 48 import org.openstreetmap.josm.tools.DateUtils;49 48 import org.openstreetmap.josm.tools.GBC; 50 49 import org.openstreetmap.josm.tools.Geometry; 51 50 import org.openstreetmap.josm.tools.WindowGeometry; 51 import org.openstreetmap.josm.tools.date.DateUtils; 52 52 53 53 /** -
trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
r7019 r7299 90 90 91 91 /** 92 * Property to enable dy anmic buttons globally.92 * Property to enable dynamic buttons globally. 93 93 * @since 6752 94 94 */ -
trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheTableCellRenderer.java
r6214 r7299 17 17 import org.openstreetmap.josm.data.osm.Changeset; 18 18 import org.openstreetmap.josm.data.osm.User; 19 import org.openstreetmap.josm.tools.date.DateUtils; 19 20 20 21 /** … … 90 91 setText(""); 91 92 } else { 92 setText(Date Format.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(d));93 setText(DateUtils.formatDateTime(d, DateFormat.SHORT, DateFormat.SHORT)); 93 94 } 94 95 setToolTipText(""); -
trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDetailPanel.java
r7005 r7299 41 41 import org.openstreetmap.josm.gui.widgets.JosmTextField; 42 42 import org.openstreetmap.josm.tools.ImageProvider; 43 import org.openstreetmap.josm.tools.date.DateUtils; 43 44 44 45 /** … … 225 226 } 226 227 tfUser.setText(msg); 227 DateFormat sdf = Date Format.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);228 DateFormat sdf = DateUtils.getDateTimeFormat(DateFormat.SHORT, DateFormat.SHORT); 228 229 229 230 tfCreatedOn.setText(cs.getCreatedAt() == null ? "" : sdf.format(cs.getCreatedAt())); -
trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/query/AdvancedChangesetQueryPanel.java
r7187 r7299 1065 1065 1066 1066 public String getStandardTooltipText() { 1067 Date date = new Date(); 1067 1068 return tr( 1068 1069 "Please enter a date in the usual format for your locale.<br>" … … 1071 1072 + "Example: {2}<br>" 1072 1073 + "Example: {3}<br>", 1073 DateFormat.getDateInstance(DateFormat.SHORT, Locale.getDefault()).format( new Date()),1074 DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.getDefault()).format( new Date()),1075 DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault()).format( new Date()),1076 DateFormat.getDateInstance(DateFormat.FULL, Locale.getDefault()).format( new Date())1074 DateFormat.getDateInstance(DateFormat.SHORT, Locale.getDefault()).format(date), 1075 DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.getDefault()).format(date), 1076 DateFormat.getDateInstance(DateFormat.LONG, Locale.getDefault()).format(date), 1077 DateFormat.getDateInstance(DateFormat.FULL, Locale.getDefault()).format(date) 1077 1078 ); 1078 1079 } … … 1129 1130 1130 1131 public String getStandardTooltipText() { 1132 Date date = new Date(); 1131 1133 return tr( 1132 1134 "Please enter a valid time in the usual format for your locale.<br>" … … 1135 1137 + "Example: {2}<br>" 1136 1138 + "Example: {3}<br>", 1137 DateFormat.getTimeInstance(DateFormat.SHORT, Locale.getDefault()).format( new Date()),1138 DateFormat.getTimeInstance(DateFormat.MEDIUM, Locale.getDefault()).format( new Date()),1139 DateFormat.getTimeInstance(DateFormat.LONG, Locale.getDefault()).format( new Date()),1140 DateFormat.getTimeInstance(DateFormat.FULL, Locale.getDefault()).format( new Date())1139 DateFormat.getTimeInstance(DateFormat.SHORT, Locale.getDefault()).format(date), 1140 DateFormat.getTimeInstance(DateFormat.MEDIUM, Locale.getDefault()).format(date), 1141 DateFormat.getTimeInstance(DateFormat.LONG, Locale.getDefault()).format(date), 1142 DateFormat.getTimeInstance(DateFormat.FULL, Locale.getDefault()).format(date) 1141 1143 ); 1142 1144 } -
trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/query/UrlBasedQueryPanel.java
r6990 r7299 140 140 try { 141 141 return ChangesetQuery.buildFromUrlQuery(query); 142 } catch(ChangesetQueryUrlException e) { 142 } catch (ChangesetQueryUrlException e) { 143 Main.warn(e.getMessage()); 143 144 return null; 144 145 } -
trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java
r7025 r7299 46 46 import org.openstreetmap.josm.gui.layer.OsmDataLayer; 47 47 import org.openstreetmap.josm.tools.CheckParameterUtil; 48 import org.openstreetmap.josm.tools.date.DateUtils; 48 49 49 50 /** … … 430 431 HistoryOsmPrimitive p3 = getPrimitive(row); 431 432 if (p3 != null && p3.getTimestamp() != null) 432 return Date Format.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(p3.getTimestamp());433 return DateUtils.formatDateTime(p3.getTimestamp(), DateFormat.SHORT, DateFormat.SHORT); 433 434 return null; 434 435 case 4: -
trunk/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java
r6865 r7299 32 32 import org.openstreetmap.josm.tools.GBC; 33 33 import org.openstreetmap.josm.tools.Utils; 34 import org.openstreetmap.josm.tools.date.DateUtils; 34 35 35 36 /** 36 37 * VersionInfoPanel is an UI component which displays the basic properties of a version 37 38 * of a {@link OsmPrimitive}. 38 * 39 * @since 1709 39 40 */ 40 41 public class VersionInfoPanel extends JPanel implements Observer{ … … 130 131 String date = "?"; 131 132 if (primitive.getTimestamp() != null) { 132 date = Date Format.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(primitive.getTimestamp());133 date = DateUtils.formatDateTime(primitive.getTimestamp(), DateFormat.SHORT, DateFormat.SHORT); 133 134 } 134 135 text = tr( … … 221 222 updateText(cs, "source", lblChangesetSource, lblSource, oppCs, pnlChangesetSource); 222 223 } 223 224 224 225 protected static void updateText(Changeset cs, String attr, JTextArea textArea, JLabel label, Changeset oppCs, JComponent container) { 225 226 final String text = cs != null ? cs.get(attr) : null; -
trunk/src/org/openstreetmap/josm/gui/io/AbstractUploadTask.java
r6336 r7299 32 32 import org.openstreetmap.josm.io.OsmApiInitializationException; 33 33 import org.openstreetmap.josm.io.OsmApiPrimitiveGoneException; 34 import org.openstreetmap.josm.tools.DateUtils;35 34 import org.openstreetmap.josm.tools.ExceptionUtil; 36 35 import org.openstreetmap.josm.tools.ImageProvider; 37 36 import org.openstreetmap.josm.tools.Pair; 37 import org.openstreetmap.josm.tools.date.DateUtils; 38 38 39 39 public abstract class AbstractUploadTask extends PleaseWaitRunnable { … … 196 196 + "changeset {0} which was already closed at {1}.<br>" 197 197 + "Please upload again with a new or an existing open changeset.</html>", 198 changesetId, Date Format.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(d)198 changesetId, DateUtils.formatDateTime(d, DateFormat.SHORT, DateFormat.SHORT) 199 199 ); 200 200 JOptionPane.showMessageDialog( -
trunk/src/org/openstreetmap/josm/gui/io/ChangesetCellRenderer.java
r7001 r7299 15 15 import org.openstreetmap.josm.data.osm.Changeset; 16 16 import org.openstreetmap.josm.tools.ImageProvider; 17 import org.openstreetmap.josm.tools.date.DateUtils; 17 18 18 19 /** 19 20 * A {@link ListCellRenderer} for the list of changesets in the upload dialog. 20 21 * 21 * 22 * @since 2115 22 23 */ 23 24 public class ChangesetCellRenderer extends JLabel implements ListCellRenderer<Changeset> { … … 37 38 sb.append("<strong>").append(tr("Changeset id:")).append("</strong>").append(cs.getId()).append("<br>"); 38 39 if (cs.getCreatedAt() != null) { 39 sb.append("<strong>").append(tr("Created at:")).append("</strong>").append(DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(cs.getCreatedAt())).append("<br>"); 40 sb.append("<strong>").append(tr("Created at:")).append("</strong>").append( 41 DateUtils.formatDateTime(cs.getCreatedAt(), DateFormat.SHORT, DateFormat.SHORT)).append("<br>"); 40 42 } 41 43 if (cs.get("comment") != null) { -
trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
r7182 r7299 57 57 import org.openstreetmap.josm.tools.ImageProvider; 58 58 import org.openstreetmap.josm.tools.Utils; 59 import org.openstreetmap.josm.tools.date.DateUtils; 59 60 60 61 public class GpxLayer extends Layer { … … 142 143 143 144 /** 144 * returns a human readable string that shows the timespan of the given track 145 * Returns a human readable string that shows the timespan of the given track 146 * @param trk The GPX track for which timespan is displayed 147 * @return The timespan as a string 145 148 */ 146 149 public static String getTimespanForTrack(GpxTrack trk) { … … 148 151 String ts = ""; 149 152 if (bounds != null) { 150 DateFormat df = Date Format.getDateInstance(DateFormat.SHORT);153 DateFormat df = DateUtils.getDateFormat(DateFormat.SHORT); 151 154 String earliestDate = df.format(bounds[0]); 152 155 String latestDate = df.format(bounds[1]); 153 156 154 157 if (earliestDate.equals(latestDate)) { 155 DateFormat tf = Date Format.getTimeInstance(DateFormat.SHORT);158 DateFormat tf = DateUtils.getTimeFormat(DateFormat.SHORT); 156 159 ts += earliestDate + " "; 157 160 ts += tf.format(bounds[0]) + " - " + tf.format(bounds[1]); 158 161 } else { 159 DateFormat dtf = Date Format.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);162 DateFormat dtf = DateUtils.getDateTimeFormat(DateFormat.SHORT, DateFormat.SHORT); 160 163 ts += dtf.format(bounds[0]) + " - " + dtf.format(bounds[1]); 161 164 } -
trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
r7204 r7299 80 80 import org.openstreetmap.josm.gui.util.GuiHelper; 81 81 import org.openstreetmap.josm.gui.widgets.JosmTextArea; 82 import org.openstreetmap.josm.tools.DateUtils;83 82 import org.openstreetmap.josm.tools.FilteredCollection; 84 83 import org.openstreetmap.josm.tools.GBC; 85 84 import org.openstreetmap.josm.tools.ImageProvider; 85 import org.openstreetmap.josm.tools.date.DateUtils; 86 86 87 87 /** -
trunk/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java
r7033 r7299 24 24 import java.io.IOException; 25 25 import java.io.InputStream; 26 import java.text.DateFormat; 26 27 import java.text.ParseException; 27 28 import java.text.SimpleDateFormat; … … 76 77 import org.openstreetmap.josm.tools.GBC; 77 78 import org.openstreetmap.josm.tools.ImageProvider; 78 import org.openstreetmap.josm.tools.PrimaryDateParser; 79 import org.openstreetmap.josm.tools.date.DateUtils; 80 import org.openstreetmap.josm.tools.date.PrimaryDateParser; 79 81 import org.xml.sax.SAXException; 80 82 … … 236 238 @Override 237 239 public void actionPerformed(ActionEvent arg0) { 238 SimpleDateFormat dateFormat = newSimpleDateFormat("dd/MM/yyyy HH:mm:ss");240 SimpleDateFormat dateFormat = (SimpleDateFormat) DateUtils.getDateTimeFormat(DateFormat.SHORT, DateFormat.SHORT); 239 241 240 242 panel = new JPanel(); … … 285 287 gc.gridx = 2; 286 288 gc.weightx = 0.2; 287 panelTf.add(new JLabel( tr(" [dd/mm/yyyy hh:mm:ss]")), gc);289 panelTf.add(new JLabel(" ["+dateFormat.toLocalizedPattern()+"]"), gc); 288 290 289 291 gc.gridx = 0; … … 360 362 Date date = yLayer.data.get(index).getExifTime(); 361 363 if (date != null) { 362 lbExifTime.setText(new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(date)); 363 tfGpsTime.setText(new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(date)); 364 DateFormat df = DateUtils.getDateTimeFormat(DateFormat.SHORT, DateFormat.SHORT); 365 lbExifTime.setText(df.format(date)); 366 tfGpsTime.setText(df.format(date)); 364 367 tfGpsTime.setCaretPosition(tfGpsTime.getText().length()); 365 368 tfGpsTime.setEnabled(true); … … 371 374 } 372 375 } 373 374 376 }); 375 377 panelLst.add(new JScrollPane(imgList), BorderLayout.CENTER); … … 380 382 @Override 381 383 public void actionPerformed(ActionEvent ae) { 382 JFileChooser fc = DiskAccessAction.createAndOpenFileChooser(true, false, null, JpegFileFilter.getInstance(), JFileChooser.FILES_ONLY, "geoimage.lastdirectory"); 384 JFileChooser fc = DiskAccessAction.createAndOpenFileChooser(true, false, null, JpegFileFilter.getInstance(), 385 JFileChooser.FILES_ONLY, "geoimage.lastdirectory"); 383 386 if (fc == null) 384 387 return; … … 400 403 } 401 404 if (date != null) { 402 lbExifTime.setText( new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(date));403 tfGpsTime.setText( new SimpleDateFormat("dd/MM/yyyy ").format(date));405 lbExifTime.setText(DateUtils.getDateTimeFormat(DateFormat.SHORT, DateFormat.SHORT).format(date)); 406 tfGpsTime.setText(DateUtils.getDateFormat(DateFormat.SHORT).format(date)+" "); 404 407 tfGpsTime.setEnabled(true); 405 408 } else { … … 929 932 tfOffset.getDocument().addDocumentListener(statusBarUpdater); 930 933 931 lblMatches.setText(statusBarText.getText() + "<br>" + trn("(Time difference of {0} day)", "Time difference of {0} days", Math.abs(dayOffset), Math.abs(dayOffset))); 934 lblMatches.setText(statusBarText.getText() + "<br>" + trn("(Time difference of {0} day)", 935 "Time difference of {0} days", Math.abs(dayOffset), Math.abs(dayOffset))); 932 936 933 937 statusBarUpdater.updateStatusBar(); -
trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
r6822 r7299 27 27 import org.openstreetmap.josm.tools.ImageProvider; 28 28 import org.openstreetmap.josm.tools.Shortcut; 29 import org.openstreetmap.josm.tools.date.DateUtils; 29 30 30 31 public final class ImageViewerDialog extends ToggleDialog { … … 54 55 public static ImageViewerDialog getInstance() { 55 56 if (dialog == null) 56 throw new AssertionError("a new instance needs to be created first"); 57 throw new AssertionError("a new instance needs to be created first"); 57 58 return dialog; 58 59 } … … 248 249 if (entry != null) { 249 250 if (imageChanged) { 250 // Set only if the image is new to preserve zoom and position if the same image is redisplayed 251 // Set only if the image is new to preserve zoom and position if the same image is redisplayed 251 252 // (e.g. to update the OSD). 252 253 imgDisplay.setImage(entry.getFile(), entry.getExifOrientation()); … … 263 264 osd.append(tr("\nDirection {0}\u00b0", Math.round(entry.getExifImgDir()))); 264 265 } 265 DateFormat dtf = Date Format.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);266 DateFormat dtf = DateUtils.getDateTimeFormat(DateFormat.SHORT, DateFormat.SHORT); 266 267 if (entry.hasExifTime()) { 267 268 osd.append(tr("\nEXIF time: {0}", dtf.format(entry.getExifTime()))); -
trunk/src/org/openstreetmap/josm/gui/layer/gpx/ConvertToDataLayerAction.java
r7005 r7299 26 26 import org.openstreetmap.josm.gui.layer.OsmDataLayer; 27 27 import org.openstreetmap.josm.gui.widgets.UrlLabel; 28 import org.openstreetmap.josm.tools.DateUtils;29 28 import org.openstreetmap.josm.tools.GBC; 30 29 import org.openstreetmap.josm.tools.ImageProvider; 30 import org.openstreetmap.josm.tools.date.DateUtils; 31 31 32 32 public class ConvertToDataLayerAction extends AbstractAction { -
trunk/src/org/openstreetmap/josm/gui/preferences/display/LafPreference.java
r7021 r7299 6 6 import java.awt.Component; 7 7 import java.awt.GridBagLayout; 8 import java.text.DateFormat; 9 import java.util.Date; 8 10 9 11 import javax.swing.BorderFactory; … … 30 32 import org.openstreetmap.josm.gui.widgets.JosmComboBox; 31 33 import org.openstreetmap.josm.tools.GBC; 34 import org.openstreetmap.josm.tools.date.DateUtils; 32 35 33 36 /** … … 56 59 private JCheckBox modeless = new JCheckBox(tr("Modeless working (Potlatch style)")); 57 60 private JCheckBox dynamicButtons = new JCheckBox(tr("Dynamic buttons in side menus")); 61 private JCheckBox isoDates = new JCheckBox(tr("Display ISO dates")); 58 62 59 63 @Override … … 87 91 final DefaultListCellRenderer def = new DefaultListCellRenderer(); 88 92 @Override 89 public Component getListCellRendererComponent(JList<? extends LookAndFeelInfo> list, LookAndFeelInfo value, 93 public Component getListCellRendererComponent(JList<? extends LookAndFeelInfo> list, LookAndFeelInfo value, 90 94 int index, boolean isSelected, boolean cellHasFocus) { 91 95 return def.getListCellRendererComponent(list, value.getName(), index, isSelected, cellHasFocus); … … 122 126 panel.add(dynamicButtons, GBC.eop().insets(20, 0, 0, 0)); 123 127 128 Date today = new Date(); 129 isoDates.setToolTipText(tr("Format dates according to {0}. Today''s date will be displayed as {1} instead of {2}", 130 tr("ISO 8601"), 131 DateUtils.newIsoDateFormat().format(today), 132 DateFormat.getDateInstance(DateFormat.SHORT).format(today))); 133 isoDates.setSelected(DateUtils.PROP_ISO_DATES.get()); 134 panel.add(isoDates, GBC.eop().insets(20, 0, 0, 0)); 135 124 136 panel.add(Box.createVerticalGlue(), GBC.eol().insets(0, 20, 0, 0)); 125 137 … … 141 153 Main.pref.put("modeless", modeless.isSelected()); 142 154 Main.pref.put(ToggleDialog.PROP_DYNAMIC_BUTTONS.getKey(), dynamicButtons.isSelected()); 155 Main.pref.put(DateUtils.PROP_ISO_DATES.getKey(), isoDates.isSelected()); 143 156 mod |= Main.pref.put("laf", ((LookAndFeelInfo)lafCombo.getSelectedItem()).getClassName()); 144 157 return mod; -
trunk/src/org/openstreetmap/josm/gui/widgets/DateEditorWithSlider.java
r7005 r7299 10 10 import java.util.Date; 11 11 import java.util.List; 12 12 13 import javax.swing.JLabel; 13 14 import javax.swing.JPanel; … … 17 18 import javax.swing.event.ChangeEvent; 18 19 import javax.swing.event.ChangeListener; 20 19 21 import org.openstreetmap.josm.tools.GBC; 20 22 import org.openstreetmap.josm.tools.date.DateUtils; 21 23 22 24 /** 23 * Widget originally created for date filtering of GPX tracks. 25 * Widget originally created for date filtering of GPX tracks. 24 26 * Allows to enter the date or choose it by using slider 27 * @since 5815 25 28 */ 26 29 public class DateEditorWithSlider extends JPanel { … … 31 34 private static final int MAX_SLIDER=300; 32 35 private boolean watchSlider = true; 33 36 34 37 private List<ChangeListener> listeners = new ArrayList<>(); 35 38 39 /** 40 * Constructs a new {@code DateEditorWithSlider} with a given label 41 * @param labelText The label to display 42 */ 36 43 public DateEditorWithSlider(String labelText) { 37 44 super(new GridBagLayout()); 38 45 spinner = new JSpinner( new SpinnerDateModel() ); 39 String pattern = ((SimpleDateFormat)Date Format.getDateInstance()).toPattern();46 String pattern = ((SimpleDateFormat)DateUtils.getDateFormat(DateFormat.DEFAULT)).toPattern(); 40 47 JSpinner.DateEditor timeEditor = new JSpinner.DateEditor(spinner,pattern); 41 48 spinner.setEditor(timeEditor); 42 43 49 44 50 spinner.setPreferredSize(new Dimension(spinner.getPreferredSize().width+5, 45 51 spinner.getPreferredSize().height)); 46 52 47 53 slider = new JSlider(0,MAX_SLIDER); 48 54 spinner.addChangeListener(new ChangeListener() { … … 77 83 add(slider,GBC.eol().insets(10,0,0,0).fill(GBC.HORIZONTAL)); 78 84 79 dateMin = new Date(0); dateMax =new Date(); 85 dateMin = new Date(0); 86 dateMax = new Date(); 80 87 } 81 88 … … 84 91 return new Date((long)(dateMax.getTime()*k+ dateMin.getTime()*(1-k))); 85 92 } 86 93 87 94 protected int intFromDate(Date date) { 88 95 return (int)(300.0*(date.getTime()-dateMin.getTime()) / … … 102 109 return (Date) spinner.getValue(); 103 110 } 104 111 105 112 public void addDateListener(ChangeListener l) { 106 113 listeners.add(l); … … 110 117 listeners.remove(l); 111 118 } 112 119 113 120 @Override 114 121 public void setEnabled(boolean enabled) { 115 super.setEnabled(enabled); 122 super.setEnabled(enabled); 116 123 for (Component c: getComponents()) { 117 124 c.setEnabled(enabled); 118 125 } 119 126 } 120 121 127 } -
trunk/src/org/openstreetmap/josm/io/AbstractParser.java
r7012 r7299 14 14 import org.openstreetmap.josm.data.osm.history.HistoryRelation; 15 15 import org.openstreetmap.josm.data.osm.history.HistoryWay; 16 import org.openstreetmap.josm.tools.DateUtils; 16 import org.openstreetmap.josm.tools.date.DateUtils; 17 17 import org.xml.sax.Attributes; 18 18 import org.xml.sax.Locator; -
trunk/src/org/openstreetmap/josm/io/ChangesetClosedException.java
r6890 r7299 4 4 import static org.openstreetmap.josm.tools.I18n.tr; 5 5 6 import java.text.DateFormat;7 6 import java.text.ParseException; 8 import java.text.SimpleDateFormat;9 7 import java.util.Date; 10 import java.util.Locale;11 8 import java.util.regex.Matcher; 12 9 import java.util.regex.Pattern; 13 10 14 11 import org.openstreetmap.josm.Main; 12 import org.openstreetmap.josm.tools.date.DateUtils; 15 13 16 14 /** … … 77 75 if (m.matches()) { 78 76 changesetId = Long.parseLong(m.group(1)); 79 // Example: "2010-09-07 14:39:41 UTC". Always parsed with US locale regardless80 // of the current locale in JOSM81 DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z", Locale.US);82 77 try { 83 closedOn = formatter.parse(m.group(2));78 closedOn = DateUtils.newOsmApiDateTimeFormat().parse(m.group(2)); 84 79 } catch(ParseException ex) { 85 80 Main.error(tr("Failed to parse date ''{0}'' replied by server.", m.group(2))); -
trunk/src/org/openstreetmap/josm/io/ChangesetQuery.java
r7012 r7299 9 9 import java.text.MessageFormat; 10 10 import java.text.ParseException; 11 import java.text.SimpleDateFormat;12 11 import java.util.Arrays; 13 12 import java.util.Collection; … … 24 23 import org.openstreetmap.josm.tools.CheckParameterUtil; 25 24 import org.openstreetmap.josm.tools.Utils; 25 import org.openstreetmap.josm.tools.date.DateUtils; 26 26 27 27 public class ChangesetQuery { … … 97 97 98 98 /** 99 * Replies true if this query is restricted to user whom we only know the user name 100 * for. 101 * 102 * @return true if this query is restricted to user whom we only know the user name 103 * for 99 * Replies true if this query is restricted to user whom we only know the user name for. 100 * 101 * @return true if this query is restricted to user whom we only know the user name for 104 102 */ 105 103 public boolean isRestrictedToPartiallyIdentifiedUser() { … … 206 204 * @throws IllegalArgumentException thrown if createdBefore is null 207 205 */ 208 public ChangesetQuery closedAfterAndCreatedBefore(Date closedAfter, Date createdBefore ) throws IllegalArgumentException{ 206 public ChangesetQuery closedAfterAndCreatedBefore(Date closedAfter, Date createdBefore ) throws IllegalArgumentException { 209 207 CheckParameterUtil.ensureParameterNotNull(closedAfter, "closedAfter"); 210 208 CheckParameterUtil.ensureParameterNotNull(createdBefore, "createdBefore"); … … 277 275 sb.append("&"); 278 276 } 279 SimpleDateFormat df =new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz");277 DateFormat df = DateUtils.newIsoDateTimeFormat(); 280 278 sb.append("time").append("=").append(df.format(closedAfter)); 281 279 sb.append(",").append(df.format(createdBefore)); … … 284 282 sb.append("&"); 285 283 } 286 SimpleDateFormat df =new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz");284 DateFormat df = DateUtils.newIsoDateTimeFormat(); 287 285 sb.append("time").append("=").append(df.format(closedAfter)); 288 286 } … … 315 313 public static class ChangesetQueryUrlException extends Exception { 316 314 317 public ChangesetQueryUrlException() { 318 super(); 319 } 320 321 public ChangesetQueryUrlException(String arg0, Throwable arg1) { 322 super(arg0, arg1); 323 } 324 325 public ChangesetQueryUrlException(String arg0) { 326 super(arg0); 327 } 328 329 public ChangesetQueryUrlException(Throwable arg0) { 330 super(arg0); 315 /** 316 * Constructs a new {@code ChangesetQueryUrlException} with the specified detail message. 317 * 318 * @param message the detail message. The detail message is saved for later retrieval by the {@link #getMessage()} method. 319 */ 320 public ChangesetQueryUrlException(String message) { 321 super(message); 322 } 323 324 /** 325 * Constructs a new {@code ChangesetQueryUrlException} with the specified cause and a detail message of 326 * <tt>(cause==null ? null : cause.toString())</tt> (which typically contains the class and detail message of <tt>cause</tt>). 327 * 328 * @param cause the cause (which is saved for later retrieval by the {@link #getCause()} method). 329 * (A <tt>null</tt> value is permitted, and indicates that the cause is nonexistent or unknown.) 330 */ 331 public ChangesetQueryUrlException(Throwable cause) { 332 super(cause); 331 333 } 332 334 } … … 335 337 protected int parseUid(String value) throws ChangesetQueryUrlException { 336 338 if (value == null || value.trim().isEmpty()) 337 throw new ChangesetQueryUrlException(tr("Unexpected value for ''{0}'' in changeset query url, got {1}", "uid",value)); 339 throw new ChangesetQueryUrlException(tr("Unexpected value for ''{0}'' in changeset query url, got {1}", "uid", value)); 338 340 int id; 339 341 try { 340 342 id = Integer.parseInt(value); 341 343 if (id <= 0) 342 throw new ChangesetQueryUrlException(tr("Unexpected value for ''{0}'' in changeset query url, got {1}", "uid",value)); 344 throw new ChangesetQueryUrlException(tr("Unexpected value for ''{0}'' in changeset query url, got {1}", "uid", value)); 343 345 } catch(NumberFormatException e) { 344 throw new ChangesetQueryUrlException(tr("Unexpected value for ''{0}'' in changeset query url, got {1}", "uid",value)); 346 throw new ChangesetQueryUrlException(tr("Unexpected value for ''{0}'' in changeset query url, got {1}", "uid", value)); 345 347 } 346 348 return id; … … 349 351 protected boolean parseBoolean(String value, String parameter) throws ChangesetQueryUrlException { 350 352 if (value == null || value.trim().isEmpty()) 351 throw new ChangesetQueryUrlException(tr("Unexpected value for ''{0}'' in changeset query url, got {1}", parameter,value)); 353 throw new ChangesetQueryUrlException(tr("Unexpected value for ''{0}'' in changeset query url, got {1}", parameter, value)); 352 354 switch (value) { 353 355 case "true": … … 356 358 return false; 357 359 default: 358 throw new ChangesetQueryUrlException(tr("Unexpected value for ''{0}'' in changeset query url, got {1}", parameter,value)); 360 throw new ChangesetQueryUrlException(tr("Unexpected value for ''{0}'' in changeset query url, got {1}", parameter, value)); 359 361 } 360 362 } … … 362 364 protected Date parseDate(String value, String parameter) throws ChangesetQueryUrlException { 363 365 if (value == null || value.trim().isEmpty()) 364 throw new ChangesetQueryUrlException(tr("Unexpected value for ''{0}'' in changeset query url, got {1}", parameter,value)); 366 throw new ChangesetQueryUrlException(tr("Unexpected value for ''{0}'' in changeset query url, got {1}", parameter, value)); 365 367 if (value.endsWith("Z")) { 366 // OSM API generates date strings w etime zone abbreviation "Z" which Java SimpleDateFormat368 // OSM API generates date strings with time zone abbreviation "Z" which Java SimpleDateFormat 367 369 // doesn't understand. Convert into GMT time zone before parsing. 368 370 // 369 371 value = value.substring(0,value.length() - 1) + "GMT+00:00"; 370 372 } 371 DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz");373 DateFormat formatter = DateUtils.newIsoDateTimeFormat(); 372 374 try { 373 375 return formatter.parse(value); 374 376 } catch(ParseException e) { 375 throw new ChangesetQueryUrlException(tr("Unexpected value for ''{0}'' in changeset query url, got {1}", parameter,value)); 377 throw new ChangesetQueryUrlException(tr("Unexpected value for ''{0}'' in changeset query url, got {1}", parameter, value)); 376 378 } 377 379 } … … 384 386 return new Date[]{parseDate(dates[0], "time")}; 385 387 else if (dates.length == 2) 386 return new Date[]{parseDate(dates[0], "time"),parseDate(dates[1], "time")}; 388 return new Date[]{parseDate(dates[0], "time"), parseDate(dates[1], "time")}; 387 389 return null; 388 390 } … … 435 437 try { 436 438 csQuery.inBbox(new Bounds(entry.getValue(), ",")); 437 } catch(IllegalArgumentException e) { 439 } catch (IllegalArgumentException e) { 438 440 throw new ChangesetQueryUrlException(e); 439 441 } … … 479 481 * @throws ChangesetQueryUrlException if the query string doesn't represent a legal query for changesets 480 482 */ 481 public ChangesetQuery parse(String query) throws 483 public ChangesetQuery parse(String query) throws ChangesetQueryUrlException { 482 484 if (query == null) 483 485 return new ChangesetQuery(); … … 485 487 if (query.isEmpty()) 486 488 return new ChangesetQuery(); 487 Map<String,String> queryParams 489 Map<String,String> queryParams = createMapFromQueryString(query); 488 490 return createFromMap(queryParams); 489 491 } -
trunk/src/org/openstreetmap/josm/io/NmeaReader.java
r7082 r7299 18 18 import org.openstreetmap.josm.data.gpx.ImmutableGpxTrack; 19 19 import org.openstreetmap.josm.data.gpx.WayPoint; 20 import org.openstreetmap.josm.tools.DateUtils; 20 import org.openstreetmap.josm.tools.date.DateUtils; 21 21 22 22 /** -
trunk/src/org/openstreetmap/josm/io/OsmChangesetParser.java
r7082 r7299 18 18 import org.openstreetmap.josm.data.osm.User; 19 19 import org.openstreetmap.josm.gui.progress.ProgressMonitor; 20 import org.openstreetmap.josm.tools.DateUtils;21 20 import org.openstreetmap.josm.tools.XmlParsingException; 21 import org.openstreetmap.josm.tools.date.DateUtils; 22 22 import org.xml.sax.Attributes; 23 23 import org.xml.sax.InputSource; -
trunk/src/org/openstreetmap/josm/io/OsmReader.java
r7081 r7299 39 39 import org.openstreetmap.josm.gui.progress.ProgressMonitor; 40 40 import org.openstreetmap.josm.tools.CheckParameterUtil; 41 import org.openstreetmap.josm.tools.DateUtils; 41 import org.openstreetmap.josm.tools.date.DateUtils; 42 42 43 43 /** -
trunk/src/org/openstreetmap/josm/io/OsmServerUserInfoReader.java
r7033 r7299 18 18 import org.openstreetmap.josm.data.osm.UserInfo; 19 19 import org.openstreetmap.josm.gui.progress.ProgressMonitor; 20 import org.openstreetmap.josm.tools.DateUtils;21 20 import org.openstreetmap.josm.tools.XmlParsingException; 21 import org.openstreetmap.josm.tools.date.DateUtils; 22 22 import org.w3c.dom.Document; 23 23 import org.w3c.dom.Node; -
trunk/src/org/openstreetmap/josm/io/OsmWriter.java
r7236 r7299 28 28 import org.openstreetmap.josm.data.osm.visitor.PrimitiveVisitor; 29 29 import org.openstreetmap.josm.gui.layer.OsmDataLayer; 30 import org.openstreetmap.josm.tools.DateUtils; 30 import org.openstreetmap.josm.tools.date.DateUtils; 31 31 32 32 /** -
trunk/src/org/openstreetmap/josm/tools/ExceptionUtil.java
r7205 r7299 13 13 import java.text.DateFormat; 14 14 import java.text.ParseException; 15 import java.text.SimpleDateFormat;16 15 import java.util.Collection; 17 16 import java.util.Date; 18 import java.util.Locale;19 17 import java.util.TreeSet; 20 18 import java.util.regex.Matcher; … … 35 33 import org.openstreetmap.josm.io.OsmTransferException; 36 34 import org.openstreetmap.josm.io.auth.CredentialsManager; 35 import org.openstreetmap.josm.tools.date.DateUtils; 37 36 38 37 @SuppressWarnings("CallToThreadDumpStack") … … 362 361 if (m.matches()) { 363 362 long changesetId = Long.parseLong(m.group(1)); 364 // Example: "2010-09-07 14:39:41 UTC". Always parsed with US locale, regardless365 // of the current locale in JOSM366 DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z", Locale.US);367 363 Date closeDate = null; 368 364 try { 369 closeDate = formatter.parse(m.group(2));365 closeDate = DateUtils.newOsmApiDateTimeFormat().parse(m.group(2)); 370 366 } catch (ParseException ex) { 371 367 Main.error(tr("Failed to parse date ''{0}'' replied by server.", m.group(2))); … … 378 374 ); 379 375 } else { 380 SimpleDateFormat dateFormat = new SimpleDateFormat();381 376 msg = tr( 382 377 "<html>Closing of changeset <strong>{0}</strong> failed<br>" 383 378 +" because it has already been closed on {1}.", 384 379 changesetId, 385 dateFormat.format(closeDate)380 DateUtils.formatDateTime(closeDate, DateFormat.DEFAULT, DateFormat.DEFAULT) 386 381 ); 387 382 } … … 408 403 */ 409 404 public static String explainChangesetClosedException(ChangesetClosedException e) { 410 SimpleDateFormat dateFormat = new SimpleDateFormat();411 405 Main.error(e); 412 406 return tr( … … 414 408 +"because it has already been closed on {1}.", 415 409 e.getChangesetId(), 416 e.getClosedOn() == null ? "?" : dateFormat.format(e.getClosedOn())410 e.getClosedOn() == null ? "?" : DateUtils.formatDateTime(e.getClosedOn(), DateFormat.DEFAULT, DateFormat.DEFAULT) 417 411 ); 418 412 } -
trunk/src/org/openstreetmap/josm/tools/ExifReader.java
r7004 r7299 9 9 import org.openstreetmap.josm.Main; 10 10 import org.openstreetmap.josm.data.coor.LatLon; 11 import org.openstreetmap.josm.tools.date.PrimaryDateParser; 11 12 12 13 import com.drew.imaging.jpeg.JpegMetadataReader; … … 57 58 if (dateStr != null) { 58 59 dateStr = dateStr.replace('/', ':'); // workaround for HTC Sensation bug, see #7228 59 return DateParser.parse(dateStr); 60 return new PrimaryDateParser().parse(dateStr); 60 61 } 61 62 } catch (ParseException e) { -
trunk/src/org/openstreetmap/josm/tools/date/DateUtils.java
r7293 r7299 1 1 // License: GPL. For details, see LICENSE file. 2 package org.openstreetmap.josm.tools; 3 2 package org.openstreetmap.josm.tools.date; 3 4 import java.text.DateFormat; 4 5 import java.text.ParsePosition; 5 6 import java.text.SimpleDateFormat; … … 7 8 import java.util.Date; 8 9 import java.util.GregorianCalendar; 10 import java.util.Locale; 9 11 import java.util.TimeZone; 10 12 … … 14 16 15 17 import org.openstreetmap.josm.Main; 18 import org.openstreetmap.josm.data.preferences.BooleanProperty; 19 import org.openstreetmap.josm.tools.CheckParameterUtil; 16 20 17 21 /** 18 * A static utility class dealing with parsing XML date quickly and formatting 19 * a date to the XML UTC format regardless of current locale. 20 * 22 * A static utility class dealing with: 23 * <ul> 24 * <li>parsing XML date quickly and formatting a date to the XML UTC format regardless of current locale</li> 25 * <li>providing a single entry point for formatting dates to be displayed in JOSM GUI, based on user preferences</li> 26 * </ul> 21 27 * @author nenik 22 28 */ 23 29 public final class DateUtils { 24 private DateUtils() {} 30 31 private DateUtils() { 32 // Hide default constructor for utils classes 33 } 34 35 /** 36 * Property to enable display of ISO dates globally. 37 * @since 7299 38 */ 39 public static final BooleanProperty PROP_ISO_DATES = new BooleanProperty("iso.dates", false); 40 25 41 /** 26 42 * A shared instance used for conversion between individual date fields … … 44 60 } 45 61 62 /** 63 * Parses XML date quickly, regardless of current locale. 64 * @param str The XML date as string 65 * @return The date 66 */ 46 67 public static synchronized Date fromString(String str) { 47 68 // "2007-07-25T09:26:24{Z|{+|-}01:00}" … … 65 86 66 87 return calendar.getTime(); 67 } 68 else if(checkLayout(str, "xxxx-xx-xxTxx:xx:xx.xxxZ") || 88 } else if(checkLayout(str, "xxxx-xx-xxTxx:xx:xx.xxxZ") || 69 89 checkLayout(str, "xxxx-xx-xxTxx:xx:xx.xxx") || 70 90 checkLayout(str, "xxxx-xx-xxTxx:xx:xx.xxx+xx:00") || … … 83 103 84 104 return calendar.getTime(); 85 } 86 else 87 { 105 } else { 88 106 // example date format "18-AUG-08 13:33:03" 89 107 SimpleDateFormat f = new SimpleDateFormat("dd-MMM-yy HH:mm:ss"); … … 100 118 } 101 119 120 /** 121 * Formats a date to the XML UTC format regardless of current locale. 122 * @param date The date to format 123 * @return The formatted date 124 */ 102 125 public static synchronized String fromDate(Date date) { 103 126 calendar.setTime(date); … … 122 145 } 123 146 147 /** 148 * Returns a new {@code SimpleDateFormat} for date only, according to <a href="https://en.wikipedia.org/wiki/ISO_8601">ISO 8601</a>. 149 * @return a new ISO 8601 date format, for date only. 150 * @since 7299 151 */ 152 public static final SimpleDateFormat newIsoDateFormat() { 153 return new SimpleDateFormat("yyyy-MM-dd"); 154 } 155 156 /** 157 * Returns a new {@code SimpleDateFormat} for date and time, according to <a href="https://en.wikipedia.org/wiki/ISO_8601">ISO 8601</a>. 158 * @return a new ISO 8601 date format, for date and time. 159 * @since 7299 160 */ 161 public static final SimpleDateFormat newIsoDateTimeFormat() { 162 return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX"); 163 } 164 165 /** 166 * Returns a new {@code SimpleDateFormat} for date and time, according to format used in OSM API errors. 167 * @return a new date format, for date and time, to use for OSM API error handling. 168 * @since 7299 169 */ 170 public static final SimpleDateFormat newOsmApiDateTimeFormat() { 171 // Example: "2010-09-07 14:39:41 UTC". 172 // Always parsed with US locale regardless of the current locale in JOSM 173 return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z", Locale.US); 174 } 175 176 /** 177 * Returns the date format to be used for current user, based on user preferences. 178 * @param dateStyle The date style as described in {@link DateFormat#getDateInstance}. Ignored if "ISO dates" option is set 179 * @return The date format 180 * @since 7299 181 */ 182 public static final DateFormat getDateFormat(int dateStyle) { 183 if (PROP_ISO_DATES.get()) { 184 return newIsoDateFormat(); 185 } else { 186 return DateFormat.getDateInstance(dateStyle, Locale.getDefault()); 187 } 188 } 189 190 /** 191 * Formats a date to be displayed to current user, based on user preferences. 192 * @param date The date to display. Must not be {@code null} 193 * @param dateStyle The date style as described in {@link DateFormat#getDateInstance}. Ignored if "ISO dates" option is set 194 * @return The formatted date 195 * @since 7299 196 */ 197 public static final String formatDate(Date date, int dateStyle) { 198 CheckParameterUtil.ensureParameterNotNull(date, "date"); 199 return getDateFormat(dateStyle).format(date); 200 } 201 202 /** 203 * Returns the time format to be used for current user, based on user preferences. 204 * @param timeStyle The time style as described in {@link DateFormat#getTimeInstance}. Ignored if "ISO dates" option is set 205 * @return The time format 206 * @since 7299 207 */ 208 public static final DateFormat getTimeFormat(int timeStyle) { 209 if (PROP_ISO_DATES.get()) { 210 // This is not strictly conform to ISO 8601. We just want to avoid US-style times such as 3.30pm 211 return new SimpleDateFormat("HH:mm:ss"); 212 } else { 213 return DateFormat.getTimeInstance(timeStyle, Locale.getDefault()); 214 } 215 } 216 /** 217 * Formats a time to be displayed to current user, based on user preferences. 218 * @param time The time to display. Must not be {@code null} 219 * @param timeStyle The time style as described in {@link DateFormat#getTimeInstance}. Ignored if "ISO dates" option is set 220 * @return The formatted time 221 * @since 7299 222 */ 223 public static final String formatTime(Date time, int timeStyle) { 224 CheckParameterUtil.ensureParameterNotNull(time, "time"); 225 return getTimeFormat(timeStyle).format(time); 226 } 227 228 /** 229 * Returns the date/time format to be used for current user, based on user preferences. 230 * @param dateStyle The date style as described in {@link DateFormat#getDateTimeInstance}. Ignored if "ISO dates" option is set 231 * @param timeStyle The time style as described in {@code DateFormat.getDateTimeInstance}. Ignored if "ISO dates" option is set 232 * @return The date/time format 233 * @since 7299 234 */ 235 public static final DateFormat getDateTimeFormat(int dateStyle, int timeStyle) { 236 if (PROP_ISO_DATES.get()) { 237 // This is not strictly conform to ISO 8601. We just want to avoid US-style times such as 3.30pm 238 // and we don't want to use the 'T' separator as a space character is much more readable 239 return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 240 } else { 241 return DateFormat.getDateTimeInstance(dateStyle, timeStyle, Locale.getDefault()); 242 } 243 } 244 245 /** 246 * Formats a date/time to be displayed to current user, based on user preferences. 247 * @param datetime The date/time to display. Must not be {@code null} 248 * @param dateStyle The date style as described in {@link DateFormat#getDateTimeInstance}. Ignored if "ISO dates" option is set 249 * @param timeStyle The time style as described in {@code DateFormat.getDateTimeInstance}. Ignored if "ISO dates" option is set 250 * @return The formatted date/time 251 * @since 7299 252 */ 253 public static final String formatDateTime(Date datetime, int dateStyle, int timeStyle) { 254 CheckParameterUtil.ensureParameterNotNull(datetime, "datetime"); 255 return getDateTimeFormat(dateStyle, timeStyle).format(datetime); 256 } 124 257 } -
trunk/src/org/openstreetmap/josm/tools/date/FallbackDateParser.java
r7293 r7299 1 1 // License: GPL. For details, see LICENSE file. 2 package org.openstreetmap.josm.tools; 2 package org.openstreetmap.josm.tools.date; 3 3 4 4 import java.text.DateFormat; … … 16 16 * @author Brett Henderson 17 17 */ 18 publicclass FallbackDateParser {18 class FallbackDateParser { 19 19 20 20 private static final String[] formats = { -
trunk/src/org/openstreetmap/josm/tools/date/PrimaryDateParser.java
r7293 r7299 1 1 // License: GPL. For details, see LICENSE file. 2 package org.openstreetmap.josm.tools; 2 package org.openstreetmap.josm.tools.date; 3 3 4 4 import java.text.ParseException;
Note:
See TracChangeset
for help on using the changeset viewer.