Ticket #12409: EditLastRelation.patch
File EditLastRelation.patch, 8.4 KB (added by , 8 years ago) |
---|
-
new file src/org/openstreetmap/josm/actions/relation/EditLastRelationAction.java
diff --git a/src/org/openstreetmap/josm/actions/relation/EditLastRelationAction.java b/src/org/openstreetmap/josm/actions/relation/EditLastRelationAction.java new file mode 100644 index 0000000..f959437
- + 1 // License: GPL. For details, see LICENSE file. 2 package org.openstreetmap.josm.actions.relation; 3 4 import static org.openstreetmap.josm.tools.I18n.tr; 5 import static org.openstreetmap.josm.tools.I18n.trn; 6 7 import java.awt.event.ActionEvent; 8 import java.awt.event.KeyEvent; 9 import java.util.Collection; 10 import java.util.HashSet; 11 import java.util.Set; 12 13 import javax.swing.JOptionPane; 14 15 import org.openstreetmap.josm.Main; 16 import org.openstreetmap.josm.actions.JosmAction; 17 import org.openstreetmap.josm.data.osm.OsmPrimitive; 18 import org.openstreetmap.josm.data.osm.Relation; 19 import org.openstreetmap.josm.data.osm.RelationMember; 20 import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor; 21 import org.openstreetmap.josm.gui.layer.Layer; 22 import org.openstreetmap.josm.gui.layer.OsmDataLayer; 23 import org.openstreetmap.josm.gui.layer.OsmDataLayer.CommandQueueListener; 24 import org.openstreetmap.josm.gui.MapView.LayerChangeListener; 25 import org.openstreetmap.josm.tools.Shortcut; 26 27 /** 28 * The action for editing the last relation. 29 */ 30 public class EditLastRelationAction extends JosmAction implements CommandQueueListener { 31 32 /** 33 * Constructs a new <code>EditLastRelationAction</code>. 34 */ 35 public EditLastRelationAction() { 36 super( 37 tr("Open last relation"), 38 "dialogs/edit-last", 39 tr("Call relation editor for last relation"), 40 Shortcut.registerShortcut( 41 "relationeditor:editlastrelation", 42 tr("Relation Editor: {0}", tr("Open last relation")), 43 KeyEvent.CHAR_UNDEFINED, 44 Shortcut.NONE 45 ), 46 false 47 ); 48 Main.main.undoRedo.addCommandQueueListener(this); 49 } 50 51 /** 52 * Returns the set of currently selected relation members for the given relation. 53 * @param r The relation to inspect 54 * @return The set of currently selected relation members for the given relation. 55 */ 56 public static Set<RelationMember> getMembersForCurrentSelection(Relation r) { 57 Set<RelationMember> members = new HashSet<>(); 58 if (Main.isDisplayingMapView()) { 59 OsmDataLayer editLayer = Main.main.getEditLayer(); 60 if (editLayer != null && editLayer.data != null) { 61 Collection<OsmPrimitive> selection = editLayer.data.getSelected(); 62 for (RelationMember member: r.getMembers()) { 63 if (selection.contains(member.getMember())) { 64 members.add(member); 65 } 66 } 67 } 68 } 69 return members; 70 } 71 72 /** 73 * Launches relation editor for the given relation. 74 * @param toEdit The relation to edit 75 */ 76 public static void launchEditor(Relation toEdit) { 77 if (toEdit == null || toEdit.isDeleted() || !Main.isDisplayingMapView()) return; 78 RelationEditor.getEditor(Main.main.getEditLayer(), toEdit, 79 getMembersForCurrentSelection(toEdit)).setVisible(true); 80 } 81 82 @Override 83 public void actionPerformed(ActionEvent e) { 84 Relation r = getLastRelationOnActiveLayer(); 85 if (r == null || !isEnabled()) return; 86 launchEditor(r); 87 } 88 89 @Override 90 public void updateEnabledState() { 91 Relation r = getLastRelationOnActiveLayer(); 92 setEnabled(r != null && !r.isDeleted()); 93 } 94 95 private Relation getLastRelationOnActiveLayer() { 96 if (Main.map == null || Main.map.mapView == null) return null; 97 Layer activeLayer = Main.map.mapView.getActiveLayer(); 98 if (!(activeLayer instanceof OsmDataLayer)) { 99 return null; 100 } else { 101 return ((OsmDataLayer) activeLayer).getLastRelation(); 102 } 103 } 104 105 @Override 106 public void commandChanged(int queueSize, int redoSize) { 107 updateEnabledState(); 108 } 109 } -
src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
diff --git a/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java b/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java index 53cb4da..a9aab41 100644
a b import org.openstreetmap.josm.actions.relation.DeleteRelationsAction; 40 40 import org.openstreetmap.josm.actions.relation.DownloadMembersAction; 41 41 import org.openstreetmap.josm.actions.relation.DownloadSelectedIncompleteMembersAction; 42 42 import org.openstreetmap.josm.actions.relation.DuplicateRelationAction; 43 import org.openstreetmap.josm.actions.relation.EditLastRelationAction; 43 44 import org.openstreetmap.josm.actions.relation.EditRelationAction; 44 45 import org.openstreetmap.josm.actions.relation.SelectMembersAction; 45 46 import org.openstreetmap.josm.actions.relation.SelectRelationAction; … … public class RelationListDialog extends ToggleDialog 105 106 // Actions 106 107 /** the edit action */ 107 108 private final EditRelationAction editAction = new EditRelationAction(); 109 private final EditLastRelationAction editLastAction = new EditLastRelationAction(); 108 110 /** the delete action */ 109 111 private final DeleteRelationsAction deleteRelationsAction = new DeleteRelationsAction(); 110 112 /** the duplicate action */ … … public class RelationListDialog extends ToggleDialog 171 173 createLayout(pane, false, Arrays.asList(new SideButton[]{ 172 174 new SideButton(newAction, false), 173 175 new SideButton(editAction, false), 176 new SideButton(editLastAction, false), 174 177 new SideButton(duplicateAction, false), 175 178 new SideButton(deleteRelationsAction, false), 176 179 new SideButton(selectRelationAction, false) … … public class RelationListDialog extends ToggleDialog 212 215 MapView.addLayerChangeListener(newAction); 213 216 MapView.addZoomChangeListener(this); 214 217 newAction.updateEnabledState(); 218 editLastAction.updateEnabledState(); 215 219 DatasetEventManager.getInstance().addDatasetListener(this, FireMode.IN_EDT); 216 220 DataSet.addSelectionListener(addSelectionToRelations); 217 221 dataChanged(null); … … public class RelationListDialog extends ToggleDialog 288 292 } 289 293 } 290 294 295 public void updateEnabledStateEditLastAction() { 296 editLastAction.updateEnabledState(); 297 } 298 291 299 private JosmTextField setupFilter() { 292 300 final JosmTextField f = new DisableShortcutsOnFocusGainedTextField(); 293 301 f.setToolTipText(tr("Relation list filter")); -
src/org/openstreetmap/josm/gui/dialogs/relation/RelationEditor.java
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/RelationEditor.java b/src/org/openstreetmap/josm/gui/dialogs/relation/RelationEditor.java index 8c04d22..13db6cb 100644
a b public abstract class RelationEditor extends ExtendedDialog implements RelationA 189 189 public final void removePropertyChangeListener(PropertyChangeListener listener) { 190 190 this.support.removePropertyChangeListener(listener); 191 191 } 192 193 @Override 194 public void dispose() { 195 layer.setLastRelation(relation); 196 super.dispose(); 197 } 192 198 } -
src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
diff --git a/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java b/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java index 7a22bdc..a51e83b 100644
a b public class OsmDataLayer extends AbstractModifiableLayer implements Listener, S 121 121 */ 122 122 public final List<TestError> validationErrors = new ArrayList<>(); 123 123 124 /** last closed relation */ 125 private Relation lastRelation; 126 127 /** 128 * Returns the last closed relation or null if none. 129 */ 130 public Relation getLastRelation() { 131 return lastRelation; 132 } 133 134 public void setLastRelation(Relation relation) { 135 lastRelation = relation; 136 Main.map.relationListDialog.updateEnabledStateEditLastAction(); 137 } 138 124 139 protected void setRequiresSaveToFile(boolean newValue) { 125 140 boolean oldValue = requiresSaveToFile; 126 141 requiresSaveToFile = newValue;