Index: trunk/src/org/openstreetmap/josm/gui/preferences/projection/CodeProjectionChoice.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/projection/CodeProjectionChoice.java	(revision 13513)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/projection/CodeProjectionChoice.java	(revision 13515)
@@ -17,12 +17,12 @@
 import java.util.regex.Pattern;
 
-import javax.swing.AbstractListModel;
-import javax.swing.JList;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
+import javax.swing.JTable;
 import javax.swing.event.DocumentEvent;
 import javax.swing.event.DocumentListener;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
+import javax.swing.table.AbstractTableModel;
 
 import org.openstreetmap.josm.data.projection.Projection;
@@ -33,4 +33,5 @@
 /**
  * Projection choice that lists all known projects by code.
+ * @since 5634
  */
 public class CodeProjectionChoice extends AbstractProjectionChoice implements SubPrefsOptions {
@@ -47,7 +48,7 @@
     private static class CodeSelectionPanel extends JPanel implements ListSelectionListener, DocumentListener {
 
-        public final JosmTextField filter = new JosmTextField(30);
-        private final ProjectionCodeListModel model = new ProjectionCodeListModel();
-        public JList<String> selectionList;
+        private final JosmTextField filter = new JosmTextField(30);
+        private final ProjectionCodeModel model = new ProjectionCodeModel();
+        private JTable table;
         private final List<String> data;
         private final List<String> filteredData;
@@ -63,5 +64,5 @@
             build();
             setCode(initialCode != null ? initialCode : DEFAULT_CODE);
-            selectionList.addListSelectionListener(this);
+            table.getSelectionModel().addListSelectionListener(this);
         }
 
@@ -69,42 +70,57 @@
          * List model for the filtered view on the list of all codes.
          */
-        private class ProjectionCodeListModel extends AbstractListModel<String> {
-            @Override
-            public int getSize() {
+        private class ProjectionCodeModel extends AbstractTableModel {
+            @Override
+            public int getRowCount() {
                 return filteredData.size();
             }
 
             @Override
-            public String getElementAt(int index) {
-                if (index >= 0 && index < filteredData.size())
-                    return filteredData.get(index);
-                else
-                    return null;
-            }
-
-            public void fireContentsChanged() {
-                fireContentsChanged(this, 0, this.getSize()-1);
+            public String getValueAt(int index, int column) {
+                if (index >= 0 && index < filteredData.size()) {
+                    String code = filteredData.get(index);
+                    switch (column) {
+                        case 0: return code;
+                        case 1: return Projections.getProjectionByCode(code).toString();
+                        default: break;
+                    }
+                }
+                return null;
+            }
+
+            @Override
+            public int getColumnCount() {
+                return 2;
+            }
+
+            @Override
+            public String getColumnName(int column) {
+                switch (column) {
+                    case 0: return tr("Projection code");
+                    case 1: return tr("Projection name");
+                    default: return super.getColumnName(column);
+                }
             }
         }
 
         private void build() {
-            filter.setColumns(10);
+            filter.setColumns(40);
             filter.getDocument().addDocumentListener(this);
 
-            selectionList = new JList<>(data.toArray(new String[0]));
-            selectionList.setModel(model);
-            JScrollPane scroll = new JScrollPane(selectionList);
+            table = new JTable(model);
+            table.setAutoCreateRowSorter(true);
+            JScrollPane scroll = new JScrollPane(table);
             scroll.setPreferredSize(new Dimension(200, 214));
 
             this.setLayout(new GridBagLayout());
             this.add(filter, GBC.eol().weight(1.0, 0.0));
-            this.add(scroll, GBC.eol());
+            this.add(scroll, GBC.eol().fill(GBC.HORIZONTAL));
         }
 
         public String getCode() {
-            int idx = selectionList.getSelectedIndex();
+            int idx = table.getSelectedRow();
             if (idx == -1)
                 return lastCode;
-            return filteredData.get(selectionList.getSelectedIndex());
+            return filteredData.get(table.convertRowIndexToModel(table.getSelectedRow()));
         }
 
@@ -112,7 +128,15 @@
             int idx = filteredData.indexOf(code);
             if (idx != -1) {
-                selectionList.setSelectedIndex(idx);
-                selectionList.ensureIndexIsVisible(idx);
-            }
+                selectRow(idx);
+            }
+        }
+
+        private void selectRow(int idx) {
+            table.setRowSelectionInterval(idx, idx);
+            ensureRowIsVisible(idx);
+        }
+
+        private void ensureRowIsVisible(int idx) {
+            table.scrollRectToVisible(table.getCellRect(idx, 0, true));
         }
 
@@ -142,18 +166,18 @@
             String filterTxt = filter.getText().trim().toLowerCase(Locale.ENGLISH);
             for (String code : data) {
-                if (code.toLowerCase(Locale.ENGLISH).contains(filterTxt)) {
+                if (code.toLowerCase(Locale.ENGLISH).contains(filterTxt)
+                 || Projections.getProjectionByCode(code).toString().toLowerCase(Locale.ENGLISH).contains(filterTxt)) {
                     filteredData.add(code);
                 }
             }
-            model.fireContentsChanged();
+            model.fireTableDataChanged();
             int idx = filteredData.indexOf(lastCode);
             if (idx == -1) {
-                selectionList.clearSelection();
-                if (selectionList.getModel().getSize() > 0) {
-                    selectionList.ensureIndexIsVisible(0);
+                table.clearSelection();
+                if (table.getModel().getRowCount() > 0) {
+                    ensureRowIsVisible(0);
                 }
             } else {
-                selectionList.setSelectedIndex(idx);
-                selectionList.ensureIndexIsVisible(idx);
+                selectRow(idx);
             }
         }
