Changeset 783 in josm for trunk


Ignore:
Timestamp:
2008-08-15T20:26:17+02:00 (16 years ago)
Author:
stoecker
Message:

added sorting to RelationEditor (click title to do so). Patch bei Jürgen Buchner

File:
1 edited

Legend:

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

    r765 r783  
    11package org.openstreetmap.josm.gui.dialogs;
    22
     3import static org.openstreetmap.josm.tools.I18n.marktr;
    34import static org.openstreetmap.josm.tools.I18n.tr;
    4 import static org.openstreetmap.josm.tools.I18n.marktr;
    55
    66import java.awt.BorderLayout;
     
    1414import java.beans.PropertyChangeListener;
    1515import java.io.IOException;
     16import java.text.Collator;
    1617import java.util.ArrayList;
     18import java.util.Comparator;
    1719import java.util.Map.Entry;
    1820
    1921import javax.swing.JButton;
    20 import javax.swing.JDialog;
    2122import javax.swing.JFrame;
    2223import javax.swing.JLabel;
     
    3031import javax.swing.event.TableModelListener;
    3132import javax.swing.table.DefaultTableModel;
     33import javax.swing.table.TableRowSorter;
    3234
    3335import org.openstreetmap.josm.Main;
     
    4648import org.xml.sax.SAXException;
    4749
     50
    4851/**
    4952 * This dialog is for editing relations.
     
    5962public class RelationEditor extends JFrame {
    6063
     64       
     65       
    6166        /**
    6267         * The relation that this editor is working on, and the clone made for
     
    96101        private final JTable propertyTable = new JTable(propertyData);
    97102        private final JTable memberTable = new JTable(memberData);
     103       
     104        /**
     105         * Collator for sorting the roles and entries of the member table.
     106         */
     107        private static final Collator collator;
     108        static {
     109                collator = Collator.getInstance();
     110                collator.setStrength(Collator.PRIMARY);
     111        }
     112       
     113        /**
     114         * Comparator for member roles. Tries to sort even roles like "stop_nn" correct.
     115         */
     116        private final Comparator<String> memberRoleComp = new Comparator<String>() {
     117                public int compare(String s1, String s2) {
     118
     119                        int last1 = s1.lastIndexOf('_');
     120                        if (last1 > 0) {
     121                                int last2 = s2.lastIndexOf('_');
     122                                if (last2 == last1) {
     123                                        String prefix1 = s1.substring(0, last1);
     124                                        String prefix2 = s2.substring(0, last2);
     125
     126                                        if (prefix1.equalsIgnoreCase(prefix2)) {
     127                                                // Both roles have the same prefix, now determine the suffix.
     128                                                String suffix1 = s1.substring(last1+1, s1.length());
     129                                                String suffix2 = s2.substring(last2+1, s2.length());
     130
     131                                                if (suffix1.matches("\\d+") && suffix2.matches("\\d+")) {
     132                                                        // Suffix is an number -> compare it.
     133                                                        int i1 = Integer.parseInt(suffix1);
     134                                                        int i2 = Integer.parseInt(suffix2);
     135
     136                                                        return i1 - i2;
     137                                                }
     138                                        }
     139                                }
     140                        }
     141                       
     142                        // Default handling if the role name is nothing like "stop_xx"
     143                        return collator.compare(s1, s2);
     144
     145                }
     146        };
     147       
     148        /**
     149         * Comparator for the member names.
     150         */
     151        private final Comparator<OsmPrimitive> memberValueComp = new Comparator<OsmPrimitive>() {
     152                public int compare(OsmPrimitive o1, OsmPrimitive o2) {
     153                    return collator.compare(o1.getName(), o2.getName());
     154                }
     155        };
     156       
     157        private final TableRowSorter<DefaultTableModel> memberSorter = new TableRowSorter<DefaultTableModel>(memberData);
    98158       
    99159        /**
     
    163223                propertyData.setColumnIdentifiers(new String[]{tr("Key"),tr("Value")});
    164224                propertyTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
     225
    165226                propertyData.addTableModelListener(new TableModelListener() {
    166227                        public void tableChanged(TableModelEvent tme) {
     
    186247                memberData.setColumnIdentifiers(new String[]{tr("Role"),tr("Occupied By")});
    187248                memberTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
     249               
    188250                memberTable.getColumnModel().getColumn(1).setCellRenderer(new OsmPrimitivRenderer());
     251               
     252                memberSorter.setComparator(0, memberRoleComp);
     253                memberSorter.setComparator(1, memberValueComp);         
     254                memberTable.setRowSorter(memberSorter);
     255
    189256                /*
    190257                memberTable.getColumnModel().getColumn(1).setCellRenderer(new DefaultTableCellRenderer() {
Note: See TracChangeset for help on using the changeset viewer.