Ignore:
Timestamp:
2016-01-09T22:21:00+01:00 (8 years ago)
Author:
simon04
Message:

see #12300 - Allow to drag from select list to relation members

File:
1 edited

Legend:

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

    r9368 r9369  
    1616import org.openstreetmap.josm.Main;
    1717import org.openstreetmap.josm.data.osm.OsmPrimitive;
     18import org.openstreetmap.josm.data.osm.PrimitiveData;
    1819import org.openstreetmap.josm.data.osm.RelationMember;
    1920import org.openstreetmap.josm.data.osm.RelationMemberData;
     21import org.openstreetmap.josm.gui.datatransfer.PrimitiveTransferable;
    2022import org.openstreetmap.josm.gui.datatransfer.RelationMemberTransferable;
     23import org.openstreetmap.josm.tools.Utils.Function;
    2124
    2225class MemberTransferHandler extends TransferHandler {
     
    3639    public boolean canImport(TransferSupport support) {
    3740        support.setShowDropLocation(true);
    38         return support.isDataFlavorSupported(RelationMemberTransferable.RELATION_MEMBER_DATA);
     41        return support.isDataFlavorSupported(RelationMemberTransferable.RELATION_MEMBER_DATA)
     42                || support.isDataFlavorSupported(PrimitiveTransferable.PRIMITIVE_DATA);
    3943    }
    4044
    4145    @Override
    4246    public boolean importData(TransferSupport support) {
     47        final MemberTable destination = (MemberTable) support.getComponent();
    4348        final int insertRow = ((JTable.DropLocation) support.getDropLocation()).getRow();
    44         final Collection<RelationMemberData> memberData;
     49
    4550        try {
    46             //noinspection unchecked
    47             memberData = (Collection<RelationMemberData>) support.getTransferable().getTransferData(RelationMemberTransferable.RELATION_MEMBER_DATA);
    48         } catch (UnsupportedFlavorException | IOException e) {
     51            if (support.isDataFlavorSupported(RelationMemberTransferable.RELATION_MEMBER_DATA)) {
     52                importRelationMemberData(support, destination, insertRow);
     53            } else if (support.isDataFlavorSupported(PrimitiveTransferable.PRIMITIVE_DATA)) {
     54                importPrimitiveData(support, destination, insertRow);
     55            }
     56        } catch (Exception e) {
    4957            Main.warn(e);
    5058            return false;
    5159        }
    52         final MemberTable destination = (MemberTable) support.getComponent();
    5360
    54         try {
    55             importRelationMemberData(memberData, destination, insertRow);
    56         } catch (Exception e) {
    57             Main.warn(e);
    58             throw e;
    59         }
    6061        return true;
    6162    }
    6263
    63     protected void importRelationMemberData(Collection<RelationMemberData> memberData, MemberTable destination, int insertRow) {
     64    protected void importRelationMemberData(TransferSupport support, final MemberTable destination, int insertRow)
     65            throws UnsupportedFlavorException, IOException {
     66        //noinspection unchecked
     67        final Collection<RelationMemberData> memberData = (Collection<RelationMemberData>)
     68                support.getTransferable().getTransferData(RelationMemberTransferable.RELATION_MEMBER_DATA);
     69        importData(destination, insertRow, memberData, new Function<RelationMemberData, RelationMember>() {
     70            @Override
     71            public RelationMember apply(RelationMemberData member) {
     72                final OsmPrimitive p = destination.getLayer().data.getPrimitiveById(member.getUniqueId(), member.getType());
     73                if (p == null) {
     74                    Main.warn(tr("Cannot add {0} since it is not part of dataset", member));
     75                    return null;
     76                } else {
     77                    return new RelationMember(member.getRole(), p);
     78                }
     79            }
     80        });
     81    }
     82
     83    protected void importPrimitiveData(TransferSupport support, final MemberTable destination, int insertRow)
     84            throws UnsupportedFlavorException, IOException {
     85        //noinspection unchecked
     86        final Collection<PrimitiveData> data = (Collection<PrimitiveData>)
     87                support.getTransferable().getTransferData(PrimitiveTransferable.PRIMITIVE_DATA);
     88        importData(destination, insertRow, data, new Function<PrimitiveData, RelationMember>() {
     89            @Override
     90            public RelationMember apply(PrimitiveData data) {
     91                final OsmPrimitive p = destination.getLayer().data.getPrimitiveById(data);
     92                if (p == null) {
     93                    Main.warn(tr("Cannot add {0} since it is not part of dataset", data));
     94                    return null;
     95                } else {
     96                    return destination.getMemberTableModel().getRelationMemberForPrimitive(p);
     97                }
     98            }
     99        });
     100    }
     101
     102    protected <T> void importData(MemberTable destination, int insertRow, Collection<T> memberData, Function<T, RelationMember> toMemberFunction) {
    64103        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));
     104        for (T i : memberData) {
     105            final RelationMember member = toMemberFunction.apply(i);
     106            if (member != null) {
     107                membersToAdd.add(member);
    71108            }
    72109        }
Note: See TracChangeset for help on using the changeset viewer.