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

Last change on this file since 13171 was 12620, checked in by Don-vip, 7 years ago

see #15182 - deprecate all Main logging methods and introduce suitable replacements in Logging for most of them

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