diff --git a/data/defaultpresets.xml b/data/defaultpresets.xml
index d798bac..a8d6251 100755
a
|
b
|
role: type to specify possible roles in relations
|
88 | 88 | requisite: optional/required (default is "optional") |
89 | 89 | count: how often can the role occur (if not given unlimited number is assumed) |
90 | 90 | type: the data types - way,node,relation,closedway (separated by comma) |
| 91 | member_expression: an expression (cf. search dialog) for objects of this role |
91 | 92 | |
92 | 93 | presets: For external files <presets> should have following attributes: |
93 | 94 | author: the author of the preset |
… |
… |
Note that for a match, at least one positive and no negative is required.
|
2446 | 2447 | <combo key="colour" text="Color (HTML name or hexadecimal code)" values_context="color" values="black,brown,green,red,blue,gray,white,#CD853F" /> |
2447 | 2448 | </optional> |
2448 | 2449 | <roles> |
2449 | | <role key="" text="route variant/direction (at least 2)" requisite="required" type="relation"/> <!-- FIXME: at least 2 members are required --> |
| 2450 | <role key="" text="route variant/direction (at least 2)" requisite="required" type="relation" member_expression="type=route"/> <!-- FIXME: at least 2 members are required --> |
2450 | 2451 | </roles> |
2451 | 2452 | </item> |
2452 | 2453 | <item name="Stop Area" type="relation" icon="presets/interpolation.png"> |
… |
… |
Note that for a match, at least one positive and no negative is required.
|
2463 | 2464 | <text key="network" text="Network"/> |
2464 | 2465 | </optional> |
2465 | 2466 | <roles> |
2466 | | <role key="stop" text="Stop Position" requisite="optional" type="node"/> |
2467 | | <role key="platform" text="Platform" requisite="optional" type="node,way,closedway"/> |
2468 | | <role key="" text="Station or amenities" requisite="optional" type="node,way,closedway"/> |
| 2467 | <role key="stop" text="Stop Position" requisite="optional" type="node" member_expression="public_transport=stop_position"/> |
| 2468 | <role key="platform" text="Platform" requisite="optional" type="node,way,closedway" member_expression="public_transport=platform"/> |
| 2469 | <role key="" text="Station or amenities" requisite="optional" type="node,way,closedway" member_expression="amenity|public_transport=station"/> |
2469 | 2470 | </roles> |
2470 | 2471 | </item> |
2471 | 2472 | <separator/> |
… |
… |
Note that for a match, at least one positive and no negative is required.
|
5905 | 5906 | <key key="type" value="associatedStreet" /> |
5906 | 5907 | <text key="name" text="Street name" /> |
5907 | 5908 | <roles> |
5908 | | <role key="street" text="street" requisite="required" type="way" /> |
5909 | | <role key="house" text="house" requisite="required" type="node,way,closedway,relation" /> |
| 5909 | <role key="street" text="street" requisite="required" type="way" member_expression="highway "addr:street"" /> |
| 5910 | <role key="house" text="house" requisite="required" type="node,way,closedway,relation" member_expression=""addr:housenumber"" /> |
5910 | 5911 | </roles> |
5911 | 5912 | </item> |
5912 | 5913 | <item name="Street" type="relation"> |
… |
… |
Note that for a match, at least one positive and no negative is required.
|
5962 | 5963 | <text key="wikipedia" text="Wikipedia" /> |
5963 | 5964 | </optional> |
5964 | 5965 | <roles> |
5965 | | <role key="" text="waterways (no riverbank)" requisite="optional" type="way" /> |
5966 | | <role key="main_stream" text="waterways (no riverbank)" requisite="optional" type="way" /> |
5967 | | <role key="side_stream" text="branch waterways (no riverbank)" requisite="optional" type="way" /> |
| 5966 | <role key="" text="waterways (no riverbank)" requisite="optional" type="way" member_expression="waterway -waterway:riverbank" /> |
| 5967 | <role key="main_stream" text="waterways (no riverbank)" requisite="optional" type="way" member_expression="waterway -waterway:riverbank" /> |
| 5968 | <role key="side_stream" text="branch waterways (no riverbank)" requisite="optional" type="way" member_expression="waterway -waterway:riverbank"/> |
5968 | 5969 | <role key="spring" text="spring of waterway" requisite="optional" type="node" /> |
5969 | 5970 | </roles> |
5970 | 5971 | </item> |
diff --git a/data/tagging-preset.xsd b/data/tagging-preset.xsd
index 72f84e4..6473e28 100644
a
|
b
|
|
231 | 231 | <attribute name="requisite" type="tns:role_requisite" /> |
232 | 232 | <attribute name="type" type="string" /> |
233 | 233 | <attribute name="count" type="integer" /> |
| 234 | <attribute name="member_expression" type="string" /> |
234 | 235 | </complexType> |
235 | 236 | |
236 | 237 | <simpleType name="role_requisite"> |
diff --git a/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java b/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java
index a68b4c6..c3435de 100644
a
|
b
|
public class TaggingPreset extends AbstractAction implements MapView.LayerChange
|
1093 | 1093 | public String text; |
1094 | 1094 | public String text_context; |
1095 | 1095 | public String locale_text; |
| 1096 | public Match memberExpression; |
1096 | 1097 | |
1097 | 1098 | public boolean required = false; |
1098 | 1099 | public long count = 0; |
… |
… |
public class TaggingPreset extends AbstractAction implements MapView.LayerChange
|
1108 | 1109 | throw new SAXException(tr("Unknown requisite: {0}", str)); |
1109 | 1110 | } |
1110 | 1111 | |
| 1112 | public void setMember_expression(String member_expression) throws SAXException { |
| 1113 | try { |
| 1114 | this.memberExpression = SearchCompiler.compile(member_expression, true, true); |
| 1115 | } catch (SearchCompiler.ParseError ex) { |
| 1116 | throw new SAXException(tr("Illegal member expression: {0}", ex.getMessage()), ex); |
| 1117 | } |
| 1118 | } |
| 1119 | |
1111 | 1120 | /* return either argument, the highest possible value or the lowest |
1112 | 1121 | allowed value */ |
1113 | 1122 | public long getValidCount(long c) |
… |
… |
public class TaggingPreset extends AbstractAction implements MapView.LayerChange
|
1571 | 1580 | return false; |
1572 | 1581 | } |
1573 | 1582 | |
| 1583 | public String suggestRoleForOsmPrimitive(OsmPrimitive osm) { |
| 1584 | final List<Role> roles = new ArrayList<Role>(); |
| 1585 | for (Item i : data) { |
| 1586 | if (i instanceof Roles) { |
| 1587 | roles.addAll(((Roles) i).roles); |
| 1588 | } |
| 1589 | } |
| 1590 | for (Role i : roles) { |
| 1591 | if (i.memberExpression != null && i.memberExpression.match(osm)) { |
| 1592 | return i.key; |
| 1593 | } |
| 1594 | } |
| 1595 | return null; |
| 1596 | } |
| 1597 | |
1574 | 1598 | public void actionPerformed(ActionEvent e) { |
1575 | 1599 | if (Main.main == null) return; |
1576 | 1600 | if (Main.main.getCurrentDataSet() == null) return; |
… |
… |
public class TaggingPreset extends AbstractAction implements MapView.LayerChange
|
1589 | 1613 | for(Tag t : getChangedTags()) { |
1590 | 1614 | r.put(t.getKey(), t.getValue()); |
1591 | 1615 | } |
1592 | | for(OsmPrimitive osm : Main.main.getCurrentDataSet().getSelected()) { |
1593 | | RelationMember rm = new RelationMember("", osm); |
| 1616 | for (OsmPrimitive osm : Main.main.getCurrentDataSet().getSelected()) { |
| 1617 | String role = suggestRoleForOsmPrimitive(osm); |
| 1618 | RelationMember rm = new RelationMember(role == null ? "" : role, osm); |
1594 | 1619 | r.addMember(rm); |
1595 | 1620 | members.add(rm); |
1596 | 1621 | } |