Changeset 783 in josm


Ignore:
Timestamp:
Aug 15, 2008 8:26:17 PM (5 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.