source: josm/trunk/src/org/openstreetmap/josm/gui/widgets/BoundingBoxSelectionPanel.java@ 6340

Last change on this file since 6340 was 6340, checked in by Don-vip, 10 years ago

refactor of some GUI/widgets classes (impacts some plugins):

  • gui.BookmarkList moves to gui.download as it is only meant to be used by gui.download.BookmarkSelection
  • tools.UrlLabel moves to gui.widgets
  • gui.JMultilineLabel, gui.MultiplitLayout, gui.MultiSplitPane move to gui.widgets
  • Property svn:eol-style set to native
File size: 7.2 KB
Line 
1// License: GPL. Copyright 2007 by Immanuel Scholz and others
2package org.openstreetmap.josm.gui.widgets;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.Dimension;
7import java.awt.GridBagConstraints;
8import java.awt.GridBagLayout;
9import java.awt.Insets;
10
11import javax.swing.BorderFactory;
12import javax.swing.JLabel;
13import javax.swing.JPanel;
14import javax.swing.event.DocumentEvent;
15import javax.swing.event.DocumentListener;
16import javax.swing.text.JTextComponent;
17
18import org.openstreetmap.josm.data.Bounds;
19import org.openstreetmap.josm.data.coor.CoordinateFormat;
20import org.openstreetmap.josm.data.coor.LatLon;
21import org.openstreetmap.josm.tools.GBC;
22import org.openstreetmap.josm.tools.OsmUrlToBounds;
23
24/**
25 *
26 *
27 */
28public class BoundingBoxSelectionPanel extends JPanel {
29
30 private JosmTextField[] tfLatLon = null;
31 private final JosmTextField tfOsmUrl = new JosmTextField();
32
33 protected void buildInputFields() {
34 tfLatLon = new JosmTextField[4];
35 for(int i=0; i< 4; i++) {
36 tfLatLon[i] = new JosmTextField(11);
37 tfLatLon[i].setMinimumSize(new Dimension(100,new JosmTextField().getMinimumSize().height));
38 SelectAllOnFocusGainedDecorator.decorate(tfLatLon[i]);
39 }
40 LatitudeValidator.decorate(tfLatLon[0]);
41 LatitudeValidator.decorate(tfLatLon[2]);
42 LongitudeValidator.decorate(tfLatLon[1]);
43 LongitudeValidator.decorate(tfLatLon[3]);
44 }
45
46 protected void build() {
47 buildInputFields();
48 setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
49 setLayout(new GridBagLayout());
50 tfOsmUrl.getDocument().addDocumentListener(new OsmUrlRefresher());
51
52 // select content on receiving focus. this seems to be the default in the
53 // windows look+feel but not for others. needs invokeLater to avoid strange
54 // side effects that will cancel out the newly made selection otherwise.
55 tfOsmUrl.addFocusListener(new SelectAllOnFocusGainedDecorator());
56
57 add(new JLabel(tr("Min. latitude")), GBC.std().insets(0,0,3,5));
58 add(tfLatLon[0], GBC.std().insets(0,0,3,5));
59 add(new JLabel(tr("Min. longitude")), GBC.std().insets(0,0,3,5));
60 add(tfLatLon[1], GBC.eol());
61 add(new JLabel(tr("Max. latitude")), GBC.std().insets(0,0,3,5));
62 add(tfLatLon[2], GBC.std().insets(0,0,3,5));
63 add(new JLabel(tr("Max. longitude")), GBC.std().insets(0,0,3,5));
64 add(tfLatLon[3], GBC.eol());
65
66 GridBagConstraints gc = new GridBagConstraints();
67 gc.gridx = 0;
68 gc.gridy = 2;
69 gc.gridwidth = 4;
70 gc.fill = GridBagConstraints.HORIZONTAL;
71 gc.weightx = 1.0;
72 gc.insets = new Insets(10,0,0,3);
73 add(new JMultilineLabel(tr("URL from www.openstreetmap.org (you can paste a download URL here to specify a bounding box)")), gc);
74
75 gc.gridy = 3;
76 gc.insets = new Insets(3,0,0,3);
77 add(tfOsmUrl, gc);
78 }
79
80 public BoundingBoxSelectionPanel() {
81 build();
82 }
83
84 public void setBoundingBox(Bounds area) {
85 updateBboxFields(area);
86 }
87
88 public Bounds getBoundingBox() {
89 double minlon, minlat, maxlon,maxlat;
90 try {
91 minlat = Double.parseDouble(tfLatLon[0].getText().trim());
92 minlon = Double.parseDouble(tfLatLon[1].getText().trim());
93 maxlat = Double.parseDouble(tfLatLon[2].getText().trim());
94 maxlon = Double.parseDouble(tfLatLon[3].getText().trim());
95 } catch(NumberFormatException e) {
96 return null;
97 }
98 if (!LatLon.isValidLon(minlon) || !LatLon.isValidLon(maxlon)
99 || !LatLon.isValidLat(minlat) || ! LatLon.isValidLat(maxlat))
100 return null;
101 if (minlon > maxlon)
102 return null;
103 if (minlat > maxlat)
104 return null;
105 return new Bounds(minlon,minlat,maxlon,maxlat);
106 }
107
108 private boolean parseURL() {
109 Bounds b = OsmUrlToBounds.parse(tfOsmUrl.getText());
110 if(b == null) return false;
111 updateBboxFields(b);
112 return true;
113 }
114
115 private void updateBboxFields(Bounds area) {
116 if (area == null) return;
117 tfLatLon[0].setText(area.getMin().latToString(CoordinateFormat.DECIMAL_DEGREES));
118 tfLatLon[1].setText(area.getMin().lonToString(CoordinateFormat.DECIMAL_DEGREES));
119 tfLatLon[2].setText(area.getMax().latToString(CoordinateFormat.DECIMAL_DEGREES));
120 tfLatLon[3].setText(area.getMax().lonToString(CoordinateFormat.DECIMAL_DEGREES));
121 }
122
123 static private class LatitudeValidator extends AbstractTextComponentValidator {
124
125 public static void decorate(JTextComponent tc) {
126 new LatitudeValidator(tc);
127 }
128
129 public LatitudeValidator(JTextComponent tc) {
130 super(tc);
131 }
132
133 @Override
134 public void validate() {
135 double value = 0;
136 try {
137 value = Double.parseDouble(getComponent().getText());
138 } catch(NumberFormatException ex) {
139 feedbackInvalid(tr("The string ''{0}'' is not a valid double value.", getComponent().getText()));
140 return;
141 }
142 if (!LatLon.isValidLat(value)) {
143 feedbackInvalid(tr("Value for latitude in range [-90,90] required.", getComponent().getText()));
144 return;
145 }
146 feedbackValid("");
147 }
148
149 @Override
150 public boolean isValid() {
151 double value = 0;
152 try {
153 value = Double.parseDouble(getComponent().getText());
154 } catch(NumberFormatException ex) {
155 return false;
156 }
157 if (!LatLon.isValidLat(value))
158 return false;
159 return true;
160 }
161 }
162
163 static private class LongitudeValidator extends AbstractTextComponentValidator{
164
165 public static void decorate(JTextComponent tc) {
166 new LongitudeValidator(tc);
167 }
168
169 public LongitudeValidator(JTextComponent tc) {
170 super(tc);
171 }
172
173 @Override
174 public void validate() {
175 double value = 0;
176 try {
177 value = Double.parseDouble(getComponent().getText());
178 } catch(NumberFormatException ex) {
179 feedbackInvalid(tr("The string ''{0}'' is not a valid double value.", getComponent().getText()));
180 return;
181 }
182 if (!LatLon.isValidLon(value)) {
183 feedbackInvalid(tr("Value for longitude in range [-180,180] required.", getComponent().getText()));
184 return;
185 }
186 feedbackValid("");
187 }
188
189 @Override
190 public boolean isValid() {
191 double value = 0;
192 try {
193 value = Double.parseDouble(getComponent().getText());
194 } catch(NumberFormatException ex) {
195 return false;
196 }
197 if (!LatLon.isValidLon(value))
198 return false;
199 return true;
200 }
201 }
202
203 class OsmUrlRefresher implements DocumentListener {
204 @Override
205 public void changedUpdate(DocumentEvent e) { parseURL(); }
206 @Override
207 public void insertUpdate(DocumentEvent e) { parseURL(); }
208 @Override
209 public void removeUpdate(DocumentEvent e) { parseURL(); }
210 }
211}
Note: See TracBrowser for help on using the repository browser.