Index: trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 2486)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 2487)
@@ -12,5 +12,4 @@
 import java.awt.event.MouseEvent;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
@@ -18,4 +17,5 @@
 import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import javax.swing.AbstractAction;
@@ -33,5 +33,4 @@
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.DataSetListener;
 import org.openstreetmap.josm.data.osm.NameFormatter;
@@ -76,5 +75,4 @@
     private RelationDialogPopupMenu popupMenu;
 
-
     /**
      * constructor
@@ -129,4 +127,6 @@
 
         add(buttonPanel, BorderLayout.SOUTH);
+
+        // activate DEL in the list of relations
         displaylist.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0), "deleteRelation");
         displaylist.getActionMap().put("deleteRelation", deleteAction);
@@ -138,6 +138,8 @@
         Layer.listeners.add(this);
         Layer.listeners.add(newAction);
-        for (OsmDataLayer layer:Main.map.mapView.getLayersOfType(OsmDataLayer.class)) {
-            layer.data.addDataSetListener(this);
+        // Register as a data set listener for the current edit layer only.
+        // See also activeLayerChanged
+        if (Main.main.getEditLayer() != null) {
+            Main.main.getEditLayer().data.addDataSetListener(this);
         }
     }
@@ -146,4 +148,7 @@
         Layer.listeners.remove(this);
         Layer.listeners.remove(newAction);
+        Layer.listeners.add(newAction);
+        // unregistering from *all* data layer is somewhat overkill but it
+        // doesn't harm either.
         for (OsmDataLayer layer:Main.map.mapView.getLayersOfType(OsmDataLayer.class)) {
             layer.data.removeDataSetListener(this);
@@ -151,47 +156,19 @@
     }
 
-
-    protected int getNumRelations() {
-        if (Main.main.getCurrentDataSet() == null) return 0;
-        return Main.main.getCurrentDataSet().getRelations().size();
-    }
-
-    /**
-     * Replies the list of complete, non-deleted relations in the dataset <code>ds</code>,
-     * sorted by display name.
+    /**
+     * Initializes the relation list dialog from a layer. If <code>layer</code> is null
+     * or if it isn't an {@see OsmDataLayer} the dialog is reset to an empty dialog.
+     * Otherwise it is initialized with the list of non-deleted and visible relations
+     * in the layer's dataset.
      * 
-     * @param ds the dataset
-     * @return the list of relations
-     */
-    protected ArrayList<Relation> getDisplayedRelationsInSortOrder(DataSet ds) {
-        ArrayList<Relation> relations = new ArrayList<Relation>(ds.getRelations().size());
-        for (Relation r : ds.getRelations()) {
-            if (!r.isUsable() || !r.isVisible()) {
-                continue;
-            }
-            relations.add(r);
-        }
-
-        Collections.sort(
-                relations,
-                new Comparator<Relation>() {
-                    NameFormatter formatter = DefaultNameFormatter.getInstance();
-
-                    public int compare(Relation r1, Relation r2) {
-                        return r1.getDisplayName(formatter).compareTo(r2.getDisplayName(formatter));
-                    }
-                }
-        );
-        return relations;
-    }
-
-    public void updateList() {
-        if (Main.main.getCurrentDataSet() == null) {
+     * @param layer the layer. May be null.
+     */
+    protected void initFromLayer(Layer layer) {
+        if (layer == null || ! (layer instanceof OsmDataLayer)) {
             model.setRelations(null);
             return;
         }
-        Relation[] selected = getAllSelected();
-
-        model.setRelations(getDisplayedRelationsInSortOrder(Main.main.getCurrentDataSet()));
+        OsmDataLayer l = (OsmDataLayer)layer;
+        model.setRelations(l.data.getRelations());
         if(model.getSize() > 0) {
             setTitle(tr("Relations: {0}", model.getSize()));
@@ -199,31 +176,4 @@
             setTitle(tr("Relations"));
         }
-        selectRelations(selected);
-    }
-
-    public void activeLayerChange(Layer a, Layer b) {
-        updateList();
-    }
-
-    public void layerRemoved(Layer a) {
-        if (a instanceof OsmDataLayer) {
-            ((OsmDataLayer)a).data.removeDataSetListener(this);
-        }
-        updateList();
-    }
-
-    public void layerAdded(Layer a) {
-        if (a instanceof OsmDataLayer) {
-            ((OsmDataLayer)a).data.addDataSetListener(this);
-        }
-    }
-
-    /**
-     * Returns the currently selected relation, or null.
-     *
-     * @return the currently selected relation, or null
-     */
-    public Relation getCurrentRelation() {
-        return (Relation) displaylist.getSelectedValue();
     }
 
@@ -257,11 +207,4 @@
 
     /**
-     * @return All selected relations in the list, possibly empty List
-     */
-    private Relation[] getAllSelected() {
-        return Arrays.asList(displaylist.getSelectedValues()).toArray(new Relation[0]);
-    }
-
-    /**
      * Selects the relation <code>relation</code> in the list of relations.
      *
@@ -269,37 +212,9 @@
      */
     public void selectRelation(Relation relation) {
-        selectRelations(new Relation[] {relation});
-    }
-
-    /**
-     * Selects the relations <code>relations</code> in the list of relations.
-     *
-     * @param relations  the relations (may be empty)
-     */
-    public void selectRelations(Relation[] relations) {
-        List<Integer> sel = new ArrayList<Integer>();
-        for (Relation r : relations) {
-            if (r == null) {
-                continue;
-            }
-            int idx = model.getIndexOfRelation(r);
-            if (idx != -1) {
-                sel.add(idx);
-            }
-        }
-        if (sel.isEmpty()) {
-            displaylist.clearSelection();
-            return;
+        if (relation == null) {
+            model.setSelectedRelations(null);
         } else {
-            int fst = Collections.min(sel);
-            displaylist.scrollRectToVisible(displaylist.getCellBounds(fst, fst));
-        }
-
-        int[] aSel = new int[sel.size()];       //FIXME: how to cast Integer[] -> int[] ?
-        for (int i=0; i<sel.size(); ++i) {
-            aSel[i] = sel.get(i);
-        }
-
-        displaylist.setSelectedIndices(aSel);
+            model.setSelectedRelations(Collections.singletonList(relation));
+        }
     }
 
@@ -425,5 +340,5 @@
 
     /**
-     * The edit action
+     * The action for creating a new relation
      *
      */
@@ -437,5 +352,5 @@
 
         public void run() {
-            RelationEditor.getEditor(Main.map.mapView.getEditLayer(),null, null).setVisible(true);
+            RelationEditor.getEditor(Main.main.getEditLayer(),null, null).setVisible(true);
         }
 
@@ -557,5 +472,8 @@
     }
 
-
+    /**
+     * The action for downloading members of all selected relations
+     * 
+     */
     class DownloadMembersAction extends AbstractAction implements ListSelectionListener{
 
@@ -586,4 +504,9 @@
     }
 
+    /**
+     * The list model for the list of relations displayed in the relation list
+     * dialog.
+     *
+     */
     private static  class RelationListModel extends AbstractListModel {
         private ArrayList<Relation> relations;
@@ -598,10 +521,42 @@
         }
 
-        public void setRelations(ArrayList<Relation> relations) {
-            this.relations = relations;
+        public synchronized void setRelations(Collection<Relation> relations) {
+            if (relations == null) {
+                this.relations = null;
+            } else {
+                this.relations = new ArrayList<Relation>(relations.size());
+                for (Relation r: relations) {
+                    if (! r.isDeleted() && r.isVisible() && !r.incomplete) {
+                        this.relations.add(r);
+                    }
+                }
+            }
+            sort();
             fireIntervalAdded(this, 0, getSize());
-        }
-
-        public void addRelations(Collection<? extends OsmPrimitive> addedPrimitives) {
+            selectionModel.clearSelection();
+        }
+
+        public synchronized void sort() {
+            if (relations == null) return;
+            Collections.sort(
+                    relations,
+                    new Comparator<Relation>() {
+                        NameFormatter formatter = DefaultNameFormatter.getInstance();
+
+                        public int compare(Relation r1, Relation r2) {
+                            return r1.getDisplayName(formatter).compareTo(r2.getDisplayName(formatter));
+                        }
+                    }
+            );
+        }
+
+        /**
+         * Add all relations in <code>addedPrimitives</code> to the model for the
+         * relation list dialog
+         * 
+         * @param addedPrimitives the collection of added primitives. May include nodes,
+         * ways, and relations.
+         */
+        public synchronized void addRelations(Collection<? extends OsmPrimitive> addedPrimitives) {
             if (addedPrimitives == null || addedPrimitives.isEmpty()) return;
             boolean added = false;
@@ -617,5 +572,37 @@
             }
             if (added) {
+                List<Relation> sel = getSelectedRelations();
+                sort();
                 fireIntervalAdded(this, 0, getSize());
+                setSelectedRelations(sel);
+            }
+        }
+
+        /**
+         * Removes all relations in <code>removedPrimitives</code> from the model
+         * 
+         * @param removedPrimitives the removed primitives. May include nodes, ways,
+         *   and relations
+         */
+        public synchronized void removeRelations(Collection<? extends OsmPrimitive> removedPrimitives) {
+            if (removedPrimitives == null) return;
+            // extract the removed relations
+            //
+            Set<Relation> removedRelations = new HashSet<Relation>();
+            for (OsmPrimitive p: removedPrimitives) {
+                if (! (p instanceof Relation)) {
+                    continue;
+                }
+                removedRelations.add((Relation)p);
+            }
+            if (removedRelations.isEmpty())
+                return;
+            int size = relations.size();
+            relations.removeAll(removedRelations);
+            if (size != relations.size()) {
+                List<Relation> sel = getSelectedRelations();
+                sort();
+                fireContentsChanged(this, 0, getSize());
+                setSelectedRelations(sel);
             }
         }
@@ -672,8 +659,25 @@
             return ret;
         }
+
+        /**
+         * Sets the selected relations.
+         * 
+         * @return sel the list of selected relations
+         */
+        public synchronized void setSelectedRelations(List<Relation> sel) {
+            selectionModel.clearSelection();
+            if (sel == null || sel.isEmpty())
+                return;
+            for (Relation r: sel) {
+                int i = relations.indexOf(r);
+                if (i<0) {
+                    continue;
+                }
+                selectionModel.addSelectionInterval(i,i);
+            }
+        }
     }
 
     class RelationDialogPopupMenu extends JPopupMenu {
-
         protected void build() {
             // -- download members action
@@ -695,25 +699,89 @@
     }
 
-    public void nodeMoved(Node node) { }
-
-    public void wayNodesChanged(Way way) { }
-
-    public void primtivesAdded(Collection<? extends OsmPrimitive> added) {
-        model.addRelations(added);
-    }
-
-    public void primtivesRemoved(Collection<? extends OsmPrimitive> removed) {
-        updateList();
-    }
-
-    public void relationMembersChanged(Relation r) {
-        // trigger a repaint of the relation list
-        displaylist.repaint();
+    /* ---------------------------------------------------------------------------------- */
+    /* LayerChangeListener                                                                */
+    /* ---------------------------------------------------------------------------------- */
+    public void activeLayerChange(Layer a, Layer b) {
+        initFromLayer(b);
+        if (a != null && a instanceof OsmDataLayer) {
+            ((OsmDataLayer)a).data.removeDataSetListener(this);
+        }
+        if (b != null && b instanceof OsmDataLayer) {
+            ((OsmDataLayer)b).data.addDataSetListener(this);
+        }
+
+    }
+    public void layerRemoved(Layer a) {/* irrelevant in this context */}
+    public void layerAdded(Layer a) {/* irrelevant in this context */}
+
+
+    /* ---------------------------------------------------------------------------------- */
+    /* DataSetListener                                                                    */
+    /* ---------------------------------------------------------------------------------- */
+
+    public void nodeMoved(Node node) {/* irrelevant in this context */}
+
+    public void wayNodesChanged(Way way) {/* irrelevant in this context */}
+
+    public void primtivesAdded(final Collection<? extends OsmPrimitive> added) {
+        Runnable task = new Runnable() {
+            public void run() {
+                model.addRelations(added);
+            }
+        };
+        if (SwingUtilities.isEventDispatchThread()) {
+            task.run();
+        } else {
+            SwingUtilities.invokeLater(task);
+        }
+    }
+
+    public void primtivesRemoved(final Collection<? extends OsmPrimitive> removed) {
+        Runnable task = new Runnable() {
+            public void run() {
+                model.removeRelations(removed);
+            }
+        };
+        if (SwingUtilities.isEventDispatchThread()) {
+            task.run();
+        } else {
+            SwingUtilities.invokeLater(task);
+        }
+    }
+
+    public void relationMembersChanged(final Relation r) {
+        Runnable task = new Runnable() {
+            public void run() {
+                List<Relation> sel = model.getSelectedRelations();
+                model.sort();
+                model.setSelectedRelations(sel);
+                displaylist.repaint();
+            }
+        };
+        if (SwingUtilities.isEventDispatchThread()) {
+            task.run();
+        } else {
+            SwingUtilities.invokeLater(task);
+        }
     }
 
     public void tagsChanged(OsmPrimitive prim) {
-        if (prim instanceof Relation) {
-            // trigger a repaint of the relation list
-            displaylist.repaint();
+        if (prim == null || ! (prim instanceof Relation))
+            return;
+        Runnable task = new Runnable() {
+            public void run() {
+                // trigger a sort of the relation list because the display name may
+                // have changed
+                //
+                List<Relation> sel = model.getSelectedRelations();
+                model.sort();
+                model.setSelectedRelations(sel);
+                displaylist.repaint();
+            }
+        };
+        if (SwingUtilities.isEventDispatchThread()) {
+            task.run();
+        } else {
+            SwingUtilities.invokeLater(task);
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableColumnModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableColumnModel.java	(revision 2486)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableColumnModel.java	(revision 2487)
@@ -16,4 +16,5 @@
         col.setHeaderValue(tr("Role"));
         col.setResizable(true);
+        col.setPreferredWidth(100);
         col.setCellRenderer(new MemberTableRoleCellRenderer());
         col.setCellEditor(new MemberRoleCellEditor());
@@ -24,4 +25,5 @@
         col.setHeaderValue(tr("Refers to"));
         col.setResizable(true);
+        col.setPreferredWidth(300);
         // col.setCellRenderer(new OsmPrimitivRenderer());
         col.setCellRenderer(new MemberTableMemberCellRenderer());
@@ -30,6 +32,7 @@
         // column 2 -
         col = new TableColumn(2);
-        col.setHeaderValue(tr("Linked"));
-        col.setResizable(true);
+        col.setHeaderValue("");
+        col.setResizable(false);
+        col.setPreferredWidth(20);
         col.setCellRenderer(new MemberTableLinkedCellRenderer());
         addColumn(col);
