Ticket #9827: ticket9827_2014-04-05_16:53:56_+0200.patch

File ticket9827_2014-04-05_16:53:56_+0200.patch, 5.0 KB (added by Balaitous, 11 years ago)
  • src/org/openstreetmap/josm/gui/layer/gpx/ChooseTrackVisibilityAction.java

    diff --git src/org/openstreetmap/josm/gui/layer/gpx/ChooseTrackVisibilityAction.java src/org/openstreetmap/josm/gui/layer/gpx/ChooseTrackVisibilityAction.java
    index 3468e9d..a9abe02 100644
    import java.awt.event.MouseAdapter;  
    1313import java.awt.event.MouseEvent;
    1414import java.awt.event.MouseListener;
    1515import java.util.Arrays;
     16import java.util.Comparator;
    1617import java.util.Map;
    1718
    1819import javax.swing.AbstractAction;
    import javax.swing.JToggleButton;  
    2526import javax.swing.ListSelectionModel;
    2627import javax.swing.event.ListSelectionEvent;
    2728import javax.swing.event.ListSelectionListener;
     29import javax.swing.table.DefaultTableModel;
    2830import javax.swing.table.TableCellRenderer;
     31import javax.swing.table.TableRowSorter;
    2932
    3033import org.openstreetmap.josm.Main;
    3134import org.openstreetmap.josm.data.gpx.GpxTrack;
    public class ChooseTrackVisibilityAction extends AbstractAction {  
    5861    }
    5962
    6063    /**
     64     * Class to format a length according to SystemOfMesurement.
     65     */
     66    private final class TrackLength {
     67        private double value;
     68        private String displayString;
     69
     70        /**
     71         * Create a TrackLength object with a given length
     72         * @param value length of the track
     73         */
     74        TrackLength(double value) {
     75            this.value = value;
     76            this.displayString = NavigatableComponent.getSystemOfMeasurement().getDistText(value);
     77        }
     78
     79        /**
     80         * Provide string representation
     81         * @return String representation depending of SystemOfMeasurement
     82         */
     83        @Override
     84        public String toString() {
     85            return this.displayString;
     86        }
     87    }
     88
     89    /**
     90     * Comparator for TrackLength objects
     91     */
     92    private final class LengthContentComparator implements Comparator<TrackLength> {
     93
     94        /**
     95         * Compare 2 TrackLength objects relative to the real length
     96         */
     97        @Override
     98        public int compare(TrackLength l0, TrackLength l1) {
     99            if(l0.value < l1.value)
     100                return -1;
     101            else if(l0.value > l1.value)
     102                return 1;
     103            return 0;
     104        }
     105    }
     106
     107    /**
    61108     * gathers all available data for the tracks and returns them as array of arrays
    62109     * in the expected column order  */
    63110    private Object[][] buildTableContents() {
    public class ChooseTrackVisibilityAction extends AbstractAction {  
    68115            String name = (String) (attr.containsKey("name") ? attr.get("name") : "");
    69116            String desc = (String) (attr.containsKey("desc") ? attr.get("desc") : "");
    70117            String time = GpxLayer.getTimespanForTrack(trk);
    71             String length = NavigatableComponent.getSystemOfMeasurement().getDistText(trk.length());
     118            TrackLength length = new TrackLength(trk.length());
    72119            String url = (String) (attr.containsKey("url") ? attr.get("url") : "");
    73             tracks[i] = new String[]{name, desc, time, length, url};
     120            tracks[i] = new Object[]{name, desc, time, length, url};
    74121            i++;
    75122        }
    76123        return tracks;
    public class ChooseTrackVisibilityAction extends AbstractAction {  
    81128     * The table will fill its parent. */
    82129    private JTable buildTable(Object[][] content) {
    83130        final String[] headers = {tr("Name"), tr("Description"), tr("Timespan"), tr("Length"), tr("URL")};
    84         final JTable t = new JTable(content, headers) {
     131        DefaultTableModel model = new DefaultTableModel(content, headers);
     132        final JTable t = new JTable(model) {
    85133            @Override
    86134            public Component prepareRenderer(TableCellRenderer renderer, int row, int col) {
    87135                Component c = super.prepareRenderer(renderer, row, col);
    88136                if (c instanceof JComponent) {
    89137                    JComponent jc = (JComponent) c;
    90                     jc.setToolTipText((String) getValueAt(row, col));
     138                    jc.setToolTipText(getValueAt(row, col).toString());
    91139                }
    92140                return c;
    93141            }
    public class ChooseTrackVisibilityAction extends AbstractAction {  
    97145                return false;
    98146            }
    99147        };
     148        // define how to sort row
     149        TableRowSorter<DefaultTableModel> rowSorter = new TableRowSorter<DefaultTableModel>();
     150        t.setRowSorter(rowSorter);
     151        rowSorter.setModel(model);
     152        rowSorter.setComparator(3, new LengthContentComparator());
    100153        // default column widths
    101154        t.getColumnModel().getColumn(0).setPreferredWidth(220);
    102155        t.getColumnModel().getColumn(1).setPreferredWidth(300);
    public class ChooseTrackVisibilityAction extends AbstractAction {  
    123176                OpenBrowser.displayUrl(url);
    124177            }
    125178        };
    126         t.setAutoCreateRowSorter(true);
    127179        t.addMouseListener(urlOpener);
    128180        t.setFillsViewportHeight(true);
    129181        return t;