source: josm/trunk/src/org/openstreetmap/josm/actions/UpdateSelectionAction.java@ 5508

Last change on this file since 5508 was 5360, checked in by Don-vip, 12 years ago

fix #7776 - Selection of deleted objects

  • Property svn:eol-style set to native
File size: 4.9 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.actions;
3
4import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
5import static org.openstreetmap.josm.tools.CheckParameterUtil.ensureParameterNotNull;
6import static org.openstreetmap.josm.tools.I18n.tr;
7
8import java.awt.event.ActionEvent;
9import java.awt.event.KeyEvent;
10import java.util.Collection;
11import java.util.Collections;
12
13import javax.swing.JOptionPane;
14
15import org.openstreetmap.josm.Main;
16import org.openstreetmap.josm.data.osm.DataSet;
17import org.openstreetmap.josm.data.osm.OsmPrimitive;
18import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
19import org.openstreetmap.josm.data.osm.PrimitiveId;
20import org.openstreetmap.josm.gui.ExceptionDialogUtil;
21import org.openstreetmap.josm.gui.io.UpdatePrimitivesTask;
22import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
23import org.openstreetmap.josm.io.MultiFetchServerObjectReader;
24import org.openstreetmap.josm.tools.Shortcut;
25
26/**
27 * This action synchronizes a set of primitives with their state on the server.
28 *
29 */
30public class UpdateSelectionAction extends JosmAction {
31
32 /**
33 * handle an exception thrown because a primitive was deleted on the server
34 *
35 * @param id the primitive id
36 */
37 public void handlePrimitiveGoneException(long id, OsmPrimitiveType type) {
38 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
39 reader.append(getCurrentDataSet(),id, type);
40 try {
41 DataSet ds = reader.parseOsm(NullProgressMonitor.INSTANCE);
42 Main.map.mapView.getEditLayer().mergeFrom(ds);
43 } catch(Exception e) {
44 ExceptionDialogUtil.explainException(e);
45 }
46 }
47
48 /**
49 * Updates the data for for the {@link OsmPrimitive}s in <code>selection</code>
50 * with the data currently kept on the server.
51 *
52 * @param selection a collection of {@link OsmPrimitive}s to update
53 *
54 */
55 public void updatePrimitives(final Collection<OsmPrimitive> selection) {
56 UpdatePrimitivesTask task = new UpdatePrimitivesTask(Main.main.getEditLayer(),selection);
57 Main.worker.submit(task);
58 }
59
60 /**
61 * Updates the data for the {@link OsmPrimitive}s with id <code>id</code>
62 * with the data currently kept on the server.
63 *
64 * @param id the id of a primitive in the {@link DataSet} of the current edit layer. Must not be null.
65 * @throws IllegalArgumentException thrown if id is null
66 * @exception IllegalStateException thrown if there is no primitive with <code>id</code> in
67 * the current dataset
68 * @exception IllegalStateException thrown if there is no current dataset
69 *
70 */
71 public void updatePrimitive(PrimitiveId id) throws IllegalStateException, IllegalArgumentException{
72 ensureParameterNotNull(id, "id");
73 if (getEditLayer() == null)
74 throw new IllegalStateException(tr("No current dataset found"));
75 OsmPrimitive primitive = getEditLayer().data.getPrimitiveById(id);
76 if (primitive == null)
77 throw new IllegalStateException(tr("Did not find an object with id {0} in the current dataset", id));
78 updatePrimitives(Collections.singleton(primitive));
79 }
80
81 /**
82 * constructor
83 */
84 public UpdateSelectionAction() {
85 super(tr("Update selection"),
86 "updateselection",
87 tr("Updates the currently selected objects from the server (re-downloads data)"),
88 Shortcut.registerShortcut("file:updateselection",
89 tr("File: {0}", tr("Update selection")), KeyEvent.VK_U,
90 Shortcut.ALT_CTRL),
91 true);
92 putValue("help", ht("/Action/UpdateSelection"));
93 }
94 public UpdateSelectionAction(String name, String iconName, String tooltip,
95 Shortcut shortcut, boolean register) {
96 super(name, iconName, tooltip, shortcut, register);
97 }
98
99 @Override
100 protected void updateEnabledState() {
101 if (getCurrentDataSet() == null) {
102 setEnabled(false);
103 } else {
104 updateEnabledState(getCurrentDataSet().getAllSelected());
105 }
106 }
107
108 @Override
109 protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
110 setEnabled(selection != null && !selection.isEmpty());
111 }
112
113 /**
114 * action handler
115 */
116 public void actionPerformed(ActionEvent e) {
117 if (! isEnabled())
118 return;
119 Collection<OsmPrimitive> toUpdate =getData();
120 if (toUpdate.size() == 0) {
121 JOptionPane.showMessageDialog(
122 Main.parent,
123 tr("There are no selected objects to update."),
124 tr("Selection empty"),
125 JOptionPane.INFORMATION_MESSAGE
126 );
127 return;
128 }
129 updatePrimitives(toUpdate);
130 }
131
132 public Collection<OsmPrimitive> getData() {
133 return getCurrentDataSet().getAllSelected();
134 }
135}
Note: See TracBrowser for help on using the repository browser.