Skip to content

Commit 6af03cb

Browse files
committed
Add 'replace selected' action to relation editor
1 parent 4bfe2b9 commit 6af03cb

File tree

5 files changed

+226
-13
lines changed

5 files changed

+226
-13
lines changed
Loading

src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@
8686
import org.openstreetmap.josm.gui.dialogs.relation.actions.RefreshAction;
8787
import org.openstreetmap.josm.gui.dialogs.relation.actions.RemoveAction;
8888
import org.openstreetmap.josm.gui.dialogs.relation.actions.RemoveSelectedAction;
89+
import org.openstreetmap.josm.gui.dialogs.relation.actions.ReplaceSelectedAction;
8990
import org.openstreetmap.josm.gui.dialogs.relation.actions.ReverseAction;
9091
import org.openstreetmap.josm.gui.dialogs.relation.actions.SelectAction;
9192
import org.openstreetmap.josm.gui.dialogs.relation.actions.SelectPrimitivesForSelectedMembersAction;
@@ -703,10 +704,13 @@ protected static JToolBar buildSelectionControlButtonToolbar(IRelationEditorActi
703704
new AddSelectedAtEndAction(editorAccess)
704705
));
705706
groups.add(buildNativeGroup(20,
707+
new ReplaceSelectedAction(editorAccess)
708+
));
709+
groups.add(buildNativeGroup(30,
706710
new SelectedMembersForSelectionAction(editorAccess),
707711
new SelectPrimitivesForSelectedMembersAction(editorAccess)
708712
));
709-
groups.add(buildNativeGroup(30,
713+
groups.add(buildNativeGroup(40,
710714
new RemoveSelectedAction(editorAccess)
711715
));
712716
groups.addAll(RelationEditorHooks.getSelectActions());

src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java

+34
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,40 @@ public void updateRole(int[] idx, String role) {
505505
addToSelectedMembers(selected);
506506
}
507507

508+
/**
509+
* updates the referenced primitive of the members given by the index in <code>index</code>
510+
*
511+
* @param index the index to update
512+
* @param newPrimitive the new primitive
513+
*/
514+
public void updateMemberPrimitive(int index, OsmPrimitive newPrimitive) {
515+
if (index >= members.size()) {
516+
return;
517+
}
518+
519+
RelationMember newMember = new RelationMember(members.get(index).getRole(), newPrimitive);
520+
updateMember(index, newMember);
521+
}
522+
523+
/**
524+
* replace the member at <code>index</code> with a new one
525+
*
526+
* @param index the index to update
527+
* @param newMember the new member
528+
*/
529+
public void updateMember(int index, RelationMember newMember) {
530+
if (index >= members.size()) {
531+
return;
532+
}
533+
534+
RelationMember oldMember = members.get(index);
535+
if (oldMember.equals(newMember))
536+
return;
537+
538+
setValue(index, newMember);
539+
fireTableDataChanged();
540+
}
541+
508542
/**
509543
* Get the currently selected relation members
510544
*

src/org/openstreetmap/josm/gui/dialogs/relation/actions/AddFromSelectionAction.java

+25-12
Original file line numberDiff line numberDiff line change
@@ -30,27 +30,40 @@ protected boolean isPotentialDuplicate(OsmPrimitive primitive) {
3030
}
3131

3232
protected List<OsmPrimitive> filterConfirmedPrimitives(List<OsmPrimitive> primitives) throws AddAbortException {
33+
return filterConfirmedPrimitives(primitives, false);
34+
}
35+
36+
protected List<OsmPrimitive> filterConfirmedPrimitives(List<OsmPrimitive> primitives, boolean abortOnSkip) throws AddAbortException {
3337
if (Utils.isEmpty(primitives))
3438
return primitives;
3539
List<OsmPrimitive> ret = new ArrayList<>();
3640
ConditionalOptionPaneUtil.startBulkOperation("add_primitive_to_relation");
37-
for (OsmPrimitive primitive : primitives) {
38-
if (primitive instanceof Relation) {
39-
List<Relation> loop = RelationChecker.checkAddMember(editorAccess.getEditor().getRelation(), (Relation) primitive);
40-
if (!loop.isEmpty() && loop.get(0).equals(loop.get(loop.size() - 1))) {
41-
GenericRelationEditor.warnOfCircularReferences(primitive, loop);
42-
continue;
41+
try {
42+
for (OsmPrimitive primitive : primitives) {
43+
if (primitive instanceof Relation) {
44+
List<Relation> loop = RelationChecker.checkAddMember(editorAccess.getEditor().getRelation(), (Relation) primitive);
45+
if (!loop.isEmpty() && loop.get(0).equals(loop.get(loop.size() - 1))) {
46+
GenericRelationEditor.warnOfCircularReferences(primitive, loop);
47+
if (abortOnSkip) {
48+
throw new AddAbortException();
49+
}
50+
continue;
51+
}
4352
}
44-
}
45-
if (isPotentialDuplicate(primitive)) {
46-
if (GenericRelationEditor.confirmAddingPrimitive(primitive)) {
53+
if (isPotentialDuplicate(primitive)) {
54+
if (GenericRelationEditor.confirmAddingPrimitive(primitive)) {
55+
ret.add(primitive);
56+
} else if (abortOnSkip) {
57+
throw new AddAbortException();
58+
}
59+
} else {
4760
ret.add(primitive);
4861
}
49-
} else {
50-
ret.add(primitive);
5162
}
63+
} finally {
64+
ConditionalOptionPaneUtil.endBulkOperation("add_primitive_to_relation");
5265
}
53-
ConditionalOptionPaneUtil.endBulkOperation("add_primitive_to_relation");
66+
5467
return ret;
5568
}
5669
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// License: GPL. For details, see LICENSE file.
2+
package org.openstreetmap.josm.gui.dialogs.relation.actions;
3+
4+
import static org.openstreetmap.josm.tools.I18n.tr;
5+
6+
import java.awt.event.ActionEvent;
7+
import java.util.List;
8+
9+
import org.openstreetmap.josm.data.osm.OsmPrimitive;
10+
import org.openstreetmap.josm.gui.dialogs.relation.GenericRelationEditor.AddAbortException;
11+
import org.openstreetmap.josm.tools.ImageProvider;
12+
import org.openstreetmap.josm.tools.Logging;
13+
14+
/**
15+
* Replace selected relation members with the objects selected in the current dataset
16+
* @since xxx
17+
*/
18+
public class ReplaceSelectedAction extends AddFromSelectionAction {
19+
20+
/**
21+
* Constructs a new {@code ReplaceSelectedAction}.
22+
* @param editorAccess An interface to access the relation editor contents.
23+
*/
24+
public ReplaceSelectedAction(IRelationEditorActionAccess editorAccess) {
25+
super(editorAccess, IRelationEditorUpdateOn.MEMBER_TABLE_SELECTION, IRelationEditorUpdateOn.SELECTION_TABLE_CHANGE);
26+
putValue(SHORT_DESCRIPTION, tr("Replace members with selected objects"));
27+
new ImageProvider("dialogs/relation", "replaceselectedright").getResource().attachImageIcon(this, true);
28+
updateEnabledState();
29+
}
30+
31+
@Override
32+
protected void updateEnabledState() {
33+
int numSelected = getSelectionTableModel().getRowCount();
34+
setEnabled(numSelected > 0 &&
35+
numSelected == getMemberTableModel().getSelectedIndices().length);
36+
}
37+
38+
@Override
39+
public void actionPerformed(ActionEvent e) {
40+
try {
41+
int[] selectedMemberIndices = getMemberTableModel().getSelectedIndices();
42+
List<OsmPrimitive> selection = getSelectionTableModel().getSelection();
43+
int numSelectedPrimitives = selection.size();
44+
if (numSelectedPrimitives != selectedMemberIndices.length) {
45+
return;
46+
}
47+
48+
List<OsmPrimitive> filteredSelection = filterConfirmedPrimitives(selection, true);
49+
50+
for (int i = 0; i < selectedMemberIndices.length; i++) {
51+
getMemberTableModel().updateMemberPrimitive(selectedMemberIndices[i], filteredSelection.get(i));
52+
}
53+
} catch (AddAbortException ex) {
54+
Logging.trace(ex);
55+
}
56+
}
57+
}

0 commit comments

Comments
 (0)