Changeset 329 in josm for branch/0.5/src/org/openstreetmap/josm/gui
- Timestamp:
- 2007-09-24T01:36:24+02:00 (17 years ago)
- Location:
- branch/0.5/src/org/openstreetmap/josm/gui
- Files:
-
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
branch/0.5/src/org/openstreetmap/josm/gui/ConflictResolver.java
r298 r329 38 38 import org.openstreetmap.josm.data.conflict.ConflictItem; 39 39 import org.openstreetmap.josm.data.conflict.DeleteConflict; 40 import org.openstreetmap.josm.data.conflict.FromConflict;41 40 import org.openstreetmap.josm.data.conflict.PositionConflict; 42 41 import org.openstreetmap.josm.data.conflict.PropertyConflict; 43 import org.openstreetmap.josm.data.conflict.SegmentConflict;44 import org.openstreetmap.josm.data.conflict.ToConflict;45 42 import org.openstreetmap.josm.data.osm.OsmPrimitive; 46 43 import org.openstreetmap.josm.tools.GBC; … … 140 137 possibleConflicts.add(new DeleteConflict()); 141 138 possibleConflicts.add(new PositionConflict()); 142 possibleConflicts.add(new FromConflict());143 possibleConflicts.add(new ToConflict());144 possibleConflicts.add(new SegmentConflict());145 139 TreeSet<String> allkeys = new TreeSet<String>(); 146 140 for (Entry<OsmPrimitive, OsmPrimitive> e : conflicts.entrySet()) { -
branch/0.5/src/org/openstreetmap/josm/gui/GettingStarted.java
r312 r329 48 48 panel = new JPanel(new GridBagLayout()); 49 49 50 panel.add(new JLabel("<html><h2>You are running a technology preview with support for <i>API 0.5</i>.</h2>" + 51 "<h3>API 0.5 supports object relationships, and segments have been removed.</h3>" + 52 "<h3>This version is hard-coded to use the API 0.5 running on <i>openstreetmap.gryph.de</i> which has data from a recent planet file."+ 53 "<br>Please be gentle with that machine and request only moderate bounding boxes.<br>" + 54 "<br>Username and password are also hardcoded, so your real username and password are not transmitted.<br>" + 55 "</h3>"), GBC.eol()); 56 57 addLine("wiki", "Read the [Wiki page on API 0.5]"); 50 58 addGettingStarted(); 51 59 addGettingHelp(); … … 86 94 else if (e.getActionCommand().equals("help")) 87 95 Main.main.menu.help.actionPerformed(e); 96 else if (e.getActionCommand().equals("wiki")) 97 OpenBrowser.displayUrl("http://wiki.openstreetmap.org/index.php?title=OSM_Protocol_Version_0.5"); 88 98 else if (e.getActionCommand().equals("tutorial")) 89 99 OpenBrowser.displayUrl("http://josm.openstreetmap.de/wiki/TutorialVideos"); -
branch/0.5/src/org/openstreetmap/josm/gui/MainMenu.java
r298 r329 18 18 import org.openstreetmap.josm.actions.CombineWayAction; 19 19 import org.openstreetmap.josm.actions.DownloadAction; 20 import org.openstreetmap.josm.actions.DownloadIncompleteAction;21 20 import org.openstreetmap.josm.actions.ExitAction; 22 21 import org.openstreetmap.josm.actions.GpxExportAction; … … 26 25 import org.openstreetmap.josm.actions.PreferencesAction; 27 26 import org.openstreetmap.josm.actions.RedoAction; 28 import org.openstreetmap.josm.actions.ReorderAction; 29 import org.openstreetmap.josm.actions.ReverseSegmentAction; 27 import org.openstreetmap.josm.actions.ReverseWayAction; 30 28 import org.openstreetmap.josm.actions.SaveAction; 31 29 import org.openstreetmap.josm.actions.SaveAsAction; … … 56 54 public final OpenAction open = new OpenAction(); 57 55 public final DownloadAction download = new DownloadAction(); 58 public final Action reverse Segment= new ReverseSegmentAction();56 public final Action reverseWay = new ReverseWayAction(); 59 57 public final Action splitWay = new SplitWayAction(); 60 58 public final Action combineWay = new CombineWayAction(); 61 59 public final Action alignInCircle = new AlignInCircleAction(); 62 60 public final Action alignInLine = new AlignInLineAction(); 63 public final Action reorder = new ReorderAction();64 61 public final Action upload = new UploadAction(); 65 62 public final Action save = new SaveAction(null); … … 70 67 public final HelpAction help = new HelpAction(); 71 68 public final Action about = new AboutAction(); 72 public final DownloadIncompleteAction downloadIncomplete = new DownloadIncompleteAction();73 69 74 70 public final JMenu layerMenu = new JMenu(tr("Layer")); … … 117 113 toolsMenu.add(alignInLine); 118 114 toolsMenu.addSeparator(); 119 toolsMenu.add(reverseSegment); 120 toolsMenu.add(reorder); 115 toolsMenu.add(reverseWay); 121 116 toolsMenu.addSeparator(); 122 117 toolsMenu.add(splitWay); … … 126 121 connectionMenu.setMnemonic('C'); 127 122 connectionMenu.add(download); 128 connectionMenu.add(downloadIncomplete);129 123 connectionMenu.add(upload); 130 124 add(connectionMenu); -
branch/0.5/src/org/openstreetmap/josm/gui/MapFrame.java
r312 r329 15 15 import org.openstreetmap.josm.Main; 16 16 import org.openstreetmap.josm.actions.mapmode.AddSegmentAction; 17 import org.openstreetmap.josm.actions.mapmode.AddWayAction;18 17 import org.openstreetmap.josm.actions.mapmode.DeleteAction; 19 18 import org.openstreetmap.josm.actions.mapmode.MapMode; … … 24 23 import org.openstreetmap.josm.gui.dialogs.CommandStackDialog; 25 24 import org.openstreetmap.josm.gui.dialogs.ConflictDialog; 25 import org.openstreetmap.josm.gui.dialogs.RelationListDialog; 26 26 import org.openstreetmap.josm.gui.dialogs.HistoryDialog; 27 27 import org.openstreetmap.josm.gui.dialogs.LayerListDialog; … … 85 85 toolBarActions.add(new IconToggleButton(new AddNodeGroup(this))); 86 86 toolBarActions.add(new IconToggleButton(new AddSegmentAction(this))); 87 toolBarActions.add(new IconToggleButton(new AddWayAction(this)));88 87 toolBarActions.add(new IconToggleButton(new DeleteAction(this))); 89 88 … … 104 103 addToggleDialog(conflictDialog = new ConflictDialog()); 105 104 addToggleDialog(new CommandStackDialog(this)); 105 addToggleDialog(new RelationListDialog()); 106 106 107 107 // status line below the map -
branch/0.5/src/org/openstreetmap/josm/gui/MapStatus.java
r298 r329 126 126 OsmPrimitive osmNearest = null; 127 127 // Set the text label in the bottom status bar 128 osmNearest = mv.getNearest(ms.mousePos , (ms.modifiers & MouseEvent.ALT_DOWN_MASK) != 0);128 osmNearest = mv.getNearest(ms.mousePos); 129 129 if (osmNearest != null) { 130 130 NameVisitor visitor = new NameVisitor(); -
branch/0.5/src/org/openstreetmap/josm/gui/MapView.java
r304 r329 85 85 86 86 // listend to selection changes to redraw the map 87 DataSet. listeners.add(new SelectionChangedListener(){87 DataSet.selListeners.add(new SelectionChangedListener(){ 88 88 public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) { 89 89 repaint(); -
branch/0.5/src/org/openstreetmap/josm/gui/NavigatableComponent.java
r306 r329 4 4 import java.awt.Point; 5 5 import java.util.Collection; 6 import java.util.Collections;7 6 import java.util.HashSet; 8 import java.util.List;9 7 10 8 import javax.swing.JComponent; … … 16 14 import org.openstreetmap.josm.data.osm.Node; 17 15 import org.openstreetmap.josm.data.osm.OsmPrimitive; 18 import org.openstreetmap.josm.data.osm.Segment;19 16 import org.openstreetmap.josm.data.osm.Way; 17 import org.openstreetmap.josm.data.osm.WaySegment; 20 18 import org.openstreetmap.josm.data.projection.Projection; 21 19 … … 147 145 148 146 /** 149 * @return the nearest way to the screen point given. 150 */ 151 public final Way getNearestWay(Point p) { 147 * @return the nearest way segment to the screen point given that is not 148 * in ignore. 149 * 150 * @param p the point for which to search the nearest segment. 151 * @param ignore a collection of segments which are not to be returned. 152 * May be null. 153 */ 154 public final WaySegment getNearestWaySegment(Point p, Collection<WaySegment> ignore) { 152 155 Way minPrimitive = null; 156 int minI = 0; 153 157 double minDistanceSq = Double.MAX_VALUE; 154 158 for (Way w : Main.ds.ways) { 155 159 if (w.deleted) 156 160 continue; 157 for (Segment ls : w.segments) { 158 if (ls.deleted || ls.incomplete) 161 Node lastN = null; 162 int i = -2; 163 for (Node n : w.nodes) { 164 i++; 165 if (n.deleted) continue; 166 if (lastN == null) { 167 lastN = n; 159 168 continue; 160 Point A = getPoint(ls.from.eastNorth); 161 Point B = getPoint(ls.to.eastNorth); 169 } 170 if (ignore != null && ignore.contains(new WaySegment(w, i))) { 171 continue; 172 } 173 Point A = getPoint(lastN.eastNorth); 174 Point B = getPoint(n.eastNorth); 162 175 double c = A.distanceSq(B); 163 176 double a = p.distanceSq(B); … … 167 180 minDistanceSq = perDist; 168 181 minPrimitive = w; 169 } 182 minI = i; 183 } 184 lastN = n; 170 185 } 171 186 } 172 return minPrimitive; 173 } 174 175 /** 176 * @return the nearest segment to the screen point given 177 * 178 * @param p the point for which to search the nearest segment. 179 */ 180 public final Segment getNearestSegment(Point p) { 181 List<Segment> e = Collections.emptyList(); 182 return getNearestSegment(p, e); 187 return minPrimitive == null ? null : new WaySegment(minPrimitive, minI); 188 } 189 190 /** 191 * @return the nearest way segment to the screen point given. 192 */ 193 public final WaySegment getNearestWaySegment(Point p) { 194 return getNearestWaySegment(p, null); 183 195 } 184 196 185 197 /** 186 * @return the nearest segment to the screen point given that is not 187 * in ignoreThis. 188 * 189 * @param p the point for which to search the nearest segment. 190 * @param ignore a collection of segments which are not to be returned. Must not be null. 191 */ 192 public final Segment getNearestSegment(Point p, Collection<Segment> ignore) { 193 Segment minPrimitive = null; 194 double minDistanceSq = Double.MAX_VALUE; 195 // segments 196 for (Segment ls : Main.ds.segments) { 197 if (ls.deleted || ls.incomplete || ignore.contains(ls)) 198 continue; 199 Point A = getPoint(ls.from.eastNorth); 200 Point B = getPoint(ls.to.eastNorth); 201 double c = A.distanceSq(B); 202 double a = p.distanceSq(B); 203 double b = p.distanceSq(A); 204 double perDist = a-(a-b+c)*(a-b+c)/4/c; // perpendicular distance squared 205 if (perDist < 100 && minDistanceSq > perDist && a < c+100 && b < c+100) { 206 minDistanceSq = perDist; 207 minPrimitive = ls; 208 } 209 } 210 return minPrimitive; 198 * @return the nearest way to the screen point given. 199 */ 200 public final Way getNearestWay(Point p) { 201 WaySegment nearestWaySeg = getNearestWaySegment(p); 202 return nearestWaySeg == null ? null : nearestWaySeg.way; 211 203 } 212 204 … … 217 209 * nearest node is returned. 218 210 * 219 * If no node is found, search for pending segments. 220 * 221 * If no such segment is found, and a non-pending segment is 222 * within 10 pixel to p, this segment is returned, except when 223 * <code>wholeWay</code> is <code>true</code>, in which case the 224 * corresponding Way is returned. 225 * 226 * If no segment is found and the point is within an area, return that 227 * area. 228 * 229 * If no area is found, return <code>null</code>. 211 * If no node is found, search for near ways. 212 * 213 * If nothing is found, return <code>null</code>. 230 214 * 231 215 * @param p The point on screen. 232 * @param segmentInsteadWay Whether the segment (true) or only the whole233 * way should be returned.234 216 * @return The primitive, that is nearest to the point p. 235 217 */ 218 public OsmPrimitive getNearest(Point p) { 219 OsmPrimitive osm = getNearestNode(p); 220 if (osm == null) 221 osm = getNearestWay(p); 222 return osm; 223 } 224 225 @Deprecated 236 226 public OsmPrimitive getNearest(Point p, boolean segmentInsteadWay) { 237 OsmPrimitive osm = getNearestNode(p); 238 if (osm == null && !segmentInsteadWay) 239 osm = getNearestWay(p); 240 if (osm == null) 241 osm = getNearestSegment(p); 242 return osm; 227 return getNearest(p); 243 228 } 244 229 245 230 /** 246 231 * @return A list of all objects that are nearest to 247 * the mouse. To do this, first the nearest object is 248 * determined. 249 * 250 * If its a node, return all segments and 251 * streets the node is part of, as well as all nodes 252 * (with their segments and ways) with the same 253 * location. 254 * 255 * If its a segment, return all ways this segment 256 * belongs to as well as all segments that are between 257 * the same nodes (in both direction) with all their ways. 232 * the mouse. Does a simple sequential scan on all the data. 258 233 * 259 234 * @return A collection of all items or <code>null</code> … … 262 237 */ 263 238 public Collection<OsmPrimitive> getAllNearest(Point p) { 264 OsmPrimitive osm = getNearest(p, true); 265 if (osm == null) 266 return null; 267 Collection<OsmPrimitive> c = new HashSet<OsmPrimitive>(); 268 c.add(osm); 269 if (osm instanceof Node) { 270 Node node = (Node)osm; 271 for (Node n : Main.ds.nodes) 272 if (!n.deleted && n.coor.equals(node.coor)) 273 c.add(n); 274 for (Segment ls : Main.ds.segments) 275 // segments never match nodes, so they are skipped by contains 276 if (!ls.deleted && !ls.incomplete && (c.contains(ls.from) || c.contains(ls.to))) 277 c.add(ls); 278 } 279 if (osm instanceof Segment) { 280 Segment line = (Segment)osm; 281 for (Segment ls : Main.ds.segments) 282 if (!ls.deleted && ls.equalPlace(line)) 283 c.add(ls); 284 } 285 if (osm instanceof Node || osm instanceof Segment) { 239 Collection<OsmPrimitive> nearest = new HashSet<OsmPrimitive>(); 286 240 for (Way w : Main.ds.ways) { 287 if (w.deleted) 241 if (w.deleted) continue; 242 Node lastN = null; 243 for (Node n : w.nodes) { 244 if (n.deleted) continue; 245 if (lastN == null) { 246 lastN = n; 288 247 continue; 289 for (Segment ls : w.segments) { 290 if (!ls.deleted && !ls.incomplete && c.contains(ls)) { 291 c.add(w); 248 } 249 Point A = getPoint(lastN.eastNorth); 250 Point B = getPoint(n.eastNorth); 251 double c = A.distanceSq(B); 252 double a = p.distanceSq(B); 253 double b = p.distanceSq(A); 254 double perDist = a-(a-b+c)*(a-b+c)/4/c; // perpendicular distance squared 255 if (perDist < 100 && a < c+100 && b < c+100) { 256 nearest.add(w); 292 257 break; 293 258 } 294 } 259 lastN = n; 260 } 261 } 262 for (Node n : Main.ds.nodes) { 263 if (!n.deleted && getPoint(n.eastNorth).distanceSq(p) < 100) { 264 nearest.add(n); 295 265 } 296 266 } 297 return c;267 return nearest.isEmpty() ? null : nearest; 298 268 } 299 269 -
branch/0.5/src/org/openstreetmap/josm/gui/OsmPrimitivRenderer.java
r298 r329 5 5 6 6 import javax.swing.DefaultListCellRenderer; 7 import javax.swing.JLabel; 7 8 import javax.swing.JList; 9 import javax.swing.JTable; 10 import javax.swing.ListCellRenderer; 11 import javax.swing.table.DefaultTableCellRenderer; 12 import javax.swing.table.TableCellRenderer; 8 13 9 14 import org.openstreetmap.josm.data.osm.OsmPrimitive; … … 12 17 /** 13 18 * Renderer that renders the objects from an OsmPrimitive as data. 19 * 20 * Can be used in lists and tables. 21 * 14 22 * @author imi 23 * @author Frederik Ramm <frederik@remote.org> 15 24 */ 16 public class OsmPrimitivRenderer extends DefaultListCellRenderer {25 public class OsmPrimitivRenderer implements ListCellRenderer, TableCellRenderer { 17 26 27 /** 28 * NameVisitor provides proper names and icons for OsmPrimitives 29 */ 18 30 private NameVisitor visitor = new NameVisitor(); 19 31 20 @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 21 super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 22 if (value != null) { 32 /** 33 * Default list cell renderer - delegate for ListCellRenderer operation 34 */ 35 private DefaultListCellRenderer defaultListCellRenderer = new DefaultListCellRenderer(); 36 37 /** 38 * Default table cell renderer - delegate for TableCellRenderer operation 39 */ 40 private DefaultTableCellRenderer defaultTableCellRenderer = new DefaultTableCellRenderer(); 41 42 /** 43 * Adapter method supporting the ListCellRenderer interface. 44 */ 45 public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 46 Component def = defaultListCellRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 47 return renderer(def, (OsmPrimitive) value); 48 } 49 50 /** 51 * Adapter method supporting the TableCellRenderer interface. 52 */ 53 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 54 Component def = defaultTableCellRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 55 return renderer(def, (OsmPrimitive) value); 56 } 57 58 /** 59 * Internal method that stuffs information into the rendering component 60 * provided that it's a kind of JLabel. 61 * @param def the rendering component 62 * @param value the OsmPrimtive to render 63 * @return the modified rendering component 64 */ 65 private Component renderer(Component def, OsmPrimitive value) { 66 if (def != null && value != null && def instanceof JLabel) { 23 67 ((OsmPrimitive)value).visit(visitor); 24 setText(visitor.name); 25 setIcon(visitor.icon); 68 ((JLabel)def).setText(visitor.name); 69 ((JLabel)def).setIcon(visitor.icon); 26 70 } 27 return this;71 return def; 28 72 } 73 29 74 } -
branch/0.5/src/org/openstreetmap/josm/gui/SelectionManager.java
r298 r329 25 25 import org.openstreetmap.josm.data.osm.Node; 26 26 import org.openstreetmap.josm.data.osm.OsmPrimitive; 27 import org.openstreetmap.josm.data.osm.Segment;28 27 import org.openstreetmap.josm.data.osm.Way; 29 28 … … 282 281 * modifier. 283 282 * @param alt Whether the alt key was pressed, which means select all objects 284 * that are touched, instead those which are completly covered. Also 285 * select whole ways instead of segments. 283 * that are touched, instead those which are completly covered. 286 284 */ 287 285 public Collection<OsmPrimitive> getObjectsInRectangle(Rectangle r, boolean alt) { … … 293 291 294 292 if (clicked) { 295 OsmPrimitive osm = nc.getNearest(center , alt);293 OsmPrimitive osm = nc.getNearest(center); 296 294 if (osm != null) 297 295 selection.add(osm); … … 303 301 } 304 302 305 // pending segments306 for (Segment s : Main.ds.segments)307 if (!s.deleted && rectangleContainSegment(r, alt, s))308 selection.add(s);309 310 303 // ways 311 304 for (Way w : Main.ds.ways) { 312 if (w.deleted) 313 continue; 314 boolean someSelectableSegment = false; 315 boolean wholeWaySelected = true; 316 for (Segment s : w.segments) { 317 if (s.incomplete) 305 if (w.deleted || w.nodes.isEmpty()) 318 306 continue; 319 someSelectableSegment = true; 320 if (!rectangleContainSegment(r, alt, s)) { 321 wholeWaySelected = false; 307 if (alt) { 308 for (Node n : w.nodes) { 309 if (r.contains(nc.getPoint(n.eastNorth))) { 310 selection.add(w); 322 311 break; 323 312 } 324 313 } 325 if (someSelectableSegment && wholeWaySelected) 326 selection.add(w); 314 } else { 315 boolean allIn = true; 316 for (Node n : w.nodes) { 317 if (!r.contains(nc.getPoint(n.eastNorth))) { 318 allIn = false; 319 break; 327 320 } 328 321 } 322 if (allIn) selection.add(w); 323 } 324 } 325 } 329 326 return selection; 330 }331 332 /**333 * Decide whether the segment is in the rectangle Return334 * <code>true</code>, if it is in or false if not.335 *336 * @param r The rectangle, in which the segment has to be.337 * @param alt Whether user pressed the Alt key338 * @param ls The segment.339 * @return <code>true</code>, if the Segment was added to the selection.340 */341 private boolean rectangleContainSegment(Rectangle r, boolean alt, Segment ls) {342 if (ls.incomplete)343 return false;344 if (alt) {345 Point p1 = nc.getPoint(ls.from.eastNorth);346 Point p2 = nc.getPoint(ls.to.eastNorth);347 if (r.intersectsLine(p1.x, p1.y, p2.x, p2.y))348 return true;349 } else {350 if (r.contains(nc.getPoint(ls.from.eastNorth))351 && r.contains(nc.getPoint(ls.to.eastNorth)))352 return true;353 }354 return false;355 327 } 356 328 -
branch/0.5/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java
r301 r329 33 33 import org.openstreetmap.josm.data.SelectionChangedListener; 34 34 import org.openstreetmap.josm.data.osm.DataSet; 35 import org.openstreetmap.josm.data.osm.Relation; 36 import org.openstreetmap.josm.data.osm.RelationMember; 35 37 import org.openstreetmap.josm.data.osm.Node; 36 38 import org.openstreetmap.josm.data.osm.OsmPrimitive; 37 import org.openstreetmap.josm.data.osm.Segment;38 39 import org.openstreetmap.josm.data.osm.Way; 39 40 import org.openstreetmap.josm.data.osm.visitor.SimplePaintVisitor; … … 88 89 add(buttonPanel, BorderLayout.SOUTH); 89 90 90 DataSet. listeners.add(new SelectionChangedListener(){91 DataSet.selListeners.add(new SelectionChangedListener(){ 91 92 public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) { 92 93 displaylist.clearSelection(); … … 130 131 model.addElement(osm); 131 132 for (OsmPrimitive osm : this.conflicts.keySet()) 132 if (osm instanceof Segment)133 model.addElement(osm);134 for (OsmPrimitive osm : this.conflicts.keySet())135 133 if (osm instanceof Way) 136 134 model.addElement(osm); … … 155 153 g.drawRect(p.x-1, p.y-1, 2, 2); 156 154 } 157 public void visit(Segment ls) { 158 if (ls.incomplete) 159 return; 160 Point p1 = nc.getPoint(ls.from.eastNorth); 161 Point p2 = nc.getPoint(ls.to.eastNorth); 155 public void visit(Node n1, Node n2) { 156 Point p1 = nc.getPoint(n1.eastNorth); 157 Point p2 = nc.getPoint(n2.eastNorth); 162 158 g.drawLine(p1.x, p1.y, p2.x, p2.y); 163 159 } 164 160 public void visit(Way w) { 165 for (Segment ls : w.segments) 166 visit(ls); 161 Node lastN = null; 162 for (Node n : w.nodes) { 163 if (lastN == null) { 164 lastN = n; 165 continue; 166 } 167 visit(lastN, n); 168 lastN = n; 169 } 170 } 171 public void visit(Relation e) { 172 for (RelationMember em : e.members) 173 em.member.visit(this); 167 174 } 168 175 }; -
branch/0.5/src/org/openstreetmap/josm/gui/dialogs/HistoryDialog.java
r298 r329 144 144 revertButton.putClientProperty("help", "Dialog/History/Revert"); 145 145 146 DataSet. listeners.add(this);146 DataSet.selListeners.add(this); 147 147 } 148 148 -
branch/0.5/src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java
r301 r329 48 48 import org.openstreetmap.josm.data.osm.DataSet; 49 49 import org.openstreetmap.josm.data.osm.OsmPrimitive; 50 import org.openstreetmap.josm.data.osm.Relation; 51 import org.openstreetmap.josm.data.osm.RelationMember; 52 import org.openstreetmap.josm.data.osm.visitor.NameVisitor; 50 53 import org.openstreetmap.josm.gui.MapFrame; 51 54 import org.openstreetmap.josm.gui.preferences.TaggingPresetPreference; 55 import org.openstreetmap.josm.gui.tagging.ForwardActionListener; 52 56 import org.openstreetmap.josm.gui.tagging.TaggingCellRenderer; 53 import org.openstreetmap.josm.gui.tagging.ForwardActionListener;54 57 import org.openstreetmap.josm.gui.tagging.TaggingPreset; 55 58 import org.openstreetmap.josm.tools.AutoCompleteComboBox; … … 77 80 78 81 /** 82 * Used to display relation names in the membership table 83 */ 84 private NameVisitor nameVisitor = new NameVisitor(); 85 86 /** 79 87 * Watches for double clicks and from editing or new property, depending on the 80 88 * location, the click was. … … 85 93 if (e.getClickCount() < 2) 86 94 return; 87 if (e.getSource() instanceof JScrollPane)88 add();89 else{95 96 if (e.getSource() == propertyTable) 97 { 90 98 int row = propertyTable.rowAtPoint(e.getPoint()); 91 edit(row); 92 } 93 } 94 } 95 96 /** 97 * Edit the value in the table row 98 * @param row The row of the table, from which the value is edited. 99 */ 100 void edit(int row) { 101 String key = data.getValueAt(row, 0).toString(); 99 if (row > -1) { 100 propertyEdit(row); 101 return; 102 } 103 } else if (e.getSource() == membershipTable) { 104 int row = membershipTable.rowAtPoint(e.getPoint()); 105 if (row > -1) { 106 membershipEdit(row); 107 return; 108 } 109 } 110 add(); 111 } 112 } 113 114 /** 115 * Edit the value in the properties table row 116 * @param row The row of the table from which the value is edited. 117 */ 118 void propertyEdit(int row) { 119 String key = propertyData.getValueAt(row, 0).toString(); 102 120 Collection<OsmPrimitive> sel = Main.ds.getSelected(); 103 121 if (sel.isEmpty()) { … … 118 136 p.add(keyField, GBC.eol().fill(GBC.HORIZONTAL)); 119 137 120 final J ComboBox combo = (JComboBox)data.getValueAt(row, 1);138 final JTextField valueField = new JTextField((String)propertyData.getValueAt(row, 1)); 121 139 p.add(new JLabel(tr("Value")), GBC.std()); 122 140 p.add(Box.createHorizontalStrut(10), GBC.std()); 123 p.add( combo, GBC.eol().fill(GBC.HORIZONTAL));141 p.add(valueField, GBC.eol().fill(GBC.HORIZONTAL)); 124 142 125 143 final JOptionPane optionPane = new JOptionPane(panel, JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION){ 126 144 @Override public void selectInitialValue() { 127 combo.requestFocusInWindow();128 combo.getEditor().selectAll();145 valueField.requestFocusInWindow(); 146 valueField.selectAll(); 129 147 } 130 148 }; 131 149 final JDialog dlg = optionPane.createDialog(Main.parent, tr("Change values?")); 132 combo.getEditor().addActionListener(new ActionListener(){150 valueField.addActionListener(new ActionListener(){ 133 151 public void actionPerformed(ActionEvent e) { 134 152 optionPane.setValue(JOptionPane.OK_OPTION); … … 136 154 } 137 155 }); 138 String oldComboEntry = combo.getEditor().getItem().toString();139 156 dlg.setVisible(true); 140 157 … … 142 159 if (answer == null || answer == JOptionPane.UNINITIALIZED_VALUE || 143 160 (answer instanceof Integer && (Integer)answer != JOptionPane.OK_OPTION)) { 144 combo.getEditor().setItem(oldComboEntry); 145 return; 146 } 147 148 String value = combo.getEditor().getItem().toString(); 161 return; 162 } 163 164 String value = valueField.getText(); 149 165 if (value.equals(tr("<different>"))) 150 166 return; … … 164 180 } 165 181 166 if (!key.equals(newkey) || value == null)167 182 selectionChanged(sel); // update whole table 168 169 183 Main.parent.repaint(); // repaint all - drawing could have been changed 184 } 185 186 /** 187 * This simply fires up an relation editor for the relation shown; everything else 188 * is the editor's business. 189 * 190 * @param row 191 */ 192 void membershipEdit(int row) { 193 final RelationEditor editor = new RelationEditor((Relation)membershipData.getValueAt(row, 0)); 194 editor.setVisible(true); 170 195 } 171 196 … … 197 222 } 198 223 } 199 for (int i = 0; i < data.getRowCount(); ++i)200 allData.remove( data.getValueAt(i, 0));224 for (int i = 0; i < propertyData.getRowCount(); ++i) 225 allData.remove(propertyData.getValueAt(i, 0)); 201 226 final AutoCompleteComboBox keys = new AutoCompleteComboBox(); 202 227 keys.setPossibleItems(allData.keySet()); … … 249 274 */ 250 275 private void delete(int row) { 251 String key = data.getValueAt(row, 0).toString();276 String key = propertyData.getValueAt(row, 0).toString(); 252 277 Collection<OsmPrimitive> sel = Main.ds.getSelected(); 253 278 Main.main.undoRedo.add(new ChangePropertyCommand(sel, key, null)); … … 258 283 * The property data. 259 284 */ 260 private final DefaultTableModel data = new DefaultTableModel(){285 private final DefaultTableModel propertyData = new DefaultTableModel() { 261 286 @Override public boolean isCellEditable(int row, int column) { 262 287 return false; 263 288 } 264 289 @Override public Class<?> getColumnClass(int columnIndex) { 265 return columnIndex == 1 ? JComboBox.class :String.class;290 return String.class; 266 291 } 267 292 }; 293 294 /** 295 * The membership data. 296 */ 297 private final DefaultTableModel membershipData = new DefaultTableModel() { 298 @Override public boolean isCellEditable(int row, int column) { 299 return false; 300 } 301 @Override public Class<?> getColumnClass(int columnIndex) { 302 return columnIndex == 1 ? Relation.class : String.class; 303 } 304 }; 305 268 306 /** 269 307 * The properties list. 270 308 */ 271 private final JTable propertyTable = new JTable(data); 309 private final JTable propertyTable = new JTable(propertyData); 310 private final JTable membershipTable = new JTable(membershipData); 311 272 312 public JComboBox taggingPresets = new JComboBox(); 273 313 … … 277 317 */ 278 318 public PropertiesDialog(MapFrame mapFrame) { 279 super(tr("Properties"), "propertiesdialog", tr("Properties for selected objects."), KeyEvent.VK_P, 150); 319 super(tr("Properties/Memberships"), "propertiesdialog", tr("Properties for selected objects."), KeyEvent.VK_P, 150); 280 320 281 321 if (TaggingPresetPreference.taggingPresets.size() > 0) { … … 300 340 taggingPresets.setRenderer(new TaggingCellRenderer()); 301 341 302 data.setColumnIdentifiers(new String[]{tr("Key"),tr("Value")}); 342 // setting up the properties table 343 344 propertyData.setColumnIdentifiers(new String[]{tr("Key"),tr("Value")}); 303 345 propertyTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 304 propertyTable.setDefaultRenderer(JComboBox.class, new DefaultTableCellRenderer(){ 346 347 propertyTable.getColumnModel().getColumn(1).setCellRenderer(new DefaultTableCellRenderer(){ 305 348 @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 306 349 Component c = super.getTableCellRendererComponent(table, value, isSelected, false, row, column); 307 350 if (c instanceof JLabel) { 308 String str = ( (JComboBox)value).getEditor().getItem().toString();351 String str = (String) value; 309 352 ((JLabel)c).setText(str); 310 353 if (str.equals(tr("<different>"))) … … 314 357 } 315 358 }); 316 propertyTable.setDefaultRenderer(String.class, new DefaultTableCellRenderer(){ 359 360 // setting up the membership table 361 362 membershipData.setColumnIdentifiers(new String[]{tr("Member Of"),tr("Role")}); 363 membershipTable.setRowSelectionAllowed(false); 364 365 membershipTable.getColumnModel().getColumn(0).setCellRenderer(new DefaultTableCellRenderer() { 317 366 @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 318 return super.getTableCellRendererComponent(table, value, isSelected, false, row, column); 367 Component c = super.getTableCellRendererComponent(table, value, isSelected, false, row, column); 368 if (c instanceof JLabel) { 369 nameVisitor.visit((Relation)value); 370 ((JLabel)c).setText(nameVisitor.name); 371 } 372 return c; 319 373 } 320 374 }); 375 376 // combine both tables and wrap them in a scrollPane 377 JPanel bothTables = new JPanel(); 378 bothTables.setLayout(new GridBagLayout()); 379 bothTables.add(propertyTable.getTableHeader(), GBC.eol().fill(GBC.HORIZONTAL)); 380 bothTables.add(propertyTable, GBC.eol().fill(GBC.BOTH)); 381 bothTables.add(membershipTable.getTableHeader(), GBC.eol().fill(GBC.HORIZONTAL)); 382 bothTables.add(membershipTable, GBC.eol().fill(GBC.BOTH)); 383 321 384 DblClickWatch dblClickWatch = new DblClickWatch(); 322 385 propertyTable.addMouseListener(dblClickWatch); 323 JScrollPane scrollPane = new JScrollPane(propertyTable); 386 membershipTable.addMouseListener(dblClickWatch); 387 JScrollPane scrollPane = new JScrollPane(bothTables); 324 388 scrollPane.addMouseListener(dblClickWatch); 325 389 add(scrollPane, BorderLayout.CENTER); … … 335 399 JOptionPane.showMessageDialog(Main.parent, tr("Please select the row to edit.")); 336 400 else 337 edit(sel);401 propertyEdit(sel); 338 402 } else if (e.getActionCommand().equals("Delete")) { 339 403 if (sel == -1) … … 344 408 } 345 409 }; 410 346 411 buttonPanel.add(createButton(marktr("Add"),tr("Add a new key/value pair to all objects"), KeyEvent.VK_A, buttonAction)); 347 412 buttonPanel.add(createButton(marktr("Edit"),tr( "Edit the value of the selected key for all objects"), KeyEvent.VK_E, buttonAction)); … … 349 414 add(buttonPanel, BorderLayout.SOUTH); 350 415 351 DataSet. listeners.add(this);416 DataSet.selListeners.add(this); 352 417 } 353 418 … … 375 440 if (propertyTable.getCellEditor() != null) 376 441 propertyTable.getCellEditor().cancelCellEditing(); 377 data.setRowCount(0); 442 443 // re-load property data 444 445 propertyData.setRowCount(0); 378 446 379 447 Map<String, Integer> valueCount = new HashMap<String, Integer>(); … … 391 459 } 392 460 for (Entry<String, Collection<String>> e : props.entrySet()) { 393 JComboBox value = new JComboBox(e.getValue().toArray()); 394 value.setEditable(true); 395 value.getEditor().setItem(e.getValue().size() > 1 || valueCount.get(e.getKey()) != newSelection.size() ? tr("<different>") : e.getValue().iterator().next()); 396 data.addRow(new Object[]{e.getKey(), value}); 461 String value=(e.getValue().size() > 1 || valueCount.get(e.getKey()) != newSelection.size() ? tr("<different>") : e.getValue().iterator().next()); 462 propertyData.addRow(new Object[]{e.getKey(), value}); 463 } 464 465 // re-load membership data 466 // this is rather expensive since we have to walk through all members of all existing relationships. 467 // could use back references here for speed if necessary. 468 469 membershipData.setRowCount(0); 470 471 Map<Relation, Integer> valueCountM = new HashMap<Relation, Integer>(); 472 TreeMap<Relation, Collection<String>> roles = new TreeMap<Relation, Collection<String>>(); 473 for (Relation r : Main.ds.relations) { 474 for (RelationMember m : r.members) { 475 if (newSelection.contains(m.member)) { 476 Collection<String> value = roles.get(r); 477 if (value == null) { 478 value = new TreeSet<String>(); 479 roles.put(r, value); 480 } 481 value.add(m.role); 482 valueCountM.put(r, valueCount.containsKey(r) ? valueCount.get(r)+1 : 1); 483 } 484 } 485 } 486 487 for (Entry<Relation, Collection<String>> e : roles.entrySet()) { 488 //JComboBox value = new JComboBox(e.getValue().toArray()); 489 //value.setEditable(true); 490 //value.getEditor().setItem(e.getValue().size() > 1 || valueCount.get(e.getKey()) != newSelection.size() ? tr("<different>") : e.getValue().iterator().next()); 491 String value = e.getValue().size() > 1 || valueCountM.get(e.getKey()) != newSelection.size() ? tr("<different>") : e.getValue().iterator().next(); 492 membershipData.addRow(new Object[]{e.getKey(), value}); 397 493 } 398 494 } -
branch/0.5/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
r298 r329 80 80 selectionChanged(Main.ds.getSelected()); 81 81 82 DataSet. listeners.add(this);82 DataSet.selListeners.add(this); 83 83 } 84 84 -
branch/0.5/src/org/openstreetmap/josm/gui/dialogs/UserListDialog.java
r298 r329 54 54 selectionChanged(Main.ds.getSelected()); 55 55 56 DataSet. listeners.add(this);56 DataSet.selListeners.add(this); 57 57 } 58 58 -
branch/0.5/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
r312 r329 34 34 import org.openstreetmap.josm.data.osm.DataSet; 35 35 import org.openstreetmap.josm.data.osm.DataSource; 36 import org.openstreetmap.josm.data.osm.Relation; 36 37 import org.openstreetmap.josm.data.osm.Node; 37 38 import org.openstreetmap.josm.data.osm.OsmPrimitive; 38 import org.openstreetmap.josm.data.osm.Segment;39 39 import org.openstreetmap.josm.data.osm.Way; 40 40 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor; … … 60 60 public final int[] normal = new int[3]; 61 61 public final int[] deleted = new int[3]; 62 public final String[] names = {"node", " segment", "way"};62 public final String[] names = {"node", "way", "relation"}; 63 63 64 64 private void inc(final OsmPrimitive osm, final int i) { … … 72 72 } 73 73 74 public void visit(final Segment ls) {75 inc(ls, 1);76 }77 78 74 public void visit(final Way w) { 75 inc(w, 1); 76 } 77 public void visit(final Relation w) { 79 78 inc(w, 2); 80 79 } … … 133 132 * Draw all primitives in this layer but do not draw modified ones (they 134 133 * are drawn by the edit layer). 135 * Draw nodes last to overlap the segments they belong to.134 * Draw nodes last to overlap the ways they belong to. 136 135 */ 137 136 @Override public void paint(final Graphics g, final MapView mv) { … … 163 162 String tool = ""; 164 163 tool += undeletedSize(data.nodes)+" "+trn("node", "nodes", undeletedSize(data.nodes))+", "; 165 tool += undeletedSize(data.segments)+" "+trn("segment", "segments", undeletedSize(data.segments))+", ";166 164 tool += undeletedSize(data.ways)+" "+trn("way", "ways", undeletedSize(data.ways)); 167 165 if (associatedFile != null) … … 222 220 for (final Iterator<Node> it = data.nodes.iterator(); it.hasNext();) 223 221 cleanIterator(it, processedSet); 224 for (final Iterator<Segment> it = data.segments.iterator(); it.hasNext();)225 cleanIterator(it, processedSet);226 222 for (final Iterator<Way> it = data.ways.iterator(); it.hasNext();) 227 223 cleanIterator(it, processedSet); -
branch/0.5/src/org/openstreetmap/josm/gui/layer/RawGpsLayer.java
r298 r329 38 38 import org.openstreetmap.josm.data.osm.DataSet; 39 39 import org.openstreetmap.josm.data.osm.Node; 40 import org.openstreetmap.josm.data.osm.Segment;41 40 import org.openstreetmap.josm.data.osm.Way; 42 41 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor; … … 71 70 for (Collection<GpsPoint> c : data) { 72 71 Way w = new Way(); 73 Node start = null;74 72 for (GpsPoint p : c) { 75 Node end = new Node(p.latlon); 76 ds.nodes.add(end); 77 if (start != null) { 78 Segment segment = new Segment(start,end); 79 w.segments.add(segment); 80 ds.segments.add(segment); 81 } 82 start = end; 73 Node n = new Node(p.latlon); 74 ds.nodes.add(n); 75 w.nodes.add(n); 83 76 } 84 77 ds.ways.add(w);
Note:
See TracChangeset
for help on using the changeset viewer.