Changeset 2239 in josm for trunk/src/org/openstreetmap


Ignore:
Timestamp:
2009-10-03T16:24:29+02:00 (15 years ago)
Author:
Gubaer
Message:

see #3626: Show history for any object in history dialog (partially fixed)
fixed #3515: The history dialog is confusing unless you know how it works

Location:
trunk/src/org/openstreetmap/josm/gui
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/dialogs/HistoryDialog.java

    r2181 r2239  
    22package org.openstreetmap.josm.gui.dialogs;
    33
    4 import static org.openstreetmap.josm.tools.I18n.marktr;
    54import static org.openstreetmap.josm.tools.I18n.tr;
    65
    76import java.awt.BorderLayout;
    8 import java.awt.Color;
    97import java.awt.Component;
    108import java.awt.GridLayout;
     
    1311import java.awt.event.MouseAdapter;
    1412import java.awt.event.MouseEvent;
    15 import java.io.IOException;
    1613import java.util.ArrayList;
    1714import java.util.Collection;
    18 import java.util.HashMap;
    19 import java.util.Iterator;
     15import java.util.Collections;
     16import java.util.List;
    2017
    2118import javax.swing.AbstractAction;
    2219import javax.swing.Action;
    23 import javax.swing.ImageIcon;
     20import javax.swing.DefaultListSelectionModel;
    2421import javax.swing.JComponent;
    2522import javax.swing.JLabel;
    26 import javax.swing.JOptionPane;
    2723import javax.swing.JPanel;
    2824import javax.swing.JScrollPane;
     
    4137import org.openstreetmap.josm.data.osm.DataSet;
    4238import org.openstreetmap.josm.data.osm.OsmPrimitive;
    43 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    4439import org.openstreetmap.josm.data.osm.history.History;
    4540import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
    4641import org.openstreetmap.josm.data.osm.history.HistoryDataSetListener;
    47 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
     42import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
    4843import org.openstreetmap.josm.gui.SideButton;
    4944import org.openstreetmap.josm.gui.history.HistoryBrowserDialog;
    5045import org.openstreetmap.josm.gui.history.HistoryBrowserDialogManager;
    5146import org.openstreetmap.josm.gui.history.HistoryLoadTask;
    52 import org.openstreetmap.josm.io.OsmApi;
    53 import org.openstreetmap.josm.io.OsmApiException;
    54 import org.openstreetmap.josm.io.OsmServerHistoryReader;
    55 import org.openstreetmap.josm.io.OsmTransferException;
    5647import org.openstreetmap.josm.tools.ImageProvider;
    5748import org.openstreetmap.josm.tools.Shortcut;
    58 import org.xml.sax.SAXException;
    5949
    6050/**
    61  * History dialog works like follows:
    62  *
    63  * There is a history cache hold in the back for primitives of the last refresh.
    64  * When the user refreshes, this cache is cleared and all currently selected items
    65  * are reloaded.
    66  * If the user has selected at least one primitive not in the cache, the list
    67  * is not displayed. Elsewhere, the list of all changes of all currently selected
    68  * objects are displayed.
    69  *
    70  * @author imi
     51 * HistoryDialog displays a list of the currently selected primitives and provides
     52 * two actions for (1) (re)loading the history of the selected primitives and (2)
     53 * for launching a history browser for each selected primitive.
     54 *
    7155 */
    7256public class HistoryDialog extends ToggleDialog implements HistoryDataSetListener {
    7357
    7458    /** the table model */
    75     protected HistoryItemDataModel model;
     59    protected HistoryItemTableModel model;
    7660    /** the table with the history items */
    7761    protected JTable historyTable;
     
    10387     */
    10488    protected void build() {
    105         model = new HistoryItemDataModel();
    106         //setLayout(new BorderLayout());
     89        DefaultListSelectionModel selectionModel = new DefaultListSelectionModel();
    10790        historyTable = new JTable(
    108                 model,
    109                 new HistoryTableColumnModel()
     91                model = new HistoryItemTableModel(selectionModel),
     92                new HistoryTableColumnModel(),
     93                selectionModel
    11094        );
    111         historyTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
     95        historyTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    11296        historyTable.setName("table.historyitems");
    11397        final TableCellRenderer oldRenderer = historyTable.getTableHeader().getDefaultRenderer();
     
    126110            }
    127111        });
    128         historyTable.addMouseListener(
    129                 new MouseAdapter() {
    130                     @Override
    131                     public void mouseClicked(MouseEvent e) {
    132                         if (e.getClickCount() == 2) {
    133                             int row = historyTable.rowAtPoint(e.getPoint());
    134                             History h = model.get(row);
    135                             showHistory(h);
    136                         }
    137                     }
    138                 }
    139         );
    140112
    141113        JScrollPane pane = new JScrollPane(historyTable);
     
    151123        //
    152124        historyTable.getSelectionModel().addListSelectionListener(showHistoryAction);
    153         DataSet.selListeners.add(reloadAction);
     125        historyTable.getSelectionModel().addListSelectionListener(reloadAction);
    154126    }
    155127
     
    162134        HistoryDataSet.getInstance().addHistoryDataSetListener(this);
    163135    }
    164 
    165 
    166136
    167137    public void historyUpdated(HistoryDataSet source, long primitiveId) {
     
    191161     *
    192162     */
    193     class HistoryItemDataModel extends DefaultTableModel implements SelectionChangedListener{
    194         private ArrayList<History> data;
    195 
    196         public HistoryItemDataModel() {
    197             data = new ArrayList<History>();
     163    class HistoryItemTableModel extends DefaultTableModel implements SelectionChangedListener{
     164        private ArrayList<OsmPrimitive> data;
     165        private DefaultListSelectionModel selectionModel;
     166
     167        public HistoryItemTableModel(DefaultListSelectionModel selectionModel) {
     168            data = new ArrayList<OsmPrimitive>();
     169            this.selectionModel = selectionModel;
    198170        }
    199171
     
    215187        }
    216188
     189        protected List<OsmPrimitive> getSelectedPrimitives() {
     190            ArrayList<OsmPrimitive> ret = new ArrayList<OsmPrimitive>();
     191            for (int i=0; i< data.size(); i++) {
     192                if (selectionModel.isSelectedIndex(i)) {
     193                    ret.add(data.get(i));
     194                }
     195            }
     196            return ret;
     197        }
     198
     199        protected void selectPrimitives(Collection<OsmPrimitive> primitives) {
     200            for (OsmPrimitive p: primitives) {
     201                int idx = data.indexOf(p);
     202                if (idx < 0) {
     203                    continue;
     204                }
     205                selectionModel.addSelectionInterval(idx, idx);
     206            }
     207        }
     208
    217209        public void refresh() {
     210            List<OsmPrimitive> selectedPrimitives = getSelectedPrimitives();
    218211            data.clear();
    219212            if (Main.main.getCurrentDataSet() == null)
     
    223216                    continue;
    224217                }
    225                 History h = HistoryDataSet.getInstance().getHistory(primitive.getId());
    226                 if (h !=null) {
    227                     data.add(h);
    228                 }
     218                data.add(primitive);
    229219            }
    230220            fireTableDataChanged();
     221            selectPrimitives(selectedPrimitives);
    231222        }
    232223
     
    235226        }
    236227
    237         public History get(int idx) throws IndexOutOfBoundsException {
    238             if (idx < 0 || idx >= data.size())
    239                 throw new IndexOutOfBoundsException(tr("Index out of bounds. Got {0}.", idx));
    240             return data.get(idx);
    241         }
    242     }
    243 
    244 
    245     /**
    246      * The table cell renderer for the history items.
    247      *
    248      */
    249     class HistoryTableCellRenderer extends JLabel implements TableCellRenderer {
    250 
    251         public final Color BGCOLOR_SELECTED = new Color(143,170,255);
    252 
    253         private HashMap<OsmPrimitiveType, ImageIcon> icons;
    254 
    255         public HistoryTableCellRenderer() {
    256             setOpaque(true);
    257             icons = new HashMap<OsmPrimitiveType, ImageIcon>();
    258             icons.put(OsmPrimitiveType.NODE, ImageProvider.get("data", "node"));
    259             icons.put(OsmPrimitiveType.WAY, ImageProvider.get("data", "way"));
    260             icons.put(OsmPrimitiveType.RELATION, ImageProvider.get("data", "relation"));
    261         }
    262 
    263         protected void renderIcon(History history) {
    264             setIcon(icons.get(history.getEarliest().getType()));
    265         }
    266 
    267         protected void renderText(History h) {
    268             String msg = "";
    269             switch(h.getEarliest().getType()) {
    270                 case NODE:  msg = marktr("Node {0}"); break;
    271                 case WAY: msg = marktr("Way {0}"); break;
    272                 case RELATION: msg = marktr("Relation {0}"); break;
    273             }
    274             setText(tr(msg,h.getId()));
    275         }
    276 
    277         public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
    278                 boolean hasFocus, int row, int column) {
    279             History h = (History)value;
    280             renderIcon(h);
    281             renderText(h);
    282             if (isSelected) {
    283                 setBackground(BGCOLOR_SELECTED);
    284             } else {
    285                 setBackground(Color.WHITE);
    286             }
    287             return this;
     228        public List<OsmPrimitive> getPrimitives(int [] rows) {
     229            if (rows == null || rows.length == 0) return Collections.emptyList();
     230            ArrayList<OsmPrimitive> ret = new ArrayList<OsmPrimitive>(rows.length);
     231            for (int row: rows) {
     232                ret.add(data.get(row));
     233            }
     234            return ret;
    288235        }
    289236    }
     
    295242        protected void createColumns() {
    296243            TableColumn col = null;
    297             HistoryTableCellRenderer renderer = new HistoryTableCellRenderer();
     244            OsmPrimitivRenderer renderer = new OsmPrimitivRenderer();
    298245            // column 0 - History item
    299246            col = new TableColumn(0);
    300             col.setHeaderValue(tr("History item"));
     247            col.setHeaderValue(tr("Object with history"));
    301248            col.setCellRenderer(renderer);
    302249            addColumn(col);
     
    312259     *
    313260     */
    314     class ReloadAction extends AbstractAction implements SelectionChangedListener {
     261    class ReloadAction extends AbstractAction implements ListSelectionListener {
    315262        public ReloadAction() {
    316263            putValue(Action.SMALL_ICON, ImageProvider.get("dialogs","refresh"));
     264            putValue(Action.NAME, tr("Reload"));
    317265            putValue(Action.SHORT_DESCRIPTION, tr("Reload all currently selected objects and refresh the list."));
     266            updateEnabledState();
    318267        }
    319268
    320269        public void actionPerformed(ActionEvent e) {
     270            int [] rows = historyTable.getSelectedRows();
     271            if (rows == null || rows.length == 0) return;
     272
     273            List<OsmPrimitive> selectedItems = model.getPrimitives(rows);
    321274            HistoryLoadTask task = new HistoryLoadTask();
    322             task.add(Main.main.getCurrentDataSet().getSelected());
     275            task.add(selectedItems);
    323276            Main.worker.execute(task);
    324277        }
    325278
    326         public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
    327             if (Main.main.getCurrentDataSet() == null) {
    328                 setEnabled(false);
    329             } else {
    330                 setEnabled(Main.main.getCurrentDataSet().getSelected().size() > 0);
    331             }
     279        protected void updateEnabledState() {
     280            setEnabled(historyTable.getSelectedRowCount() > 0);
     281        }
     282
     283        public void valueChanged(ListSelectionEvent e) {
     284            updateEnabledState();
    332285        }
    333286    }
     
    338291    class ShowHistoryAction extends AbstractAction implements ListSelectionListener {
    339292        public ShowHistoryAction() {
    340             //putValue(Action.SMALL_ICON, ImageProvider.get("dialogs","refresh"));
     293            putValue(Action.SMALL_ICON, ImageProvider.get("dialogs","history"));
    341294            putValue(Action.NAME, tr("Show"));
    342             putValue(Action.SHORT_DESCRIPTION, tr("Display the history of the selected primitive."));
     295            putValue(Action.SHORT_DESCRIPTION, tr("Display the history of the selected objects."));
     296            updateEnabledState();
     297        }
     298
     299        protected List<OsmPrimitive> filterPrimitivesWithUnloadedHistory(Collection<OsmPrimitive> primitives) {
     300            ArrayList<OsmPrimitive> ret = new ArrayList<OsmPrimitive>(primitives.size());
     301            for (OsmPrimitive p: primitives) {
     302                if (HistoryDataSet.getInstance().getHistory(p.getId()) == null) {
     303                    ret.add(p);
     304                }
     305            }
     306            return ret;
    343307        }
    344308
    345309        public void actionPerformed(ActionEvent e) {
    346             int row = historyTable.getSelectionModel().getMinSelectionIndex();
    347             if (row < 0) return;
    348             History h = model.get(row);
    349             showHistory(h);
     310            int [] rows = historyTable.getSelectedRows();
     311            if (rows == null || rows.length == 0) return;
     312
     313            final List<OsmPrimitive> selectedItems = model.getPrimitives(rows);
     314            List<OsmPrimitive> toLoad = filterPrimitivesWithUnloadedHistory(selectedItems);
     315            if (!toLoad.isEmpty()) {
     316                HistoryLoadTask task = new HistoryLoadTask();
     317                task.add(selectedItems);
     318                Main.worker.submit(task);
     319            }
     320
     321            Runnable r = new Runnable() {
     322                public void run() {
     323                    for (OsmPrimitive p : selectedItems) {
     324                        History h = HistoryDataSet.getInstance().getHistory(p.getId());
     325                        if (h == null) {
     326                            continue;
     327                        }
     328                        showHistory(h);
     329                    }
     330                }
     331            };
     332            Main.worker.submit(r);
     333        }
     334
     335        protected void updateEnabledState() {
     336            setEnabled(historyTable.getSelectedRowCount() > 0);
    350337        }
    351338
    352339        public void valueChanged(ListSelectionEvent e) {
    353             setEnabled(historyTable.getSelectionModel().getMinSelectionIndex() >= 0);
     340            updateEnabledState();
    354341        }
    355342    }
  • trunk/src/org/openstreetmap/josm/gui/history/HistoryLoadTask.java

    r2181 r2239  
    88import java.util.Collection;
    99import java.util.HashMap;
    10 import java.util.Iterator;
    1110import java.util.Map;
    1211
    13 import org.openstreetmap.josm.Main;
    1412import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1513import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
Note: See TracChangeset for help on using the changeset viewer.