source: josm/trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTransferHandler.java@ 16438

Last change on this file since 16438 was 16438, checked in by simon04, 4 years ago

see #19251 - Java 8: use Stream

File size: 6.4 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.dialogs.relation;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.datatransfer.Transferable;
7import java.awt.datatransfer.UnsupportedFlavorException;
8import java.io.IOException;
9import java.util.Collection;
10import java.util.Objects;
11import java.util.stream.Collectors;
12
13import javax.swing.JComponent;
14import javax.swing.JTable;
15import javax.swing.TransferHandler;
16
17import org.openstreetmap.josm.data.osm.OsmPrimitive;
18import org.openstreetmap.josm.data.osm.PrimitiveData;
19import org.openstreetmap.josm.data.osm.PrimitiveId;
20import org.openstreetmap.josm.data.osm.RelationMember;
21import org.openstreetmap.josm.data.osm.RelationMemberData;
22import org.openstreetmap.josm.gui.datatransfer.RelationMemberTransferable;
23import org.openstreetmap.josm.gui.datatransfer.data.PrimitiveTransferData;
24import org.openstreetmap.josm.tools.Logging;
25
26/**
27 * A transfer handler that helps with importing / exporting members for relations.
28 * @author Michael Zangl
29 * @since 10604
30 */
31public class MemberTransferHandler extends TransferHandler {
32
33 @Override
34 public int getSourceActions(JComponent c) {
35 return COPY_OR_MOVE;
36 }
37
38 @Override
39 protected Transferable createTransferable(JComponent c) {
40 final MemberTable source = (MemberTable) c;
41 return new RelationMemberTransferable(source.getMemberTableModel().getSelectedMembers());
42 }
43
44 @Override
45 public boolean canImport(TransferSupport support) {
46 if (support.isDrop()) {
47 support.setShowDropLocation(true);
48 }
49 return support.isDataFlavorSupported(RelationMemberTransferable.RELATION_MEMBER_DATA)
50 || support.isDataFlavorSupported(PrimitiveTransferData.DATA_FLAVOR);
51 }
52
53 @Override
54 public boolean importData(TransferSupport support) {
55 MemberTable destination = (MemberTable) support.getComponent();
56 int insertRow = computeInsertionRow(support, destination);
57
58 return importDataAt(support, destination, insertRow);
59 }
60
61 private static int computeInsertionRow(TransferSupport support, MemberTable destination) {
62 final int insertRow;
63 if (support.isDrop()) {
64 DropLocation dl = support.getDropLocation();
65 if (dl instanceof JTable.DropLocation) {
66 insertRow = ((JTable.DropLocation) dl).getRow();
67 } else {
68 insertRow = 0;
69 }
70 } else {
71 int selection = destination.getSelectedRow();
72 if (selection < 0) {
73 // no selection, add at the end.
74 insertRow = destination.getRowCount();
75 } else {
76 insertRow = selection;
77 }
78 }
79 return insertRow;
80 }
81
82 private boolean importDataAt(TransferSupport support, MemberTable destination, int insertRow) {
83 try {
84 if (support.isDataFlavorSupported(RelationMemberTransferable.RELATION_MEMBER_DATA)) {
85 importRelationMemberData(support, destination, insertRow);
86 return true;
87 } else if (support.isDataFlavorSupported(PrimitiveTransferData.DATA_FLAVOR)) {
88 importPrimitiveData(support, destination, insertRow);
89 return true;
90 } else {
91 return false;
92 }
93 } catch (IOException | UnsupportedFlavorException e) {
94 Logging.warn(e);
95 return false;
96 }
97 }
98
99 protected void importRelationMemberData(TransferSupport support, final MemberTable destination, int insertRow)
100 throws UnsupportedFlavorException, IOException {
101 final RelationMemberTransferable.Data memberData = (RelationMemberTransferable.Data)
102 support.getTransferable().getTransferData(RelationMemberTransferable.RELATION_MEMBER_DATA);
103 importData(destination, insertRow, memberData.getRelationMemberData(), new AbstractRelationMemberConverter<RelationMemberData>() {
104 @Override
105 protected RelationMember getMember(MemberTable destination, RelationMemberData data, OsmPrimitive p) {
106 return new RelationMember(data.getRole(), p);
107 }
108 });
109 }
110
111 protected void importPrimitiveData(TransferSupport support, final MemberTable destination, int insertRow)
112 throws UnsupportedFlavorException, IOException {
113 final PrimitiveTransferData data = (PrimitiveTransferData)
114 support.getTransferable().getTransferData(PrimitiveTransferData.DATA_FLAVOR);
115 importData(destination, insertRow, data.getDirectlyAdded(), new AbstractRelationMemberConverter<PrimitiveData>() {
116 @Override
117 protected RelationMember getMember(MemberTable destination, PrimitiveData data, OsmPrimitive p) {
118 return destination.getMemberTableModel().getRelationMemberForPrimitive(p);
119 }
120 });
121 }
122
123 protected <T extends PrimitiveId> void importData(MemberTable destination, int insertRow,
124 Collection<T> memberData, AbstractRelationMemberConverter<T> toMemberFunction) {
125 final Collection<RelationMember> membersToAdd = memberData.stream()
126 .map(data -> toMemberFunction.importPrimitive(destination, data))
127 .filter(Objects::nonNull)
128 .collect(Collectors.toList());
129 destination.getMemberTableModel().addMembersAtIndexKeepingOldSelection(membersToAdd, insertRow);
130 }
131
132 @Override
133 protected void exportDone(JComponent sourceComponent, Transferable data, int action) {
134 if (action != MOVE) {
135 return;
136 }
137 final MemberTable source = (MemberTable) sourceComponent;
138 final MemberTableModel model = source.getMemberTableModel();
139 model.remove(source.getSelectedRows());
140 model.selectionChanged(null);
141 }
142
143 private abstract static class AbstractRelationMemberConverter<T extends PrimitiveId> {
144 protected RelationMember importPrimitive(MemberTable destination, T data) {
145 final OsmPrimitive p = destination.getLayer().data.getPrimitiveById(data);
146 if (p == null) {
147 Logging.warn(tr("Cannot add {0} since it is not part of dataset", data));
148 return null;
149 } else {
150 return getMember(destination, data, p);
151 }
152 }
153
154 protected abstract RelationMember getMember(MemberTable destination, T data, OsmPrimitive p);
155 }
156}
Note: See TracBrowser for help on using the repository browser.