Changeset 16123 in josm


Ignore:
Timestamp:
2020-03-14T17:03:02+01:00 (4 years ago)
Author:
Don-vip
Message:

fix #18918 - Enable Ctrl-H shortcut to display history of primitives selected in changeset manager

Location:
trunk/src/org/openstreetmap/josm
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/actions/HistoryInfoAction.java

    r14397 r16123  
    77import java.awt.event.ActionEvent;
    88import java.awt.event.KeyEvent;
     9import java.util.HashSet;
     10import java.util.Set;
     11
     12import javax.swing.JTable;
    913
    1014import org.openstreetmap.josm.data.osm.OsmData;
     15import org.openstreetmap.josm.data.osm.PrimitiveId;
    1116import org.openstreetmap.josm.gui.MainApplication;
    1217import org.openstreetmap.josm.gui.dialogs.OsmIdSelectionDialog;
     
    3843    @Override
    3944    public void actionPerformed(ActionEvent ae) {
     45        // Generic handling of tables displaying OSM primitives
     46        if (ae.getSource() instanceof JTable) {
     47            JTable table = (JTable) ae.getSource();
     48            Set<PrimitiveId> sel = new HashSet<>();
     49            for (int row : table.getSelectedRows()) {
     50                for (int col = 0; col < table.getModel().getColumnCount(); col++) {
     51                    Object value = table.getModel().getValueAt(row, col);
     52                    if (value instanceof PrimitiveId) {
     53                        sel.add((PrimitiveId) value);
     54                        break;
     55                    }
     56                }
     57            }
     58            if (!sel.isEmpty()) {
     59                HistoryBrowserDialogManager.getInstance().showHistory(sel);
     60                return;
     61            }
     62        }
     63        // Otherwise show history for currently selected objects
    4064        OsmData<?, ?, ?, ?> set = getLayerManager().getActiveData();
    4165        if (set != null && !set.selectionEmpty()) {
  • trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeTask.java

    r15789 r16123  
    144144            this.toLoad = toLoad;
    145145            this.setChangesetDataNeeded(false);
    146             add(toLoad.keySet());
     146            addOsmPrimitives(toLoad.keySet());
    147147            // Updating process is done after all history requests have been made
    148148            HistoryDataSet.getInstance().addHistoryDataSetListener(this);
  • trunk/src/org/openstreetmap/josm/data/osm/history/HistoryDataSet.java

    r12865 r16123  
    99import java.util.List;
    1010import java.util.Map;
     11import java.util.Objects;
    1112import java.util.Set;
    1213import java.util.concurrent.CopyOnWriteArrayList;
     
    165166     * @return the history for a primitive with id <code>id</code>. null, if no
    166167     * such history exists
    167      * @throws IllegalArgumentException if pid is null
     168     * @throws NullPointerException if pid is null
    168169     */
    169170    public History getHistory(PrimitiveId pid) {
    170         CheckParameterUtil.ensureParameterNotNull(pid, "pid");
    171         List<HistoryOsmPrimitive> versions = data.get(pid);
    172         if (versions == null && pid instanceof IPrimitive) {
    173             versions = data.get(((IPrimitive) pid).getPrimitiveId());
    174         }
     171        PrimitiveId key = pid instanceof IPrimitive ? ((IPrimitive) pid).getPrimitiveId()
     172                        : pid instanceof HistoryOsmPrimitive ? ((HistoryOsmPrimitive) pid).getPrimitiveId()
     173                        : pid;
     174        List<HistoryOsmPrimitive> versions = data.get(Objects.requireNonNull(key, "key"));
    175175        if (versions == null)
    176176            return null;
  • trunk/src/org/openstreetmap/josm/data/osm/history/HistoryOsmPrimitive.java

    r13625 r16123  
    1616import org.openstreetmap.josm.data.osm.Node;
    1717import org.openstreetmap.josm.data.osm.OsmPrimitive;
    18 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    1918import org.openstreetmap.josm.data.osm.PrimitiveData;
    2019import org.openstreetmap.josm.data.osm.PrimitiveId;
     
    3231 * @since 1670
    3332 */
    34 public abstract class HistoryOsmPrimitive implements Tagged, Comparable<HistoryOsmPrimitive> {
     33public abstract class HistoryOsmPrimitive implements Tagged, Comparable<HistoryOsmPrimitive>, PrimitiveId {
    3534
    3635    private long id;
     
    204203    }
    205204
    206     /**
    207      * Returns the primitive type.
    208      * @return the primitive type
    209      */
    210     public abstract OsmPrimitiveType getType();
     205    @Override
     206    public final long getUniqueId() {
     207        return getId();
     208    }
     209
     210    @Override
     211    public final boolean isNew() {
     212        return false;
     213    }
    211214
    212215    @Override
  • trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentPanel.java

    r16122 r16123  
    2424import javax.swing.DefaultListSelectionModel;
    2525import javax.swing.JButton;
     26import javax.swing.JComponent;
    2627import javax.swing.JOptionPane;
    2728import javax.swing.JPanel;
     
    3637
    3738import org.openstreetmap.josm.actions.AutoScaleAction;
     39import org.openstreetmap.josm.actions.HistoryInfoAction;
    3840import org.openstreetmap.josm.actions.downloadtasks.ChangesetContentDownloadTask;
    3941import org.openstreetmap.josm.data.osm.Changeset;
     
    127129        tblContent.setAutoCreateRowSorter(true);
    128130        tblContent.addMouseListener(new PopupMenuLauncher(new ChangesetContentTablePopupMenu()));
     131        HistoryInfoAction historyAction = MainApplication.getMenu().historyinfo;
     132        tblContent.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(historyAction.getShortcut().getKeyStroke(), "historyAction");
     133        tblContent.getActionMap().put("historyAction", historyAction);
    129134        pnl.add(new JScrollPane(tblContent), BorderLayout.CENTER);
    130135        return pnl;
  • trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java

    r14463 r16123  
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55
     6import java.awt.Component;
    67import java.awt.Dimension;
    78import java.awt.Point;
     
    2930import org.openstreetmap.josm.gui.util.WindowGeometry;
    3031import org.openstreetmap.josm.tools.JosmRuntimeException;
     32import org.openstreetmap.josm.tools.Logging;
    3133import org.openstreetmap.josm.tools.SubclassFilteredCollection;
    3234import org.openstreetmap.josm.tools.bugreport.BugReportExceptionHandler;
     
    5759    private static HistoryBrowserDialogManager instance;
    5860
    59     private final Map<Long, HistoryBrowserDialog> dialogs;
     61    private final Map<Long, HistoryBrowserDialog> dialogs = new HashMap<>();
    6062
    6163    private final Predicate<PrimitiveId> unloadedHistoryPredicate = new UnloadedHistoryPredicate();
     
    6668
    6769    protected HistoryBrowserDialogManager() {
    68         dialogs = new HashMap<>();
    6970        MainApplication.getLayerManager().addLayerChangeListener(this);
    7071    }
     
    147148    /**
    148149     * Hides and destroys all currently visible history browser dialogs
    149      *
     150     * @since 2448
    150151     */
    151152    public void hideAll() {
    152         List<HistoryBrowserDialog> dialogs = new ArrayList<>();
    153         dialogs.addAll(this.dialogs.values());
    154         for (HistoryBrowserDialog dialog: dialogs) {
    155             hide(dialog);
    156         }
     153        dialogs.values().forEach(this::hide);
    157154    }
    158155
     
    160157     * Show history dialog for the given history.
    161158     * @param h History to show
     159     * @since 2448
    162160     */
    163161    public void show(History h) {
     
    167165            show(h.getId());
    168166        } else {
    169             HistoryBrowserDialog dialog = new HistoryBrowserDialog(h);
    170             show(h.getId(), dialog);
     167            show(h.getId(), new HistoryBrowserDialog(h));
    171168        }
    172169    }
     
    218215     */
    219216    public void showHistory(final Collection<? extends PrimitiveId> primitives) {
     217        showHistory(MainApplication.getMainFrame(), primitives);
     218    }
     219
     220    /**
     221     * Show history dialog(s) for the given primitive(s).
     222     * @param parent Parent component for displayed dialog boxes
     223     * @param primitives The primitive(s) for which history will be displayed
     224     * @since 16123
     225     */
     226    public void showHistory(Component parent, final Collection<? extends PrimitiveId> primitives) {
    220227        final List<PrimitiveId> realPrimitives = new ArrayList<>(primitives);
    221228        hooks.forEach(h -> h.modifyRequestedIds(realPrimitives));
     
    223230        if (notNewPrimitives.isEmpty()) {
    224231            JOptionPane.showMessageDialog(
    225                     MainApplication.getMainFrame(),
     232                    parent,
    226233                    tr("Please select at least one already uploaded node, way, or relation."),
    227234                    tr("Warning"),
     
    230237        }
    231238
    232         Collection<? extends PrimitiveId> toLoad = SubclassFilteredCollection.filter(realPrimitives, unloadedHistoryPredicate);
     239        Collection<? extends PrimitiveId> toLoad = SubclassFilteredCollection.filter(notNewPrimitives, unloadedHistoryPredicate);
    233240        if (!toLoad.isEmpty()) {
    234             HistoryLoadTask task = new HistoryLoadTask();
    235             for (PrimitiveId p : notNewPrimitives) {
    236                 task.add(p);
    237             }
    238             MainApplication.worker.submit(task);
     241            MainApplication.worker.submit(new HistoryLoadTask(parent).addPrimitiveIds(toLoad));
    239242        }
    240243
     
    244247                    final History h = HistoryDataSet.getInstance().getHistory(p);
    245248                    if (h == null) {
     249                        Logging.warn("{0} not found in HistoryDataSet", p);
    246250                        continue;
    247251                    }
  • trunk/src/org/openstreetmap/josm/gui/history/HistoryLoadTask.java

    r16056 r16123  
    1111import java.util.HashSet;
    1212import java.util.List;
     13import java.util.Objects;
    1314import java.util.Set;
    1415
     
    6869     * parent for {@link org.openstreetmap.josm.gui.PleaseWaitDialog}.
    6970     * Must not be <code>null</code>.
    70      * @throws IllegalArgumentException if parent is <code>null</code>
     71     * @throws NullPointerException if parent is <code>null</code>
    7172     */
    7273    public HistoryLoadTask(Component parent) {
    73         super(parent, tr("Load history"), true);
    74         CheckParameterUtil.ensureParameterNotNull(parent, "parent");
     74        super(Objects.requireNonNull(parent, "parent"), tr("Load history"), true);
    7575    }
    7676
     
    9292     * @param primitive the history item
    9393     * @return this task
    94      * @throws IllegalArgumentException if primitive is null
     94     * @throws NullPointerException if primitive is null
    9595     */
    9696    public HistoryLoadTask add(HistoryOsmPrimitive primitive) {
    97         CheckParameterUtil.ensureParameterNotNull(primitive, "primitive");
    9897        return add(primitive.getPrimitiveId());
    9998    }
     
    104103     * @param history the history. Must not be null.
    105104     * @return this task
    106      * @throws IllegalArgumentException if history is null
     105     * @throws NullPointerException if history is null
    107106     */
    108107    public HistoryLoadTask add(History history) {
    109         CheckParameterUtil.ensureParameterNotNull(history, "history");
    110108        return add(history.getPrimitiveId());
    111109    }
     
    116114     * @param primitive the OSM primitive. Must not be null. primitive.getOsmId() &gt; 0 required.
    117115     * @return this task
    118      * @throws IllegalArgumentException if the primitive is null
     116     * @throws NullPointerException if the primitive is null
    119117     * @throws IllegalArgumentException if primitive.getOsmId() &lt;= 0
    120118     */
     
    130128     * <code>primitive.getId() &gt; 0</code> required.
    131129     * @return this task
    132      * @throws IllegalArgumentException if primitives is <code>null</code>
     130     * @throws NullPointerException if primitives is null
    133131     * @throws IllegalArgumentException if one of the ids in the collection &lt;= 0
    134      */
    135     public HistoryLoadTask add(Collection<? extends OsmPrimitive> primitives) {
    136         CheckParameterUtil.ensureParameterNotNull(primitives, "primitives");
    137         for (OsmPrimitive primitive: primitives) {
    138             if (primitive != null) {
    139                 add(primitive);
    140             }
    141         }
     132     * @since 16123
     133     */
     134    public HistoryLoadTask addPrimitiveIds(Collection<? extends PrimitiveId> primitives) {
     135        primitives.forEach(this::add);
     136        return this;
     137    }
     138
     139    /**
     140     * Adds a collection of objects to loaded, specified by a collection of OSM primitives.
     141     *
     142     * @param primitives the OSM primitives. Must not be <code>null</code>.
     143     * <code>primitive.getId() &gt; 0</code> required.
     144     * @return this task
     145     * @throws NullPointerException if primitives is null
     146     * @throws IllegalArgumentException if one of the ids in the collection &lt;= 0
     147     * @since 16123
     148     */
     149    public HistoryLoadTask addOsmPrimitives(Collection<? extends OsmPrimitive> primitives) {
     150        primitives.forEach(this::add);
    142151        return this;
    143152    }
Note: See TracChangeset for help on using the changeset viewer.