Ignore:
Timestamp:
2016-07-23T14:54:19+02:00 (10 years ago)
Author:
Don-vip
Message:

fix #12478, fix #12565, fix #11114 - Use ​Swing Copy/Paste instead of CopyAction/PasteAction with custom buffer (patch by michael2402, modified) - gsoc-core

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTransferHandler.java

    r10212 r10604  
    1717import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1818import org.openstreetmap.josm.data.osm.PrimitiveData;
     19import org.openstreetmap.josm.data.osm.PrimitiveId;
    1920import org.openstreetmap.josm.data.osm.RelationMember;
    2021import org.openstreetmap.josm.data.osm.RelationMemberData;
    21 import org.openstreetmap.josm.gui.datatransfer.PrimitiveTransferable;
    2222import org.openstreetmap.josm.gui.datatransfer.RelationMemberTransferable;
    23 import org.openstreetmap.josm.tools.Utils.Function;
     23import org.openstreetmap.josm.gui.datatransfer.data.PrimitiveTransferData;
    2424
    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 */
     30public class MemberTransferHandler extends TransferHandler {
    2631
    2732    @Override
     
    3843    @Override
    3944    public boolean canImport(TransferSupport support) {
    40         support.setShowDropLocation(true);
     45        if (support.isDrop()) {
     46            support.setShowDropLocation(true);
     47        }
    4148        return support.isDataFlavorSupported(RelationMemberTransferable.RELATION_MEMBER_DATA)
    42                 || support.isDataFlavorSupported(PrimitiveTransferable.PRIMITIVE_DATA);
     49                || support.isDataFlavorSupported(PrimitiveTransferData.DATA_FLAVOR);
    4350    }
    4451
    4552    @Override
    4653    public boolean importData(TransferSupport support) {
    47         final MemberTable destination = (MemberTable) support.getComponent();
    48         final int insertRow = ((JTable.DropLocation) support.getDropLocation()).getRow();
     54        MemberTable destination = (MemberTable) support.getComponent();
     55        int insertRow = computeInsertionRow(support, destination);
    4956
     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) {
    5077        try {
    5178            if (support.isDataFlavorSupported(RelationMemberTransferable.RELATION_MEMBER_DATA)) {
    5279                importRelationMemberData(support, destination, insertRow);
    53             } else if (support.isDataFlavorSupported(PrimitiveTransferable.PRIMITIVE_DATA)) {
     80                return true;
     81            } else if (support.isDataFlavorSupported(PrimitiveTransferData.DATA_FLAVOR)) {
    5482                importPrimitiveData(support, destination, insertRow);
     83                return true;
     84            } else {
     85                return false;
    5586            }
    5687        } catch (IOException | UnsupportedFlavorException e) {
     
    5889            return false;
    5990        }
    60 
    61         return true;
    6291    }
    6392
     
    6695        final RelationMemberTransferable.Data memberData = (RelationMemberTransferable.Data)
    6796                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>() {
    6998            @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);
    78101            }
    79102        });
     
    82105    protected void importPrimitiveData(TransferSupport support, final MemberTable destination, int insertRow)
    83106            throws UnsupportedFlavorException, IOException {
    84         final PrimitiveTransferable.Data data = (PrimitiveTransferable.Data)
    85                 support.getTransferable().getTransferData(PrimitiveTransferable.PRIMITIVE_DATA);
    86         importData(destination, insertRow, data.getPrimitiveData(), new Function<PrimitiveData, RelationMember>() {
     107        final PrimitiveTransferData data = (PrimitiveTransferData)
     108                support.getTransferable().getTransferData(PrimitiveTransferData.DATA_FLAVOR);
     109        importData(destination, insertRow, data.getDirectlyAdded(), new AbstractRelationMemberConverter<PrimitiveData>() {
    87110            @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);
    96113            }
    97114        });
    98115    }
    99116
    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) {
    102119        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);
    105122            if (member != null) {
    106123                membersToAdd.add(member);
     
    120137        model.selectionChanged(null);
    121138    }
     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    }
    122153}
Note: See TracChangeset for help on using the changeset viewer.