Index: applications/editors/josm/plugins/relcontext/TODO
===================================================================
--- applications/editors/josm/plugins/relcontext/TODO	(revision 25703)
+++ applications/editors/josm/plugins/relcontext/TODO	(revision 25704)
@@ -12,4 +12,6 @@
 - Solve width problem for narrows buttons when "fix" and "download" appear simultaneously
 - Sort relation members button (now it's just role fixer)
+- Show role panel only when relation members are selected
+- Rethink role panel. Maybe, replace chosen relation title with role combobox?
 
 == RELEASE ==
Index: applications/editors/josm/plugins/relcontext/src/relcontext/RelContextDialog.java
===================================================================
--- applications/editors/josm/plugins/relcontext/src/relcontext/RelContextDialog.java	(revision 25703)
+++ applications/editors/josm/plugins/relcontext/src/relcontext/RelContextDialog.java	(revision 25704)
@@ -66,5 +66,5 @@
     private MultipolygonSettingsPopup multiPopupMenu;
     private JLabel crRoleIndicator;
-    private AutoCompletingComboBox roleBox;
+    private RoleComboBoxModel roleBoxModel;
     private String lastSelectedRole;
 
@@ -111,6 +111,6 @@
         crRoleIndicator = new JLabel();
         rolePanel.add(crRoleIndicator, GBC.std().insets(5, 0, 5, 0));
-        roleBox = new AutoCompletingComboBox();
-        roleBox.setEditable(false);
+        roleBoxModel = new RoleComboBoxModel();
+        JComboBox roleBox = new JComboBox(roleBoxModel);
         rolePanel.add(roleBox, GBC.std().fill(GBC.HORIZONTAL));
         rolePanel.add(sizeButton(new JButton(new ApplyNewRoleAction()), 40, 20), GBC.std());
@@ -278,5 +278,5 @@
             selectionChanged(Main.main.getCurrentDataSet().getSelected());
         updateRoleIndicator();
-        updateRoleAutoCompletionList();
+        roleBoxModel.update();
         // ?
     }
@@ -306,4 +306,5 @@
             return;
         updateRoleIndicator();
+        roleBoxModel.update();
         // repopulate relations table
         relationsData.setRowCount(0);
@@ -383,43 +384,14 @@
     }
 
-    private void updateRoleAutoCompletionList() {
-        String currentRole = roleBox.getSelectedItem() == null ? null : ((AutoCompletionListItem)roleBox.getSelectedItem()).getValue();
-        List<String> items = new ArrayList<String>();
-        items.add(" ");
-        if( chosenRelation != null && chosenRelation.get() != null ) {
-            if( chosenRelation.isMultipolygon() ) {
-                items.add("outer");
-                items.add("inner");
-            }
-            if( chosenRelation.get().get("type") != null ) {
-                List<String> values = possibleRoles.get(chosenRelation.get().get("type"));
-                if( values != null )
-                    items.addAll(values);
-            }
-            for( RelationMember m : chosenRelation.get().getMembers() )
-                if( !items.contains(m.getRole()) )
-                    items.add(m.getRole());
-        }
-        if( currentRole != null && currentRole.length() > 1 ) {
-            lastSelectedRole = currentRole;
-            Main.pref.put(PREF_ROLEBOX + ".lastrole", lastSelectedRole);
-        }
-        roleBox.setPossibleItems(items);
-        if( lastSelectedRole != null && items.contains(lastSelectedRole) )
-            roleBox.setSelectedItem(lastSelectedRole);
-        // todo: do we really want empty role as default one? Maybe, store last selected role in preferences
-    }
-
     private String askForRoleName() {
         JPanel panel = new JPanel(new GridBagLayout());
 
+        List<String> items = new ArrayList<String>();
+        for( String role : roleBoxModel.getRoles() ) {
+            if( role.length() > 1 )
+                items.add(role);
+        }
         final AutoCompletingComboBox role = new AutoCompletingComboBox();
-        List<AutoCompletionListItem> items = new ArrayList<AutoCompletionListItem>();
-        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.setPossibleItems(items);
         role.setEditable(true);
 
@@ -514,5 +486,5 @@
         if( chosenRelation != null && chosenRelation.get() != null && Main.main.getCurrentDataSet() != null && !Main.main.getCurrentDataSet().selectionEmpty() ) {
             Collection<OsmPrimitive> selected = Main.main.getCurrentDataSet().getSelected();
-            Relation r = new Relation(chosenRelation.get());
+            Relation r = chosenRelation.get();
             List<Command> commands = new ArrayList<Command>();
             for( int i = 0; i < r.getMembersCount(); i++ ) {
@@ -520,5 +492,5 @@
                 if( selected.contains(m.getMember()) ) {
                     if( !role.equals(m.getRole()) ) {
-                        r.setMember(i, new RelationMember(role, m.getMember()));
+//                        r.setMember(i, new RelationMember(role, m.getMember()));
                         commands.add(new ChangeRelationMemberRoleCommand(r, i, role));
                     }
@@ -526,6 +498,6 @@
             }
             if( !commands.isEmpty() ) {
-                Main.main.undoRedo.add(new ChangeCommand(chosenRelation.get(), r));
-//                Main.main.undoRedo.add(new SequenceCommand(tr("Change relation member roles to {0}", role), commands));
+//                Main.main.undoRedo.add(new ChangeCommand(chosenRelation.get(), r));
+                Main.main.undoRedo.add(new SequenceCommand(tr("Change relation member roles to {0}", role), commands));
             }
         }
@@ -539,10 +511,7 @@
 
         public void actionPerformed( ActionEvent e ) {
-            Object selectedItem = roleBox == null ? null : roleBox.getSelectedItem();
-            if( selectedItem != null ) {
-                if( selectedItem instanceof AutoCompletionListItem )
-                    selectedItem = ((AutoCompletionListItem)selectedItem).getValue();
-                applyRoleToSelection(selectedItem.toString().trim());
-            }
+            String selectedRole = roleBoxModel.getSelectedRole();
+            if( selectedRole != null )
+                applyRoleToSelection(selectedRole.toString().trim());
         }
     }
@@ -617,3 +586,70 @@
         }
     }
+
+    private class RoleComboBoxModel extends AbstractListModel implements ComboBoxModel {
+        private List<String> roles = new ArrayList<String>();
+        private int selectedIndex = -1;
+
+        public RoleComboBoxModel() {
+            super();
+            update();
+        }
+
+        public void update() {
+            String currentRole = getSelectedRole();
+            List<String> items = new ArrayList<String>();
+            items.add(" ");
+            if( chosenRelation != null && chosenRelation.get() != null ) {
+                if( chosenRelation.isMultipolygon() ) {
+                    items.add("outer");
+                    items.add("inner");
+                }
+                if( chosenRelation.get().get("type") != null ) {
+                    List<String> values = possibleRoles.get(chosenRelation.get().get("type"));
+                    if( values != null )
+                        items.addAll(values);
+                }
+                for( RelationMember m : chosenRelation.get().getMembers() )
+                    if( !items.contains(m.getRole()) )
+                        items.add(m.getRole());
+            }
+            if( currentRole != null && currentRole.length() > 1 ) {
+                lastSelectedRole = currentRole;
+                Main.pref.put(PREF_ROLEBOX + ".lastrole", lastSelectedRole);
+            }
+            roles = Collections.unmodifiableList(items);
+            fireContentsChanged(this, 0, getSize());
+            if( lastSelectedRole != null && items.contains(lastSelectedRole) )
+                setSelectedItem(lastSelectedRole);
+            // todo: do we really want empty role as default one? Maybe, store last selected role in preferences
+        }
+
+        public List<String> getRoles() {
+            return roles;
+        }
+
+        public int getSize() {
+            return roles.size();
+        }
+
+        public Object getElementAt( int index ) {
+            return getRole(index);
+        }
+
+        public String getRole( int index ) {
+            return roles.get(index);
+        }
+
+        public void setSelectedItem( Object anItem ) {
+            selectedIndex = anItem == null ? -1 : roles.indexOf(anItem);
+        }
+
+        public Object getSelectedItem() {
+            return getSelectedRole();
+        }
+
+        public String getSelectedRole() {
+            return selectedIndex < 0 || selectedIndex >= getSize() ? null : getRole(selectedIndex);
+        }
+    }
 }
