Changeset 5614 in josm for trunk/src


Ignore:
Timestamp:
2012-12-06T22:54:00+01:00 (11 years ago)
Author:
simon04
Message:

see #8255 - suggest roles when adding objects to a relation

Location:
trunk/src/org/openstreetmap/josm/gui
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PresetListPanel.java

    r5170 r5614  
    2121import org.openstreetmap.josm.data.osm.OsmPrimitive;
    2222import org.openstreetmap.josm.data.osm.Tag;
    23 import org.openstreetmap.josm.gui.preferences.map.TaggingPresetPreference;
    2423import org.openstreetmap.josm.gui.tagging.TaggingPreset;
    2524import org.openstreetmap.josm.gui.tagging.TaggingPreset.PresetType;
     
    8685        }
    8786
    88         for (TaggingPreset t : TaggingPresetPreference.taggingPresets) {
    89             if (!t.matches(types, tags, true)) {
    90                 continue;
    91             }
    92 
     87        for (TaggingPreset t : TaggingPreset.getMatchingPresets(types, tags, true)) {
    9388            JLabel lbl = new JLabel(t.getName() + " …");
    9489            lbl.setIcon((Icon) t.getValue(Action.SMALL_ICON));
  • trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java

    r5605 r5614  
    6262import org.openstreetmap.josm.gui.SideButton;
    6363import org.openstreetmap.josm.gui.HelpAwareOptionPane.ButtonSpec;
     64import org.openstreetmap.josm.gui.dialogs.properties.PresetListPanel;
    6465import org.openstreetmap.josm.gui.dialogs.properties.PresetListPanel.PresetHandler;
    6566import org.openstreetmap.josm.gui.help.ContextSensitiveHelpAction;
     
    115116                WindowGeometry.centerInWindow(Main.parent, new Dimension(700, 650)));
    116117
    117         // init the various models
    118         //
    119         memberTableModel = new MemberTableModel(getLayer());
    120         memberTableModel.register();
    121         selectionTableModel = new SelectionTableModel(getLayer());
    122         selectionTableModel.register();
    123         referrerModel = new ReferringRelationsBrowserModel(relation);
    124 
    125         tagEditorPanel = new TagEditorPanel(new PresetHandler() {
     118        final PresetHandler presetHandler = new PresetHandler() {
    126119
    127120            @Override
     
    136129                return Collections.<OsmPrimitive>singletonList(relation);
    137130            }
    138         });
     131        };
     132
     133        // init the various models
     134        //
     135        memberTableModel = new MemberTableModel(getLayer(), presetHandler);
     136        memberTableModel.register();
     137        selectionTableModel = new SelectionTableModel(getLayer());
     138        selectionTableModel.register();
     139        referrerModel = new ReferringRelationsBrowserModel(relation);
     140
     141        tagEditorPanel = new TagEditorPanel(presetHandler);
    139142
    140143        // populate the models
  • trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java

    r5603 r5614  
    1313import java.util.Collections;
    1414import java.util.Comparator;
     15import java.util.EnumSet;
    1516import java.util.HashMap;
    1617import java.util.HashSet;
     
    4647import org.openstreetmap.josm.data.osm.event.TagsChangedEvent;
    4748import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
     49import org.openstreetmap.josm.gui.dialogs.properties.PresetListPanel;
    4850import org.openstreetmap.josm.gui.dialogs.relation.WayConnectionType.Direction;
    4951import org.openstreetmap.josm.gui.layer.OsmDataLayer;
     52import org.openstreetmap.josm.gui.tagging.TaggingPreset;
    5053import org.openstreetmap.josm.gui.widgets.OsmPrimitivesTableModel;
    5154
     
    5962
    6063    private DefaultListSelectionModel listSelectionModel;
    61     private CopyOnWriteArrayList<IMemberModelListener> listeners;
    62     private OsmDataLayer layer;
     64    private final CopyOnWriteArrayList<IMemberModelListener> listeners;
     65    private final OsmDataLayer layer;
     66    private final PresetListPanel.PresetHandler presetHandler;
    6367
    6468    private final int UNCONNECTED = Integer.MIN_VALUE;
     
    7377     * constructor
    7478     */
    75     public MemberTableModel(OsmDataLayer layer) {
     79    public MemberTableModel(OsmDataLayer layer, PresetListPanel.PresetHandler presetHandler) {
    7680        members = new ArrayList<RelationMember>();
    7781        listeners = new CopyOnWriteArrayList<IMemberModelListener>();
    7882        this.layer = layer;
     83        this.presetHandler = presetHandler;
    7984        addTableModelListener(this);
    8085    }
     
    395400
    396401    private void addMembersAtIndex(List<? extends OsmPrimitive> primitives, int index) {
     402        final Collection<TaggingPreset> presets = TaggingPreset.getMatchingPresets(EnumSet.of(TaggingPreset.PresetType.RELATION), presetHandler.getSelection().iterator().next().getKeys(), false);
    397403        if (primitives == null)
    398404            return;
    399405        int idx = index;
    400406        for (OsmPrimitive primitive : primitives) {
    401             RelationMember member = new RelationMember("", primitive);
     407            final String role = presets.isEmpty() ? null : presets.iterator().next().suggestRoleForOsmPrimitive(primitive);
     408            RelationMember member = new RelationMember(role == null ? "" : role, primitive);
    402409            members.add(idx++, member);
    403410        }
  • trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java

    r5606 r5614  
    6767import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    6868import org.openstreetmap.josm.gui.preferences.SourceEntry;
     69import org.openstreetmap.josm.gui.preferences.map.TaggingPresetPreference;
    6970import org.openstreetmap.josm.gui.preferences.map.TaggingPresetPreference.PresetPrefHelper;
    7071import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField;
     
    7677import org.openstreetmap.josm.tools.GBC;
    7778import org.openstreetmap.josm.tools.ImageProvider;
     79import org.openstreetmap.josm.tools.Predicate;
    7880import org.openstreetmap.josm.tools.UrlLabel;
    7981import org.openstreetmap.josm.tools.Utils;
     
    10941096        public String text_context;
    10951097        public String locale_text;
     1098        public Match memberExpression;
    10961099
    10971100        public boolean required = false;
     
    11071110            } else if(!"optional".equals(str))
    11081111                throw new SAXException(tr("Unknown requisite: {0}", str));
     1112        }
     1113
     1114        public void setMember_expression(String member_expression) throws SAXException {
     1115            try {
     1116                this.memberExpression = SearchCompiler.compile(member_expression, true, true);
     1117            } catch (SearchCompiler.ParseError ex) {
     1118                throw new SAXException(tr("Illegal member expression: {0}", ex.getMessage()), ex);
     1119            }
    11091120        }
    11101121
     
    11581169    public static class Roles extends Item {
    11591170
    1160         public List<Role> roles = new LinkedList<Role>();
     1171        public final List<Role> roles = new LinkedList<Role>();
    11611172
    11621173        @Override
     
    12411252    public EnumSet<PresetType> types;
    12421253    public List<Item> data = new LinkedList<Item>();
     1254    public Roles roles;
    12431255    public TemplateEntry nameTemplate;
    12441256    public Match nameTemplateFilter;
     
    14281440                    if (o instanceof Roles) {
    14291441                        all.getLast().data.add((Item) o);
     1442                        if (all.getLast().roles != null) {
     1443                            throw new SAXException(tr("Roles cannot appear more than once"));
     1444                        }
     1445                        all.getLast().roles = (Roles) o;
    14301446                        lastrole = (Roles) o;
    14311447                    } else if (o instanceof Role) {
     
    15721588    }
    15731589
     1590    public String suggestRoleForOsmPrimitive(OsmPrimitive osm) {
     1591        if (roles == null) {
     1592            return null;
     1593        }
     1594        for (Role i : roles.roles) {
     1595            if (i.memberExpression != null && i.memberExpression.match(osm)) {
     1596                return i.key;
     1597            }
     1598        }
     1599        return null;
     1600    }
     1601
    15741602    public void actionPerformed(ActionEvent e) {
    15751603        if (Main.main == null) return;
     
    15901618                r.put(t.getKey(), t.getValue());
    15911619            }
    1592             for(OsmPrimitive osm : Main.main.getCurrentDataSet().getSelected()) {
    1593                 RelationMember rm = new RelationMember("", osm);
     1620            for (OsmPrimitive osm : Main.main.getCurrentDataSet().getSelected()) {
     1621                String role = suggestRoleForOsmPrimitive(osm);
     1622                RelationMember rm = new RelationMember(role == null ? "" : role, osm);
    15941623                r.addMember(rm);
    15951624                members.add(rm);
     
    17731802        return atLeastOnePositiveMatch;
    17741803    }
     1804
     1805    public static Collection<TaggingPreset> getMatchingPresets(final Collection<PresetType> t, final Map<String, String> tags, final boolean onlyShowable) {
     1806        return Utils.filter(TaggingPresetPreference.taggingPresets, new Predicate<TaggingPreset>() {
     1807            @Override
     1808            public boolean evaluate(TaggingPreset object) {
     1809                return object.matches(t, tags, onlyShowable);
     1810            }
     1811        });
     1812    }
    17751813}
Note: See TracChangeset for help on using the changeset viewer.