Ticket #6773: 6773.patch

File 6773.patch, 20.2 KB (added by simon04, 14 years ago)
  • src/org/openstreetmap/josm/actions/HistoryInfoAction.java

    diff --git a/src/org/openstreetmap/josm/actions/HistoryInfoAction.java b/src/org/openstreetmap/josm/actions/HistoryInfoAction.java
    index 928335d..4d97f0b 100644
    a b  
    11//License: GPL. Copyright 2007 by Immanuel Scholz and others
    22package org.openstreetmap.josm.actions;
    33
    4 import static org.openstreetmap.josm.tools.I18n.tr;
    5 
     4import java.awt.event.ActionEvent;
    65import java.awt.event.KeyEvent;
     6import java.util.Collection;
    77
    88import org.openstreetmap.josm.Main;
     9import org.openstreetmap.josm.data.osm.DataSet;
    910import org.openstreetmap.josm.data.osm.OsmPrimitive;
    10 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
     11import org.openstreetmap.josm.gui.history.HistoryBrowserDialogManager;
    1112import org.openstreetmap.josm.tools.Shortcut;
     13
     14import static org.openstreetmap.josm.tools.I18n.tr;
    1215import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
    1316
    14 public class HistoryInfoAction extends AbstractInfoAction {
    15 
    16     public HistoryInfoAction() {
    17         super(tr("Object history"), "about",
    18                 tr("Display history information about OSM ways, nodes, or relations."),
    19                 Shortcut.registerShortcut("core:history",
    20                         tr("Object history"), KeyEvent.VK_H, Shortcut.GROUP_HOTKEY), false);
    21         putValue("help", ht("/Action/ObjectHistory"));
    22         putValue("toolbar", "action/historyinfo");
    23         Main.toolbar.register(this);
    24     }
    25 
    26     @Override
    27     protected  String createInfoUrl(Object infoObject) {
    28         OsmPrimitive primitive = (OsmPrimitive)infoObject;
    29         return getBaseBrowseUrl() + "/" + OsmPrimitiveType.from(primitive).getAPIName() + "/" + primitive.getId() + "/history";
    30     }
     17public class HistoryInfoAction extends JosmAction {
     18
     19        public HistoryInfoAction() {
     20                super(tr("History"), "about",
     21                                tr("Display history information about OSM ways, nodes, or relations."),
     22                                Shortcut.registerShortcut("core:historyinfo",
     23                                tr("History"), KeyEvent.VK_H, Shortcut.GROUP_HOTKEY), false);
     24                putValue("help", ht("/Action/ObjectHistory"));
     25                putValue("toolbar", "action/historyinfo");
     26                Main.toolbar.register(this);
     27        }
     28
     29        @Override
     30        public void actionPerformed(ActionEvent ae) {
     31                DataSet set = getCurrentDataSet();
     32                if (set != null) {
     33                        HistoryBrowserDialogManager.getInstance().showHistory(set.getSelected());
     34                }
     35        }
     36
     37        @Override
     38        public void updateEnabledState() {
     39                if (getCurrentDataSet() == null) {
     40                        setEnabled(false);
     41                } else {
     42                        updateEnabledState(getCurrentDataSet().getSelected());
     43                }
     44        }
     45
     46        @Override
     47        protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
     48                setEnabled(!selection.isEmpty());
     49        }
    3150}
  • deleted file src/org/openstreetmap/josm/actions/HistoryInfoWebbrowserAction.java

    diff --git a/src/org/openstreetmap/josm/actions/HistoryInfoWebbrowserAction.java b/src/org/openstreetmap/josm/actions/HistoryInfoWebbrowserAction.java
    deleted file mode 100644
    index aca7ffe..0000000
    + -  
    1 //License: GPL. Copyright 2007 by Immanuel Scholz and others
    2 package org.openstreetmap.josm.actions;
    3 
    4 import static org.openstreetmap.josm.tools.I18n.tr;
    5 
    6 import java.awt.event.KeyEvent;
    7 
    8 import org.openstreetmap.josm.Main;
    9 import org.openstreetmap.josm.data.osm.OsmPrimitive;
    10 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    11 import org.openstreetmap.josm.tools.Shortcut;
    12 import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
    13 
    14 public class HistoryInfoWebbrowserAction extends AbstractInfoAction {
    15 
    16     public HistoryInfoWebbrowserAction() {
    17         super(tr("History (web)"), "about",
    18                 tr("Display history information about OSM ways, nodes, or relations in web browser."),
    19                 Shortcut.registerShortcut("core:historybrowser",
    20                         tr("Object history (web browser)"), KeyEvent.VK_H, Shortcut.GROUP_HOTKEY, Shortcut.SHIFT_DEFAULT), false);
    21         putValue("help", ht("/Action/ObjectHistory"));
    22                         putValue("toolbar", "action/historybrowserinfo");
    23         Main.toolbar.register(this);
    24     }
    25 
    26     @Override
    27     protected  String createInfoUrl(Object infoObject) {
    28         OsmPrimitive primitive = (OsmPrimitive) infoObject;
    29         return getBaseBrowseUrl() + "/" + OsmPrimitiveType.from(primitive).getAPIName() + "/" + primitive.getId() + "/history";
    30     }
    31 }
  • src/org/openstreetmap/josm/actions/InfoAction.java

    diff --git a/src/org/openstreetmap/josm/actions/InfoAction.java b/src/org/openstreetmap/josm/actions/InfoAction.java
    index d89a70e..27d5c66 100644
    a b  
    11//License: GPL. Copyright 2007 by Immanuel Scholz and others
    22package org.openstreetmap.josm.actions;
    33
     4import java.awt.event.ActionEvent;
    45import static org.openstreetmap.josm.tools.I18n.tr;
    56import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
    67
    78import java.awt.event.KeyEvent;
    89
     10import java.util.Collection;
    911import org.openstreetmap.josm.Main;
     12import org.openstreetmap.josm.data.osm.DataSet;
    1013import org.openstreetmap.josm.data.osm.OsmPrimitive;
    11 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
     14import org.openstreetmap.josm.gui.dialogs.InspectPrimitiveDialog;
    1215import org.openstreetmap.josm.tools.Shortcut;
    1316
    14 public class InfoAction extends AbstractInfoAction {
     17public class InfoAction extends JosmAction {
    1518
    1619    public InfoAction() {
    17         super(tr("Info about Element"), "about",
    18                 tr("Display object information about OSM nodes, ways, or relations."),
    19                 Shortcut.registerShortcut("core:information",
    20                         tr("Info about Element"), KeyEvent.VK_I, Shortcut.GROUP_HOTKEY), false);
     20        super(tr("Advanced info"), "about",
     21                tr("Display advanced object information about OSM nodes, ways, or relations."),
     22                Shortcut.registerShortcut("core:info",
     23                tr("Advanced info"), KeyEvent.VK_I, Shortcut.GROUP_HOTKEY), false);
    2124        putValue("help", ht("/Action/InfoAboutElements"));
    2225        putValue("toolbar", "action/info");
    2326        Main.toolbar.register(this);
    2427    }
    2528
    2629    @Override
    27     protected  String createInfoUrl(Object infoObject) {
    28         OsmPrimitive primitive = (OsmPrimitive)infoObject;
    29         return getBaseBrowseUrl() + "/" + OsmPrimitiveType.from(primitive).getAPIName() + "/" + primitive.getId();
     30    public void actionPerformed(ActionEvent ae) {
     31        DataSet set = getCurrentDataSet();
     32                if (set != null) {
     33                        new InspectPrimitiveDialog(set.getSelected(), Main.map.mapView.getEditLayer()).showDialog();
     34                }
     35    }
     36
     37    @Override
     38    public void updateEnabledState() {
     39        if (getCurrentDataSet() == null) {
     40            setEnabled(false);
     41        } else {
     42            updateEnabledState(getCurrentDataSet().getSelected());
     43        }
     44    }
     45
     46    @Override
     47    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
     48        setEnabled(!selection.isEmpty());
    3049    }
    3150}
  • src/org/openstreetmap/josm/gui/MainMenu.java

    diff --git a/src/org/openstreetmap/josm/gui/MainMenu.java b/src/org/openstreetmap/josm/gui/MainMenu.java
    index 311f8d3..f3c3306 100644
    a b import org.openstreetmap.josm.actions.FullscreenToggleAction;  
    3838import org.openstreetmap.josm.actions.GpxExportAction;
    3939import org.openstreetmap.josm.actions.HelpAction;
    4040import org.openstreetmap.josm.actions.HistoryInfoAction;
     41import org.openstreetmap.josm.actions.HistoryInfoWebAction;
    4142import org.openstreetmap.josm.actions.InfoAction;
     43import org.openstreetmap.josm.actions.InfoWebAction;
    4244import org.openstreetmap.josm.actions.JoinAreasAction;
    4345import org.openstreetmap.josm.actions.JoinNodeWayAction;
    4446import org.openstreetmap.josm.actions.JosmAction;
    public class MainMenu extends JMenuBar {  
    142144    public final WireframeToggleAction wireFrameToggleAction = new WireframeToggleAction();
    143145    public final JosmAction toggleGPXLines = new ToggleGPXLinesAction();
    144146    public final InfoAction info = new InfoAction();
     147    public final InfoWebAction infoweb = new InfoWebAction();
    145148    public final HistoryInfoAction historyinfo = new HistoryInfoAction();
     149    public final HistoryInfoWebAction historyinfoweb = new HistoryInfoWebAction();
    146150
    147151    /* Tools menu */
    148152    public final JosmAction splitWay = new SplitWayAction();
    public class MainMenu extends JMenuBar {  
    316320        }
    317321        viewMenu.addSeparator();
    318322        add(viewMenu, info);
     323        add(viewMenu, infoweb);
    319324        add(viewMenu, historyinfo);
     325                add(viewMenu, historyinfoweb);
    320326
    321327        add(presetsMenu, presetSearchAction);
    322328
  • src/org/openstreetmap/josm/gui/dialogs/HistoryDialog.java

    diff --git a/src/org/openstreetmap/josm/gui/dialogs/HistoryDialog.java b/src/org/openstreetmap/josm/gui/dialogs/HistoryDialog.java
    index ba08b87..d781c54 100644
    a b import javax.swing.JComponent;  
    2121import javax.swing.JLabel;
    2222import javax.swing.JTable;
    2323import javax.swing.ListSelectionModel;
    24 import javax.swing.SwingUtilities;
    2524import javax.swing.event.ListSelectionEvent;
    2625import javax.swing.event.ListSelectionListener;
    2726import javax.swing.table.DefaultTableCellRenderer;
    import org.openstreetmap.josm.data.SelectionChangedListener;  
    3534import org.openstreetmap.josm.data.osm.DataSet;
    3635import org.openstreetmap.josm.data.osm.OsmPrimitive;
    3736import org.openstreetmap.josm.data.osm.PrimitiveId;
    38 import org.openstreetmap.josm.data.osm.history.History;
    3937import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
    4038import org.openstreetmap.josm.data.osm.history.HistoryDataSetListener;
    4139import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
    import org.openstreetmap.josm.gui.SideButton;  
    4341import org.openstreetmap.josm.gui.help.HelpUtil;
    4442import org.openstreetmap.josm.gui.history.HistoryBrowserDialogManager;
    4543import org.openstreetmap.josm.gui.history.HistoryLoadTask;
    46 import org.openstreetmap.josm.tools.BugReportExceptionHandler;
    4744import org.openstreetmap.josm.tools.ImageProvider;
    4845import org.openstreetmap.josm.tools.Shortcut;
    4946
    public class HistoryDialog extends ToggleDialog implements HistoryDataSetListene  
    289286        public void mouseClicked(MouseEvent e) {
    290287            if (e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1) {
    291288                int row = historyTable.rowAtPoint(e.getPoint());
    292                 new ShowHistoryAction().showHistory(Collections.singletonList(model.getPrimitive(row)));
     289                HistoryBrowserDialogManager.getInstance().showHistory(Collections.singletonList(model.getPrimitive(row)));
    293290            }
    294291        }
    295292    }
    public class HistoryDialog extends ToggleDialog implements HistoryDataSetListene  
    305302            updateEnabledState();
    306303        }
    307304
    308         protected List<OsmPrimitive> filterPrimitivesWithUnloadedHistory(Collection<OsmPrimitive> primitives) {
    309             ArrayList<OsmPrimitive> ret = new ArrayList<OsmPrimitive>(primitives.size());
    310             HistoryDataSet hds = HistoryDataSet.getInstance();
    311             for (OsmPrimitive p: primitives) {
    312                 if (hds.getHistory(p.getPrimitiveId()) == null) {
    313                     // reload if the history is not in the cache yet
    314                     ret.add(p);
    315                 } else if (!p.isNew() && hds.getHistory(p.getPrimitiveId()).getByVersion(p.getUniqueId()) == null) {
    316                     // reload if the history object of the selected object is not in the cache
    317                     // yet
    318                     ret.add(p);
    319                 }
    320             }
    321             return ret;
    322         }
    323 
    324         public void showHistory(final List<OsmPrimitive> primitives) {
    325             List<OsmPrimitive> toLoad = filterPrimitivesWithUnloadedHistory(primitives);
    326             if (!toLoad.isEmpty()) {
    327                 HistoryLoadTask task = new HistoryLoadTask();
    328                 task.add(primitives);
    329                 Main.worker.submit(task);
    330             }
    331 
    332             Runnable r = new Runnable() {
    333                 public void run() {
    334                     try {
    335                         for (OsmPrimitive p : primitives) {
    336                             History h = HistoryDataSet.getInstance().getHistory(p.getPrimitiveId());
    337                             if (h == null) {
    338                                 continue;
    339                             }
    340                             HistoryBrowserDialogManager.getInstance().show(h);
    341                         }
    342                     } catch (final Exception e) {
    343                         SwingUtilities.invokeLater(new Runnable() {
    344                             public void run() {
    345                                 BugReportExceptionHandler.handleException(e);
    346                             }
    347                         });
    348                     }
    349 
    350                 }
    351             };
    352             Main.worker.submit(r);
    353         }
    354 
    355305        public void actionPerformed(ActionEvent e) {
    356306            int [] rows = historyTable.getSelectedRows();
    357307            if (rows == null || rows.length == 0) return;
    358             showHistory(model.getPrimitives(rows));
     308            HistoryBrowserDialogManager.getInstance().showHistory(model.getPrimitives(rows));
    359309        }
    360310
    361311        protected void updateEnabledState() {
  • src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java

    diff --git a/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java b/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
    index 1a9ff34..cf0a19b 100644
    a b import java.util.Arrays;  
    1616import java.util.Collection;
    1717import java.util.Collections;
    1818import java.util.Comparator;
    19 import java.util.HashMap;
    2019import java.util.HashSet;
    2120import java.util.LinkedList;
    2221import java.util.List;
    import java.util.Set;  
    2524import javax.swing.AbstractAction;
    2625import javax.swing.AbstractListModel;
    2726import javax.swing.DefaultListSelectionModel;
    28 import javax.swing.JButton;
    2927import javax.swing.JList;
    3028import javax.swing.JMenuItem;
    3129import javax.swing.JPopupMenu;
    public class SelectionListDialog extends ToggleDialog {  
    8785    private SetRelationSelection actSetRelationSelection;
    8886    private EditRelationSelection actEditRelationSelection;
    8987    private DownloadSelectedIncompleteMembersAction actDownloadSelectedIncompleteMembers;
    90     private InspectAction actInspect;
    9188
    9289    /**
    9390     * Builds the content panel for this dialog
    public class SelectionListDialog extends ToggleDialog {  
    147144        actDownloadSelectedIncompleteMembers = new DownloadSelectedIncompleteMembersAction();
    148145        lstPrimitives.getSelectionModel().addListSelectionListener(actDownloadSelectedIncompleteMembers);
    149146
    150         actInspect = new InspectAction();
    151         lstPrimitives.getSelectionModel().addListSelectionListener(actInspect);
    152 
    153147        lstPrimitives.addMouseListener(new SelectionPopupMenuLauncher());
    154148        lstPrimitives.addMouseListener(new DblClickHandler());
    155149    }
    public class SelectionListDialog extends ToggleDialog {  
    220214            add(actEditRelationSelection);
    221215            addSeparator();
    222216            add(actDownloadSelectedIncompleteMembers);
    223             addSeparator();
    224             add(actInspect);
    225217        }
    226218    }
    227219
    public class SelectionListDialog extends ToggleDialog {  
    850842        }
    851843    }
    852844
    853     class InspectAction extends AbstractAction implements ListSelectionListener {
    854         public InspectAction() {
    855             putValue(SHORT_DESCRIPTION, tr("Get detailed information on the internal state of the objects."));
    856             putValue(NAME, tr("Inspect"));
    857             updateEnabledState();
    858         }
    859 
    860         public void actionPerformed(ActionEvent e) {
    861             Collection<OsmPrimitive> sel = model.getSelected();
    862             if (sel.isEmpty()) return;
    863             InspectPrimitiveDialog inspectDialog = new InspectPrimitiveDialog(sel, Main.map.mapView.getEditLayer());
    864             inspectDialog.showDialog();
    865         }
    866 
    867         public void updateEnabledState() {
    868             setEnabled(!model.getSelected().isEmpty());
    869         }
    870 
    871         public void valueChanged(ListSelectionEvent e) {
    872             updateEnabledState();
    873         }
    874     }
    875 
    876845    /** Quicker comparator, comparing just by type and ID's */
    877846    static private class OsmPrimitiveQuickComparator implements Comparator<OsmPrimitive> {
    878847
  • src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java

    diff --git a/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java b/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java
    index 5d24dd8..e285a2d 100644
    a b  
    11// License: GPL. For details, see LICENSE file.
    22package org.openstreetmap.josm.gui.history;
    33
     4import static org.openstreetmap.josm.tools.I18n.tr;
     5
    46import java.awt.Dimension;
    57import java.awt.Point;
    68import java.util.ArrayList;
     9import java.util.Collection;
    710import java.util.HashMap;
    811import java.util.Map;
     12import javax.swing.JOptionPane;
     13import javax.swing.SwingUtilities;
    914
    1015import org.openstreetmap.josm.Main;
     16import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1117import org.openstreetmap.josm.data.osm.history.History;
     18import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
    1219import org.openstreetmap.josm.gui.MapView;
    1320import org.openstreetmap.josm.gui.layer.Layer;
     21import org.openstreetmap.josm.tools.BugReportExceptionHandler;
     22import org.openstreetmap.josm.tools.Predicate;
     23import org.openstreetmap.josm.tools.Utils;
    1424import org.openstreetmap.josm.tools.WindowGeometry;
    1525
    1626public class HistoryBrowserDialogManager implements MapView.LayerChangeListener {
    public class HistoryBrowserDialogManager implements MapView.LayerChangeListener  
    122132            hideAll();
    123133        }
    124134    }
     135
     136        public void showHistory(final Collection<OsmPrimitive> primitives) {
     137                final Collection<OsmPrimitive> notNewPrimitives = Utils.filter(primitives, notNewPredicate);
     138                if (notNewPrimitives.isEmpty()) {
     139                        JOptionPane.showMessageDialog(
     140                                        Main.parent,
     141                                        tr("Please select at least one already uploaded node, way, or relation."),
     142                                        tr("Warning"),
     143                                        JOptionPane.WARNING_MESSAGE);
     144                        return;
     145                }
     146                Collection<OsmPrimitive> toLoad = Utils.filter(primitives, unloadedHistoryPredicate);
     147                if (!toLoad.isEmpty()) {
     148                        HistoryLoadTask task = new HistoryLoadTask();
     149                        task.add(notNewPrimitives);
     150                        Main.worker.submit(task);
     151                }
     152
     153                Runnable r = new Runnable() {
     154
     155                        @Override
     156                        public void run() {
     157                                try {
     158                                        for (OsmPrimitive p : notNewPrimitives) {
     159                                                History h = HistoryDataSet.getInstance().getHistory(p.getPrimitiveId());
     160                                                if (h == null) {
     161                                                        continue;
     162                                                }
     163                                                show(h);
     164                                        }
     165                                } catch (final Exception e) {
     166                                        SwingUtilities.invokeLater(new Runnable() {
     167
     168                                                @Override
     169                                                public void run() {
     170                                                        BugReportExceptionHandler.handleException(e);
     171                                                }
     172                                        });
     173                                }
     174
     175                        }
     176                };
     177                Main.worker.submit(r);
     178        }
     179
     180        private final Predicate<OsmPrimitive> unloadedHistoryPredicate = new Predicate<OsmPrimitive>() {
     181
     182                HistoryDataSet hds = HistoryDataSet.getInstance();
     183
     184                @Override
     185                public boolean evaluate(OsmPrimitive p) {
     186                        if (hds.getHistory(p.getPrimitiveId()) == null) {
     187                                // reload if the history is not in the cache yet
     188                                return true;
     189                        } else if (!p.isNew() && hds.getHistory(p.getPrimitiveId()).getByVersion(p.getUniqueId()) == null) {
     190                                // reload if the history object of the selected object is not in the cache yet
     191                                return true;
     192                        } else {
     193                                return false;
     194                        }
     195                }
     196        };
     197
     198        private final Predicate<OsmPrimitive> notNewPredicate = new Predicate<OsmPrimitive>() {
     199
     200                @Override
     201                public boolean evaluate(OsmPrimitive p) {
     202                        return !p.isNew();
     203                }
     204        };
     205
    125206}
  • src/org/openstreetmap/josm/tools/Utils.java

    diff --git a/src/org/openstreetmap/josm/tools/Utils.java b/src/org/openstreetmap/josm/tools/Utils.java
    index 20f07ce..ae24092 100644
    a b public class Utils {  
    5454        }
    5555        return null;
    5656    }
     57
     58        public static <T> Collection<T> filter(Collection<? extends T> collection, Predicate<? super T> predicate) {
     59                return new FilteredCollection<T>(collection, predicate);
     60        }
    5761   
    5862    /**
    5963     * Filter a collection by (sub)class.