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

Last change on this file since 9368 was 9368, checked in by simon04, 9 years ago

see #12300 - Drag and Drop support for relation member list reordering

File size: 3.2 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.RelationMember;
19import org.openstreetmap.josm.data.osm.RelationMemberData;
20import org.openstreetmap.josm.gui.datatransfer.RelationMemberTransferable;
21
22class MemberTransferHandler extends TransferHandler {
23
24 @Override
25 public int getSourceActions(JComponent c) {
26 return COPY_OR_MOVE;
27 }
28
29 @Override
30 protected Transferable createTransferable(JComponent c) {
31 final MemberTable source = (MemberTable) c;
32 return new RelationMemberTransferable(source.getMemberTableModel().getSelectedMembers());
33 }
34
35 @Override
36 public boolean canImport(TransferSupport support) {
37 support.setShowDropLocation(true);
38 return support.isDataFlavorSupported(RelationMemberTransferable.RELATION_MEMBER_DATA);
39 }
40
41 @Override
42 public boolean importData(TransferSupport support) {
43 final int insertRow = ((JTable.DropLocation) support.getDropLocation()).getRow();
44 final Collection<RelationMemberData> memberData;
45 try {
46 //noinspection unchecked
47 memberData = (Collection<RelationMemberData>) support.getTransferable().getTransferData(RelationMemberTransferable.RELATION_MEMBER_DATA);
48 } catch (UnsupportedFlavorException | IOException e) {
49 Main.warn(e);
50 return false;
51 }
52 final MemberTable destination = (MemberTable) support.getComponent();
53
54 try {
55 importRelationMemberData(memberData, destination, insertRow);
56 } catch (Exception e) {
57 Main.warn(e);
58 throw e;
59 }
60 return true;
61 }
62
63 protected void importRelationMemberData(Collection<RelationMemberData> memberData, MemberTable destination, int insertRow) {
64 final Collection<RelationMember> membersToAdd = new ArrayList<>(memberData.size());
65 for (RelationMemberData member : memberData) {
66 final OsmPrimitive p = destination.getLayer().data.getPrimitiveById(member.getUniqueId(), member.getType());
67 if (p != null) {
68 membersToAdd.add(new RelationMember(member.getRole(), p));
69 } else {
70 Main.warn(tr("Cannot add {0} since it is not part of dataset", member));
71 }
72 }
73 destination.getMemberTableModel().addMembersAtIndex(membersToAdd, insertRow);
74 }
75
76 @Override
77 protected void exportDone(JComponent sourceComponent, Transferable data, int action) {
78 if (action != MOVE) {
79 return;
80 }
81 final MemberTable source = (MemberTable) sourceComponent;
82 final MemberTableModel model = source.getMemberTableModel();
83 model.remove(source.getSelectedRows());
84 model.selectionChanged(null);
85 }
86}
Note: See TracBrowser for help on using the repository browser.