Index: applications/editors/josm/plugins/relcontext/TODO
===================================================================
--- applications/editors/josm/plugins/relcontext/TODO	(revision 25687)
+++ applications/editors/josm/plugins/relcontext/TODO	(revision 25688)
@@ -1,7 +1,5 @@
-- Choose less pompous and more suitable name for the plugin
+- Create plugin icon
 - Store all settings in preferences
-- Highlight chosen relation in relations list
 - Fix everything to work with multiple [editor] layers
-- "Add members" should search for connecting nodes among already present members
 - Create multipolygon settings button ">"
 - After creating multipolygon, move tags from outer to relation (setting "tags")
@@ -12,4 +10,7 @@
 == BETA ==
 
+- Analyze chosen relation and display corresponding symbol next to its name
+- Make chosen relation name pretty
+- "Add members" should search for connecting nodes among already present members
 - Implement algorithm to construct rings from selection
 - Classify those rings (inner/outer) based on node tracing
Index: applications/editors/josm/plugins/relcontext/build.xml
===================================================================
--- applications/editors/josm/plugins/relcontext/build.xml	(revision 25687)
+++ applications/editors/josm/plugins/relcontext/build.xml	(revision 25688)
@@ -28,8 +28,8 @@
 **
 -->
-<project name="RelContext" default="dist" basedir=".">
+<project name="reltoolbox" default="dist" basedir=".">
 
     <!-- enter the SVN commit message -->
-    <property name="commit.message" value="RelContext" />
+    <property name="commit.message" value="RelToolbox" />
     <!-- enter the *lowest* JOSM version this plugin is currently compatible with -->
     <property name="plugin.main.version" value="3835" />
@@ -99,8 +99,8 @@
                 <attribute name="Plugin-Class" value="relcontext.RelContextPlugin"/>
                 <attribute name="Plugin-Date" value="${version.entry.commit.date}"/>
-                <attribute name="Plugin-Description" value="Advanced relation editing panel."/>
-                <attribute name="ru_Plugin-Description" value="Нечеловечески прекрасная панель редактирования отношений."/>
-                <attribute name="Plugin-Icon" value="images/relcontext.png"/>
-                <attribute name="Plugin-Link" value="http://google.com/"/>
+                <attribute name="Plugin-Description" value="Relation and multipolygon creating and editing panel."/>
+                <attribute name="ru_Plugin-Description" value="Панель создания и редактирования отношений, особенно мультиполигонов."/>
+                <attribute name="Plugin-Icon" value="images/reltoolbox.png"/>
+                <!--attribute name="Plugin-Link" value="http://josm.openstreetmap.de/"/-->
                 <attribute name="Plugin-Mainversion" value="${plugin.main.version}"/>
                 <attribute name="Plugin-Version" value="${version.entry.commit.revision}"/>
Index: applications/editors/josm/plugins/relcontext/src/relcontext/ChosenRelationComponent.java
===================================================================
--- applications/editors/josm/plugins/relcontext/src/relcontext/ChosenRelationComponent.java	(revision 25687)
+++ applications/editors/josm/plugins/relcontext/src/relcontext/ChosenRelationComponent.java	(revision 25688)
@@ -1,5 +1,8 @@
 package relcontext;
 
+import java.awt.Color;
 import javax.swing.JLabel;
+import javax.swing.border.BevelBorder;
+import javax.swing.border.LineBorder;
 import org.openstreetmap.josm.data.osm.Relation;
 
@@ -17,4 +20,7 @@
     public ChosenRelationComponent(ChosenRelation rel) {
         super("");
+/*        setBackground(Color.white);
+        setOpaque(true);
+        setBorder(new LineBorder(Color.black, 1, true));*/
         this.chRel = rel;
         rel.addChosenRelationListener(this);
Index: applications/editors/josm/plugins/relcontext/src/relcontext/RelContextDialog.java
===================================================================
--- applications/editors/josm/plugins/relcontext/src/relcontext/RelContextDialog.java	(revision 25687)
+++ applications/editors/josm/plugins/relcontext/src/relcontext/RelContextDialog.java	(revision 25688)
@@ -1,4 +1,5 @@
 package relcontext;
 
+import java.awt.Component;
 import java.awt.Dimension;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -14,10 +15,11 @@
 
 import java.awt.BorderLayout;
+import java.awt.Color;
 import java.awt.Dialog.ModalityType;
-import java.awt.FlowLayout;
 import java.awt.GridBagLayout;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 import javax.swing.event.ListSelectionListener;
+import javax.swing.table.DefaultTableCellRenderer;
 
 import org.openstreetmap.josm.Main;
@@ -37,5 +39,4 @@
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.command.ChangeCommand;
-import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingComboBox;
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionListItem;
@@ -58,10 +59,8 @@
 
     public RelContextDialog() {
-        super(tr("Advanced Relation Editor"), "icon_relcontext",
-                tr("Opens advanced relation/multipolygon editor panel"),
-                Shortcut.registerShortcut("view:relcontext", tr("Toggle: {0}", tr("Open Relation Editor")),
+        super(tr("Relation Toolbox"), "reltoolbox",
+                tr("Open relation/multipolygon editor panel"),
+                Shortcut.registerShortcut("subwindow:reltoolbox", tr("Toggle: {0}", tr("Relation Toolbox")),
                 KeyEvent.VK_R, Shortcut.GROUP_LAYER, Shortcut.SHIFT_DEFAULT), 150, true);
-
-        // todo: shrink all panels to ~20 pixels
 
         JPanel rcPanel = new JPanel(new BorderLayout());
@@ -166,4 +165,6 @@
     }
 
+    private static final Color CHOSEN_RELATION_COLOR = new Color(255, 255, 128);
+
     private void configureRelationsTable( final JTable relationsTable ) {
         relationsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
@@ -174,4 +175,26 @@
             protected String getComponentToolTipText( OsmPrimitive value ) {
                 return null;
+            }
+
+            @Override
+            public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column ) {
+                Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
+                if( !isSelected && value instanceof Relation && chosenRelation.get() != null && value.equals(chosenRelation.get()) )
+                    c.setBackground(CHOSEN_RELATION_COLOR);
+                else
+                    c.setBackground(table.getBackground());
+                return c;
+            }
+
+        });
+        columns.getColumn(1).setCellRenderer(new DefaultTableCellRenderer() {
+            @Override
+            public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column ) {
+                Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
+                if( !isSelected && chosenRelation.get() != null && table.getValueAt(row, 0).equals(chosenRelation.get()) )
+                    c.setBackground(CHOSEN_RELATION_COLOR);
+                else
+                    c.setBackground(table.getBackground());
+                return c;
             }
         });
@@ -307,4 +330,6 @@
         possibleRoles.put("tunnel", new String[] {"through", "outline", "edge"});
         possibleRoles.put("surveillance", new String[] {"camera", "extent", "visible", "hidden"});
+        possibleRoles.put("street", new String[] {"street", "address", "house", "associated"});
+        possibleRoles.put("collection", new String[] {"member", "street", "river", "railway", "address", "associated"});
     }
 
@@ -341,6 +366,9 @@
         final AutoCompletingComboBox role = new AutoCompletingComboBox();
         List<AutoCompletionListItem> items = new ArrayList<AutoCompletionListItem>();
-        for( int i = 0; i < roleBox.getModel().getSize(); i++ )
-            items.add((AutoCompletionListItem)roleBox.getModel().getElementAt(i));
+        for( int i = 0; i < roleBox.getModel().getSize(); i++ ) {
+            final AutoCompletionListItem item = (AutoCompletionListItem)roleBox.getModel().getElementAt(i);
+            if( item.getValue().length() > 1 )
+                items.add(item);
+        }
         role.setPossibleACItems(items);
         role.setEditable(true);
Index: applications/editors/josm/plugins/relcontext/src/relcontext/actions/AddRemoveMemberAction.java
===================================================================
--- applications/editors/josm/plugins/relcontext/src/relcontext/actions/AddRemoveMemberAction.java	(revision 25687)
+++ applications/editors/josm/plugins/relcontext/src/relcontext/actions/AddRemoveMemberAction.java	(revision 25688)
@@ -8,6 +8,9 @@
 import org.openstreetmap.josm.actions.JosmAction;
 import org.openstreetmap.josm.command.ChangeCommand;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.RelationMember;
+import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.tools.ImageProvider;
 import relcontext.ChosenRelation;
@@ -47,9 +50,35 @@
         // 2. add all new members
         for( OsmPrimitive p : toAdd ) {
-            r.addMember(new RelationMember("", p));
+            int pos = -1; //p instanceof Way ? findAdjacentMember(p, r) : -1;
+            if( pos < 0 )
+                r.addMember(new RelationMember("", p));
+            else
+                r.addMember(pos, new RelationMember("", p));
         }
 
         if( !r.getMemberPrimitives().equals(rel.get().getMemberPrimitives()) )
             Main.main.undoRedo.add(new ChangeCommand(rel.get(), r));
+    }
+
+    /**
+     * Finds two relation members between which to place given way. Incomplete.
+     * @see org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel#determineDirection
+     */
+    protected int findAdjacentMember( Way w, Relation r ) {
+        Node firstNode = w.firstNode();
+        Node lastNode = w.lastNode();
+
+        if( firstNode != null && !firstNode.equals(lastNode) ) {
+            for( int i = 0; i < r.getMembersCount(); i++ ) {
+                if( r.getMember(i).getType().equals(OsmPrimitiveType.WAY) ) {
+                    Way rw = (Way)r.getMember(i).getMember();
+                    Node firstNodeR = rw.firstNode();
+                    Node lastNodeR = rw.lastNode();
+                    if( firstNode.equals(firstNodeR) || firstNode.equals(lastNodeR) || lastNode.equals(firstNodeR) || lastNode.equals(lastNodeR) )
+                        return i + 1;
+                }
+            }
+        }
+        return -1;
     }
 
Index: applications/editors/josm/plugins/relcontext/src/relcontext/actions/CreateRelationAction.java
===================================================================
--- applications/editors/josm/plugins/relcontext/src/relcontext/actions/CreateRelationAction.java	(revision 25687)
+++ applications/editors/josm/plugins/relcontext/src/relcontext/actions/CreateRelationAction.java	(revision 25688)
@@ -79,5 +79,5 @@
     private static final List<String> RELATION_TYPES = Arrays.asList(new String[] {
         "multipolygon", "boundary", "route", "site", "restriction", "associatedStreet", "public_transport",
-        "street", "collection", "address", "enforcement", "destination_sign", "route_master", "junction", "site",
+        "street", "collection", "address", "enforcement", "destination_sign", "route_master", "junction",
         "waterway", "bridge", "tunnel", "surveillance"
     });
Index: applications/editors/josm/plugins/relcontext/src/relcontext/actions/SortAndFixAction.java
===================================================================
--- applications/editors/josm/plugins/relcontext/src/relcontext/actions/SortAndFixAction.java	(revision 25687)
+++ applications/editors/josm/plugins/relcontext/src/relcontext/actions/SortAndFixAction.java	(revision 25688)
@@ -8,6 +8,4 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.command.ChangeCommand;
-import org.openstreetmap.josm.command.Command;
-import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.osm.*;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -31,23 +29,39 @@
         if( rel.get() == null ) return;
         Relation r = rel.get();
-        List<Command> commands = new ArrayList<Command>();
+        boolean fixed = false;
         // todo: sort members
         // todo: set roles for multipolygon members
-        Relation fixed = fixMultipolygonRoles(rel.get());
-        if( fixed != null ) {
-            commands.add(new ChangeCommand(r, fixed));
-            r = fixed;
+        Relation rr = fixMultipolygonRoles(r);
+        if( rr != null ) {
+            r = rr;
+            fixed = true;
         }
         // todo: set roles for boundary members
+        rr= fixBoundaryRoles(r);
+        if( rr != null ) {
+            r = rr;
+            fixed = true;
+        }
 
-        if( !commands.isEmpty() )
-            Main.main.undoRedo.add(new SequenceCommand(tr("Sort and fix relation"), commands));
+        if( fixed )
+            Main.main.undoRedo.add(new ChangeCommand(rel.get(), r));
     }
 
     public void chosenRelationChanged( Relation oldRelation, Relation newRelation ) {
-        setEnabled(newRelation != null && areMultipolygonTagsEmpty());
-        // todo: enable when needs fixing (empty roles or not ordered members)
+        setEnabled(newRelation != null && !isIncomplete(newRelation) && (areMultipolygonTagsEmpty() || areBoundaryTagsNotRight()));
     }
 
+    protected boolean isIncomplete( Relation r ) {
+        if( r == null || r.isIncomplete() || r.isDeleted() )
+            return true;
+        for( RelationMember m : r.getMembers())
+            if( m.getMember().isIncomplete() )
+                return true;
+        return false;
+    }
+
+    /**
+     * Check for ways that have roles different from "outer" and "inner".
+     */
     private boolean areMultipolygonTagsEmpty() {
         Relation r = rel == null ? null : rel.get();
@@ -56,4 +70,20 @@
         for( RelationMember m : r.getMembers() ) {
             if( m.getType().equals(OsmPrimitiveType.WAY) && (m.getRole() == null || (!m.getRole().equals("outer") && !m.getRole().equals("inner"))) )
+                return true;
+        }
+        return false;
+    }
+
+    /**
+     * Check for nodes and relations without needed roles.
+     */
+    private boolean areBoundaryTagsNotRight() {
+        Relation r = rel == null ? null : rel.get();
+        if( r == null || r.getMembersCount() == 0 || !r.hasKey("type") || !r.get("type").equals("boundary") )
+            return false;
+        for( RelationMember m : r.getMembers() ) {
+            if( m.getType().equals(OsmPrimitiveType.RELATION) && (m.getRole() == null || !m.getRole().equals("subarea")) )
+                return true;
+            else if(m.getType().equals(OsmPrimitiveType.NODE) && (m.getRole() == null || (!m.getRole().equals("label") && !m.getRole().equals("admin_centre"))) )
                 return true;
         }
@@ -88,7 +118,7 @@
             if( m.getType().equals(OsmPrimitiveType.WAY) ) {
                 String role = null;
-                if( outerWays.contains(m.getMember()) )
+                if( outerWays.contains((Way)m.getMember()) )
                     role = "outer";
-                else if( innerWays.contains(m.getMember()) )
+                else if( innerWays.contains((Way)m.getMember()) )
                     role = "inner";
                 if( role != null && !role.equals(m.getRole()) ) {
@@ -100,3 +130,28 @@
         return fixed ? r : null;
     }
+
+    private Relation fixBoundaryRoles( Relation source ) {
+        Relation r = new Relation(source);
+        boolean fixed = false;
+        for( int i = 0; i < r.getMembersCount(); i++ ) {
+            RelationMember m = r.getMember(i);
+            String role = null;
+            if( m.getType().equals(OsmPrimitiveType.RELATION) )
+                role = "subarea";
+            else if( m.getType().equals(OsmPrimitiveType.NODE) ) {
+                Node n = (Node)m.getMember();
+                if( !n.isIncomplete() ) {
+                    if( n.hasKey("place") )
+                        role = "admin_centre";
+                    else
+                        role = "label";
+                }
+            }
+            if( role != null && !role.equals(m.getRole()) ) {
+                r.setMember(i, new RelationMember(role, m.getMember()));
+                fixed = true;
+            }
+        }
+        return fixed ? r : null;
+    }
 }
