

---

 core-dave/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java |   29 ++++------
 1 file changed, 12 insertions(+), 17 deletions(-)

diff -puN src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java~fix-multipolygon-selection src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java
--- core/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java~fix-multipolygon-selection	2009-10-28 17:32:55.000000000 -0700
+++ core-dave/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java	2009-10-28 18:25:19.000000000 -0700
@@ -390,9 +390,9 @@ public class MapPaintVisitor extends Sim
         displaySegments();
     }
 
-    public Collection<Way> joinWays(Collection<Way> join, OsmPrimitive errs)
+    public Way joinWays(Collection<Way> join, OsmPrimitive errs)
     {
-        Collection<Way> res = new LinkedList<Way>();
+        Way res = null;
         Object[] joinArray = join.toArray();
         int left = join.size();
         while(left != 0)
@@ -479,11 +479,7 @@ public class MapPaintVisitor extends Sim
             {
                 w = new Way(w);
                 w.setNodes(n);
-                if (selected) {
-                    data.addSelected(Collections.singleton(w),false /* don't notify listeners */);
-                } else {
-                    data.clearSelection(w);
-                }
+                // Do not mess with the DataSet's contents here.
             }
             if(!w.isClosed())
             {
@@ -493,7 +489,7 @@ public class MapPaintVisitor extends Sim
                             w.getDisplayName(DefaultNameFormatter.getInstance())), true);
                 }
             }
-            res.add(w);
+            res = w;
         } /* while(left != 0) */
 
         return res;
@@ -911,11 +907,14 @@ public class MapPaintVisitor extends Sim
         {
             Boolean zoomok = isZoomOk(wayStyle);
             Boolean visible = false;
+            Boolean outerSelected = false;
             Collection<Way> join = new LinkedList<Way>();
 
             drawn = true;
             for (Way w : outer)
             {
+                if (data.isSelected(w))
+                    outerSelected = true;
                 if(w.isClosed()) {
                     outerclosed.add(w);
                 } else {
@@ -924,9 +923,7 @@ public class MapPaintVisitor extends Sim
             }
             if(join.size() != 0)
             {
-                for(Way w : joinWays(join, incomplete ? null : r)) {
-                    outerclosed.add(w);
-                }
+                outerclosed.add(joinWays(join, incomplete ? null : r));
             }
 
             join.clear();
@@ -940,9 +937,7 @@ public class MapPaintVisitor extends Sim
             }
             if(join.size() != 0)
             {
-                for(Way w : joinWays(join, incomplete ? null : r)) {
-                    innerclosed.add(w);
-                }
+                innerclosed.add(joinWays(join, incomplete ? null : r));
             }
 
             if(outerclosed.size() == 0)
@@ -1061,8 +1056,8 @@ public class MapPaintVisitor extends Sim
                     Polygon p = pd.get();
                     if(isPolygonVisible(p))
                     {
-                        drawAreaPolygon(p, (data.isSelected(pd.way) || data.isSelected(r)) ? selectedColor
-                                : areaStyle.color);
+                        boolean selected = (data.isSelected(pd.way) || data.isSelected(r) || outerSelected);
+                        drawAreaPolygon(p, selected ? selectedColor : areaStyle.color);
                         visible = true;
                     }
                 }
@@ -1130,7 +1125,7 @@ public class MapPaintVisitor extends Sim
                         r.putError(tr("Style for outer way ''{0}'' mismatches.",
                                 wOuter.getDisplayName(DefaultNameFormatter.getInstance())), true);
                     }
-                    if(data.isSelected(r))
+                    if(data.isSelected(r) || outerSelected)
                     {
                         drawSelectedMember(wOuter, outerStyle, false, false);
                     }
_
