Ticket #12300: 12300-v2.patch
| File 12300-v2.patch, 7.9 KB (added by , 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 14 14 import java.util.List; 15 15 16 16 import javax.swing.AbstractAction; 17 import javax.swing.DropMode; 17 18 import javax.swing.JComponent; 18 19 import javax.swing.JPopupMenu; 19 20 import javax.swing.JTable; … … protected void init() { 82 83 // 83 84 getActionMap().put("selectNextColumnCell", new SelectNextColumnCellAction()); 84 85 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); 85 91 } 86 92 87 93 @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 446 446 fireMakeMemberVisible(index); 447 447 } 448 448 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 449 457 public void addMembersAtBeginning(List<? extends OsmPrimitive> primitives) { 450 458 addMembersAtIndex(primitives, 0); 451 459 } -
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. 2 package org.openstreetmap.josm.gui.dialogs.relation; 3 4 import static org.openstreetmap.josm.tools.I18n.tr; 5 6 import java.awt.datatransfer.Transferable; 7 import java.awt.datatransfer.UnsupportedFlavorException; 8 import java.io.IOException; 9 import java.util.ArrayList; 10 import java.util.Collection; 11 12 import javax.swing.JComponent; 13 import javax.swing.JTable; 14 import javax.swing.TransferHandler; 15 16 import org.openstreetmap.josm.Main; 17 import org.openstreetmap.josm.data.osm.OsmPrimitive; 18 import org.openstreetmap.josm.data.osm.RelationMember; 19 import org.openstreetmap.josm.data.osm.RelationMemberData; 20 21 class 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. 2 package org.openstreetmap.josm.gui.dialogs.relation; 3 4 import java.awt.datatransfer.DataFlavor; 5 import java.awt.datatransfer.Transferable; 6 import java.awt.datatransfer.UnsupportedFlavorException; 7 import java.util.ArrayList; 8 import java.util.Collection; 9 10 import org.openstreetmap.josm.data.osm.RelationMember; 11 import org.openstreetmap.josm.data.osm.RelationMemberData; 12 import org.openstreetmap.josm.gui.DefaultNameFormatter; 13 14 class 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 }
