001 // License: GPL. For details, see LICENSE file.
002 package org.openstreetmap.josm.actions;
003
004 import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
005 import static org.openstreetmap.josm.tools.CheckParameterUtil.ensureParameterNotNull;
006 import static org.openstreetmap.josm.tools.I18n.tr;
007
008 import java.awt.event.ActionEvent;
009 import java.awt.event.KeyEvent;
010 import java.util.Collection;
011 import java.util.Collections;
012
013 import javax.swing.JOptionPane;
014
015 import org.openstreetmap.josm.Main;
016 import org.openstreetmap.josm.data.osm.DataSet;
017 import org.openstreetmap.josm.data.osm.OsmPrimitive;
018 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
019 import org.openstreetmap.josm.data.osm.PrimitiveId;
020 import org.openstreetmap.josm.gui.ExceptionDialogUtil;
021 import org.openstreetmap.josm.gui.io.UpdatePrimitivesTask;
022 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
023 import org.openstreetmap.josm.io.MultiFetchServerObjectReader;
024 import org.openstreetmap.josm.tools.Shortcut;
025
026 /**
027 * This action synchronizes a set of primitives with their state on the server.
028 *
029 */
030 public class UpdateSelectionAction extends JosmAction {
031
032 /**
033 * handle an exception thrown because a primitive was deleted on the server
034 *
035 * @param id the primitive id
036 */
037 public void handlePrimitiveGoneException(long id, OsmPrimitiveType type) {
038 MultiFetchServerObjectReader reader = new MultiFetchServerObjectReader();
039 reader.append(getCurrentDataSet(),id, type);
040 try {
041 DataSet ds = reader.parseOsm(NullProgressMonitor.INSTANCE);
042 Main.map.mapView.getEditLayer().mergeFrom(ds);
043 } catch(Exception e) {
044 ExceptionDialogUtil.explainException(e);
045 }
046 }
047
048 /**
049 * Updates the data for for the {@link OsmPrimitive}s in <code>selection</code>
050 * with the data currently kept on the server.
051 *
052 * @param selection a collection of {@link OsmPrimitive}s to update
053 *
054 */
055 public void updatePrimitives(final Collection<OsmPrimitive> selection) {
056 UpdatePrimitivesTask task = new UpdatePrimitivesTask(Main.main.getEditLayer(),selection);
057 Main.worker.submit(task);
058 }
059
060 /**
061 * Updates the data for the {@link OsmPrimitive}s with id <code>id</code>
062 * with the data currently kept on the server.
063 *
064 * @param id the id of a primitive in the {@link DataSet} of the current edit layer. Must not be null.
065 * @throws IllegalArgumentException thrown if id is null
066 * @exception IllegalStateException thrown if there is no primitive with <code>id</code> in
067 * the current dataset
068 * @exception IllegalStateException thrown if there is no current dataset
069 *
070 */
071 public void updatePrimitive(PrimitiveId id) throws IllegalStateException, IllegalArgumentException{
072 ensureParameterNotNull(id, "id");
073 if (getEditLayer() == null)
074 throw new IllegalStateException(tr("No current dataset found"));
075 OsmPrimitive primitive = getEditLayer().data.getPrimitiveById(id);
076 if (primitive == null)
077 throw new IllegalStateException(tr("Did not find an object with id {0} in the current dataset", id));
078 updatePrimitives(Collections.singleton(primitive));
079 }
080
081 /**
082 * constructor
083 */
084 public UpdateSelectionAction() {
085 super(tr("Update selection"),
086 "updateselection",
087 tr("Updates the currently selected objects from the server (re-downloads data)"),
088 Shortcut.registerShortcut("file:updateselection",
089 tr("File: {0}", tr("Update selection")), KeyEvent.VK_U,
090 Shortcut.ALT_CTRL),
091 true);
092 putValue("help", ht("/Action/UpdateSelection"));
093 }
094 public UpdateSelectionAction(String name, String iconName, String tooltip,
095 Shortcut shortcut, boolean register) {
096 super(name, iconName, tooltip, shortcut, register);
097 }
098
099 @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 }