Ticket #19260: 19260.patch

File 19260.patch, 5.2 KB (added by GerdP, 6 years ago)
  • src/org/openstreetmap/josm/gui/history/RelationMemberListViewer.java

     
    33
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55
     6import java.awt.Point;
    67import java.awt.Rectangle;
     8import java.awt.event.ActionEvent;
    79
     10import javax.swing.AbstractAction;
     11import javax.swing.JPopupMenu;
    812import javax.swing.JTable;
    913import javax.swing.ListSelectionModel;
    1014
     15import org.openstreetmap.josm.actions.AutoScaleAction;
     16import org.openstreetmap.josm.actions.AutoScaleAction.AutoScaleMode;
     17import org.openstreetmap.josm.data.osm.IPrimitive;
     18import org.openstreetmap.josm.data.osm.OsmData;
     19import org.openstreetmap.josm.data.osm.PrimitiveId;
    1120import org.openstreetmap.josm.data.osm.RelationMemberData;
     21import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
     22import org.openstreetmap.josm.gui.MainApplication;
     23import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
     24import org.openstreetmap.josm.tools.ImageProvider;
    1225
    1326/**
    1427 * RelationMemberListViewer is a UI component which displays the  list of relation members of two
     
    3144                table, columnModel, tr("The members of this relation are in reverse order")));
    3245        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    3346        selectionSynchronizer.participateInSynchronizedSelection(table.getSelectionModel());
     47        table.addMouseListener(new InternalPopupMenuLauncher());
    3448        table.getModel().addTableModelListener(e -> {
    3549            Rectangle rect = table.getCellRect(((DiffTableModel) e.getSource()).getFirstChange(), 0, true);
    3650            table.scrollRectToVisible(rect);
     
    3751        });
    3852        table.addMouseListener(new ShowHistoryAction.DoubleClickAdapter(e -> {
    3953            int row = table.rowAtPoint(e.getPoint());
    40             return row < 0 ? null : (RelationMemberData) tableModel.getValueAt(row, 0).value;
     54            return primitiveIdAtRow(tableModel, row);
    4155        }));
    4256        return table;
    4357    }
     
    4963    public RelationMemberListViewer(HistoryBrowserModel model) {
    5064        super(model);
    5165    }
     66
     67    static class MemberListPopupMenu extends JPopupMenu {
     68        private final ZoomToMemberAction zoomToMemberAction;
     69        private final ShowHistoryAction showHistoryAction;
     70
     71        MemberListPopupMenu() {
     72            zoomToMemberAction = new ZoomToMemberAction();
     73            add(zoomToMemberAction);
     74            showHistoryAction = new ShowHistoryAction();
     75            add(showHistoryAction);
     76        }
     77
     78        void prepare(PrimitiveId pid) {
     79            zoomToMemberAction.setPrimitiveId(pid);
     80            zoomToMemberAction.updateEnabledState();
     81
     82            showHistoryAction.setPrimitiveId(pid);
     83            showHistoryAction.updateEnabledState();
     84        }
     85    }
     86
     87    static class ZoomToMemberAction extends AbstractAction {
     88        private transient PrimitiveId primitiveId;
     89
     90        /**
     91         * Constructs a new {@code ZoomToMemberAction}.
     92         */
     93        ZoomToMemberAction() {
     94            putValue(NAME, tr("Zoom to member"));
     95            putValue(SHORT_DESCRIPTION, tr("Zoom to this member in the current data layer"));
     96            new ImageProvider("dialogs", "zoomin").getResource().attachImageIcon(this, true);
     97        }
     98
     99        @Override
     100        public void actionPerformed(ActionEvent e) {
     101            if (!isEnabled())
     102                return;
     103            IPrimitive p = getPrimitiveToZoom();
     104            if (p != null && p.isSelectable()) {
     105                p.getDataSet().setSelected(p);
     106                AutoScaleAction.autoScale(AutoScaleMode.SELECTION);
     107            }
     108        }
     109
     110        public void setPrimitiveId(PrimitiveId pid) {
     111            this.primitiveId = pid;
     112            updateEnabledState();
     113        }
     114
     115        protected IPrimitive getPrimitiveToZoom() {
     116            if (primitiveId == null)
     117                return null;
     118            OsmData<?, ?, ?, ?> ds = MainApplication.getLayerManager().getActiveData();
     119            if (ds == null)
     120                return null;
     121            return ds.getPrimitiveById(primitiveId);
     122        }
     123
     124        void updateEnabledState() {
     125            IPrimitive p = getPrimitiveToZoom();
     126            setEnabled(p != null && p.isSelectable());
     127        }
     128    }
     129
     130    private static PrimitiveId primitiveIdAtRow(DiffTableModel model, int row) {
     131        if (row < 0)
     132            return null;
     133        RelationMemberData rm = (RelationMemberData) model.getValueAt(row, 0).value;
     134        if (rm == null)
     135            return null;
     136        return new SimplePrimitiveId(rm.getUniqueId(), rm.getType());
     137    }
     138
     139    static class InternalPopupMenuLauncher extends PopupMenuLauncher {
     140        InternalPopupMenuLauncher() {
     141            super(new MemberListPopupMenu());
     142        }
     143
     144        @Override
     145        protected int checkTableSelection(JTable table, Point p) {
     146            int row = super.checkTableSelection(table, p);
     147            ((MemberListPopupMenu) menu).prepare(primitiveIdAtRow((DiffTableModel) table.getModel(), row));
     148            return row;
     149        }
     150    }
     151
     152
    52153}