Changeset 10604 in josm for trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTransferHandler.java
- Timestamp:
- 2016-07-23T14:54:19+02:00 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTransferHandler.java
r10212 r10604 17 17 import org.openstreetmap.josm.data.osm.OsmPrimitive; 18 18 import org.openstreetmap.josm.data.osm.PrimitiveData; 19 import org.openstreetmap.josm.data.osm.PrimitiveId; 19 20 import org.openstreetmap.josm.data.osm.RelationMember; 20 21 import org.openstreetmap.josm.data.osm.RelationMemberData; 21 import org.openstreetmap.josm.gui.datatransfer.PrimitiveTransferable;22 22 import org.openstreetmap.josm.gui.datatransfer.RelationMemberTransferable; 23 import org.openstreetmap.josm. tools.Utils.Function;23 import org.openstreetmap.josm.gui.datatransfer.data.PrimitiveTransferData; 24 24 25 class MemberTransferHandler extends TransferHandler { 25 /** 26 * A transfer handler that helps with importing / exporting members for relations. 27 * @author Michael Zangl 28 * @since 10604 29 */ 30 public class MemberTransferHandler extends TransferHandler { 26 31 27 32 @Override … … 38 43 @Override 39 44 public boolean canImport(TransferSupport support) { 40 support.setShowDropLocation(true); 45 if (support.isDrop()) { 46 support.setShowDropLocation(true); 47 } 41 48 return support.isDataFlavorSupported(RelationMemberTransferable.RELATION_MEMBER_DATA) 42 || support.isDataFlavorSupported(PrimitiveTransfer able.PRIMITIVE_DATA);49 || support.isDataFlavorSupported(PrimitiveTransferData.DATA_FLAVOR); 43 50 } 44 51 45 52 @Override 46 53 public boolean importData(TransferSupport support) { 47 finalMemberTable destination = (MemberTable) support.getComponent();48 finalint insertRow =((JTable.DropLocation)support.getDropLocation()).getRow();54 MemberTable destination = (MemberTable) support.getComponent(); 55 int insertRow = computeInsertionRow(support, destination); 49 56 57 return importDataAt(support, destination, insertRow); 58 } 59 60 private 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) { 50 77 try { 51 78 if (support.isDataFlavorSupported(RelationMemberTransferable.RELATION_MEMBER_DATA)) { 52 79 importRelationMemberData(support, destination, insertRow); 53 } else if (support.isDataFlavorSupported(PrimitiveTransferable.PRIMITIVE_DATA)) { 80 return true; 81 } else if (support.isDataFlavorSupported(PrimitiveTransferData.DATA_FLAVOR)) { 54 82 importPrimitiveData(support, destination, insertRow); 83 return true; 84 } else { 85 return false; 55 86 } 56 87 } catch (IOException | UnsupportedFlavorException e) { … … 58 89 return false; 59 90 } 60 61 return true;62 91 } 63 92 … … 66 95 final RelationMemberTransferable.Data memberData = (RelationMemberTransferable.Data) 67 96 support.getTransferable().getTransferData(RelationMemberTransferable.RELATION_MEMBER_DATA); 68 importData(destination, insertRow, memberData.getRelationMemberData(), new Function<RelationMemberData, RelationMember>() {97 importData(destination, insertRow, memberData.getRelationMemberData(), new AbstractRelationMemberConverter<RelationMemberData>() { 69 98 @Override 70 public RelationMember apply(RelationMemberData member) { 71 final OsmPrimitive p = destination.getLayer().data.getPrimitiveById(member.getUniqueId(), member.getType()); 72 if (p == null) { 73 Main.warn(tr("Cannot add {0} since it is not part of dataset", member)); 74 return null; 75 } else { 76 return new RelationMember(member.getRole(), p); 77 } 99 protected RelationMember getMember(MemberTable destination, RelationMemberData data, OsmPrimitive p) { 100 return new RelationMember(data.getRole(), p); 78 101 } 79 102 }); … … 82 105 protected void importPrimitiveData(TransferSupport support, final MemberTable destination, int insertRow) 83 106 throws UnsupportedFlavorException, IOException { 84 final PrimitiveTransfer able.Data data = (PrimitiveTransferable.Data)85 support.getTransferable().getTransferData(PrimitiveTransfer able.PRIMITIVE_DATA);86 importData(destination, insertRow, data.get PrimitiveData(), newFunction<PrimitiveData, RelationMember>() {107 final PrimitiveTransferData data = (PrimitiveTransferData) 108 support.getTransferable().getTransferData(PrimitiveTransferData.DATA_FLAVOR); 109 importData(destination, insertRow, data.getDirectlyAdded(), new AbstractRelationMemberConverter<PrimitiveData>() { 87 110 @Override 88 public RelationMember apply(PrimitiveData data) { 89 final OsmPrimitive p = destination.getLayer().data.getPrimitiveById(data); 90 if (p == null) { 91 Main.warn(tr("Cannot add {0} since it is not part of dataset", data)); 92 return null; 93 } else { 94 return destination.getMemberTableModel().getRelationMemberForPrimitive(p); 95 } 111 protected RelationMember getMember(MemberTable destination, PrimitiveData data, OsmPrimitive p) { 112 return destination.getMemberTableModel().getRelationMemberForPrimitive(p); 96 113 } 97 114 }); 98 115 } 99 116 100 protected <T> void importData(MemberTable destination, int insertRow, 101 Collection<T> memberData, Function<T,RelationMember> toMemberFunction) {117 protected <T extends PrimitiveId> void importData(MemberTable destination, int insertRow, 118 Collection<T> memberData, AbstractRelationMemberConverter<T> toMemberFunction) { 102 119 final Collection<RelationMember> membersToAdd = new ArrayList<>(memberData.size()); 103 for (T i: memberData) {104 final RelationMember member = toMemberFunction. apply(i);120 for (T data : memberData) { 121 final RelationMember member = toMemberFunction.importPrimitive(destination, data); 105 122 if (member != null) { 106 123 membersToAdd.add(member); … … 120 137 model.selectionChanged(null); 121 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 } 122 153 }
Note:
See TracChangeset
for help on using the changeset viewer.
