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

Last change on this file since 10755 was 10755, checked in by Don-vip, 8 years ago

sonar - various fixes

File size: 6.3 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.Main;
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;
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 insertRow = ((JTable.DropLocation) support.getDropLocation()).getRow();
64 } else {
65 int selection = destination.getSelectedRow();
66 if (selection < 0) {
67 // no selection, add at the end.
68 insertRow = destination.getRowCount();
69 } else {
70 insertRow = selection;
71 }
72 }
73 return insertRow;
74 }
75
76 private boolean importDataAt(TransferSupport support, MemberTable destination, int insertRow) {
77 try {
78 if (support.isDataFlavorSupported(RelationMemberTransferable.RELATION_MEMBER_DATA)) {
79 importRelationMemberData(support, destination, insertRow);
80 return true;
81 } else if (support.isDataFlavorSupported(PrimitiveTransferData.DATA_FLAVOR)) {
82 importPrimitiveData(support, destination, insertRow);
83 return true;
84 } else {
85 return false;
86 }
87 } catch (IOException | UnsupportedFlavorException e) {
88 Main.warn(e);
89 return false;
90 }
91 }
92
93 protected void importRelationMemberData(TransferSupport support, final MemberTable destination, int insertRow)
94 throws UnsupportedFlavorException, IOException {
95 final RelationMemberTransferable.Data memberData = (RelationMemberTransferable.Data)
96 support.getTransferable().getTransferData(RelationMemberTransferable.RELATION_MEMBER_DATA);
97 importData(destination, insertRow, memberData.getRelationMemberData(), new AbstractRelationMemberConverter<RelationMemberData>() {
98 @Override
99 protected RelationMember getMember(MemberTable destination, RelationMemberData data, OsmPrimitive p) {
100 return new RelationMember(data.getRole(), p);
101 }
102 });
103 }
104
105 protected void importPrimitiveData(TransferSupport support, final MemberTable destination, int insertRow)
106 throws UnsupportedFlavorException, IOException {
107 final PrimitiveTransferData data = (PrimitiveTransferData)
108 support.getTransferable().getTransferData(PrimitiveTransferData.DATA_FLAVOR);
109 importData(destination, insertRow, data.getDirectlyAdded(), new AbstractRelationMemberConverter<PrimitiveData>() {
110 @Override
111 protected RelationMember getMember(MemberTable destination, PrimitiveData data, OsmPrimitive p) {
112 return destination.getMemberTableModel().getRelationMemberForPrimitive(p);
113 }
114 });
115 }
116
117 protected <T extends PrimitiveId> void importData(MemberTable destination, int insertRow,
118 Collection<T> memberData, AbstractRelationMemberConverter<T> toMemberFunction) {
119 final Collection<RelationMember> membersToAdd = new ArrayList<>(memberData.size());
120 for (T data : memberData) {
121 final RelationMember member = toMemberFunction.importPrimitive(destination, data);
122 if (member != null) {
123 membersToAdd.add(member);
124 }
125 }
126 destination.getMemberTableModel().addMembersAtIndexKeepingOldSelection(membersToAdd, insertRow);
127 }
128
129 @Override
130 protected void exportDone(JComponent sourceComponent, Transferable data, int action) {
131 if (action != MOVE) {
132 return;
133 }
134 final MemberTable source = (MemberTable) sourceComponent;
135 final MemberTableModel model = source.getMemberTableModel();
136 model.remove(source.getSelectedRows());
137 model.selectionChanged(null);
138 }
139
140 private abstract static class AbstractRelationMemberConverter<T extends PrimitiveId> {
141 protected RelationMember importPrimitive(MemberTable destination, T data) {
142 final OsmPrimitive p = destination.getLayer().data.getPrimitiveById(data);
143 if (p == null) {
144 Main.warn(tr("Cannot add {0} since it is not part of dataset", data));
145 return null;
146 } else {
147 return getMember(destination, data, p);
148 }
149 }
150
151 protected abstract RelationMember getMember(MemberTable destination, T data, OsmPrimitive p);
152 }
153}
Note: See TracBrowser for help on using the repository browser.