Ticket #12300: 12300-v2.patch

File 12300-v2.patch, 7.9 KB (added by simon04, 10 years ago)
  • src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java

    diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java b/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java
    index 3d41fd3..9eb25c7 100644
    a b  
    1414import java.util.List;
    1515
    1616import javax.swing.AbstractAction;
     17import javax.swing.DropMode;
    1718import javax.swing.JComponent;
    1819import javax.swing.JPopupMenu;
    1920import javax.swing.JTable;
    protected void init() {  
    8283        //
    8384        getActionMap().put("selectNextColumnCell", new SelectNextColumnCellAction());
    8485        getActionMap().put("selectPreviousColumnCell", new SelectPreviousColumnCellAction());
     86
     87        setTransferHandler(new MemberTransferHandler());
     88        setFillsViewportHeight(true); // allow drop on empty table
     89        setDragEnabled(true);
     90        setDropMode(DropMode.INSERT_ROWS);
    8591    }
    8692
    8793    @Override
  • src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java

    diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java b/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
    index f87ef71..6047f94 100644
    a b private void addMembersAtIndex(List<? extends OsmPrimitive> primitives, int inde  
    446446        fireMakeMemberVisible(index);
    447447    }
    448448
     449    void addMembersAtIndex(final Iterable<RelationMember> newMembers, final int index) {
     450        int idx = index;
     451        for (RelationMember member : newMembers) {
     452            members.add(idx++, member);
     453        }
     454        fireTableRowsInserted(index, idx - 1);
     455    }
     456
    449457    public void addMembersAtBeginning(List<? extends OsmPrimitive> primitives) {
    450458        addMembersAtIndex(primitives, 0);
    451459    }
  • new file src/org/openstreetmap/josm/gui/dialogs/relation/MemberTransferHandler.java

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

    diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTransferable.java b/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTransferable.java
    new file mode 100644
    index 0000000..b3d2d53
    - +  
     1// License: GPL. For details, see LICENSE file.
     2package org.openstreetmap.josm.gui.dialogs.relation;
     3
     4import java.awt.datatransfer.DataFlavor;
     5import java.awt.datatransfer.Transferable;
     6import java.awt.datatransfer.UnsupportedFlavorException;
     7import java.util.ArrayList;
     8import java.util.Collection;
     9
     10import org.openstreetmap.josm.data.osm.RelationMember;
     11import org.openstreetmap.josm.data.osm.RelationMemberData;
     12import org.openstreetmap.josm.gui.DefaultNameFormatter;
     13
     14class MemberTransferable implements Transferable {
     15
     16    static final DataFlavor RELATION_MEMBER_DATA = new DataFlavor(RelationMemberData.class, "MemberTransferable");
     17    private final Collection<RelationMember> members;
     18
     19    public MemberTransferable(Collection<RelationMember> members) {
     20        this.members = members;
     21    }
     22
     23    @Override
     24    public DataFlavor[] getTransferDataFlavors() {
     25        return new DataFlavor[]{RELATION_MEMBER_DATA, DataFlavor.stringFlavor};
     26    }
     27
     28    @Override
     29    public boolean isDataFlavorSupported(DataFlavor flavor) {
     30        return flavor == RELATION_MEMBER_DATA;
     31    }
     32
     33    @Override
     34    public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
     35        if (DataFlavor.stringFlavor.equals(flavor)) {
     36            return getStringData();
     37        } else if (RELATION_MEMBER_DATA.equals(flavor)) {
     38            return getRelationMemberData();
     39        }
     40        throw new UnsupportedFlavorException(flavor);
     41    }
     42
     43    protected String getStringData() {
     44        final StringBuilder sb = new StringBuilder();
     45        for (RelationMember member : members) {
     46            sb.append(member.getType());
     47            sb.append(" ").append(member.getUniqueId());
     48            sb.append(" ").append(member.getRole());
     49            sb.append(" #").append(member.getMember().getDisplayName(DefaultNameFormatter.getInstance()));
     50            sb.append("\n");
     51        }
     52        return sb.toString().replace("\u200E", "").replace("\u200F", "");
     53    }
     54
     55    protected Collection<RelationMemberData> getRelationMemberData() {
     56        final Collection<RelationMemberData> r = new ArrayList<>(members.size());
     57        for (RelationMember member : members) {
     58            r.add(new RelationMemberData(member.getRole(), member.getType(), member.getUniqueId()));
     59        }
     60        return r;
     61    }
     62}