diff --git a/vtm/src/org/oscim/theme/XmlThemeBuilder.java b/vtm/src/org/oscim/theme/XmlThemeBuilder.java index 7e50fd8c..5c480864 100644 --- a/vtm/src/org/oscim/theme/XmlThemeBuilder.java +++ b/vtm/src/org/oscim/theme/XmlThemeBuilder.java @@ -40,6 +40,8 @@ import org.oscim.renderer.atlas.TextureRegion; import org.oscim.renderer.elements.TextureItem; import org.oscim.theme.IRenderTheme.ThemeException; import org.oscim.theme.rule.Rule; +import org.oscim.theme.rule.Rule.Closed; +import org.oscim.theme.rule.Rule.Selector; import org.oscim.theme.rule.RuleBuilder; import org.oscim.theme.styles.AreaStyle; import org.oscim.theme.styles.AreaStyle.AreaBuilder; @@ -199,7 +201,7 @@ public class XmlThemeBuilder extends DefaultHandler { } else if (ELEMENT_NAME_MATCH.equals(localName)) { checkState(localName, Element.RULE); - RuleBuilder rule = RuleBuilder.create(localName, attributes, mRuleStack); + RuleBuilder rule = createRule(localName, attributes, mRuleStack); if (!mRuleStack.empty()) { mCurrentRule.addSubRule(rule); } @@ -292,6 +294,67 @@ public class XmlThemeBuilder extends DefaultHandler { } } + private RuleBuilder createRule(String localName, Attributes attributes, + Stack ruleStack) { + int element = Rule.Element.ANY; + int closed = Closed.ANY; + String keys = null; + String values = null; + byte zoomMin = 0; + byte zoomMax = Byte.MAX_VALUE; + int selector = 0; + + for (int i = 0; i < attributes.getLength(); ++i) { + String name = attributes.getLocalName(i); + String value = attributes.getValue(i); + + if ("e".equals(name)) { + String val = value.toUpperCase(); + if ("WAY".equals(val)) + element = Rule.Element.WAY; + else if ("NODE".equals(val)) + element = Rule.Element.NODE; + } else if ("k".equals(name)) { + keys = value; + } else if ("v".equals(name)) { + values = value; + } else if ("closed".equals(name)) { + String val = value.toUpperCase(); + if ("YES".equals(val)) + closed = Closed.YES; + else if ("NO".equals(val)) + closed = Closed.NO; + } else if ("zoom-min".equals(name)) { + zoomMin = Byte.parseByte(value); + } else if ("zoom-max".equals(name)) { + zoomMax = Byte.parseByte(value); + } else if ("select".equals(name)) { + if ("first".equals(value)) + selector |= Selector.FIRST; + if ("when-matched".equals(value)) + selector |= Selector.WHEN_MATCHED; + } else { + XmlThemeBuilder.logUnknownAttribute(localName, name, value, i); + } + } + + if (closed == Closed.YES) + element = Rule.Element.POLY; + else if (closed == Closed.NO) + element = Rule.Element.LINE; + + XmlThemeBuilder.validateNonNegative("zoom-min", zoomMin); + XmlThemeBuilder.validateNonNegative("zoom-max", zoomMax); + if (zoomMin > zoomMax) + throw new ThemeException("zoom-min must be less or equal zoom-max: " + zoomMin); + + RuleBuilder b = RuleBuilder.create(ruleStack, keys, values); + b.setZoom(zoomMin, zoomMax); + b.element(element); + b.select(selector); + return b; + } + private TextureRegion getAtlasRegion(String src) { if (mTextureAtlas == null) return null; diff --git a/vtm/src/org/oscim/theme/rule/RuleBuilder.java b/vtm/src/org/oscim/theme/rule/RuleBuilder.java index 20db3776..7a454740 100644 --- a/vtm/src/org/oscim/theme/rule/RuleBuilder.java +++ b/vtm/src/org/oscim/theme/rule/RuleBuilder.java @@ -4,8 +4,6 @@ import java.util.ArrayList; import java.util.Stack; import org.oscim.theme.IRenderTheme.ThemeException; -import org.oscim.theme.XmlThemeBuilder; -import org.oscim.theme.rule.Rule.Closed; import org.oscim.theme.rule.Rule.Element; import org.oscim.theme.rule.Rule.NegativeRule; import org.oscim.theme.rule.Rule.PositiveRuleK; @@ -16,7 +14,6 @@ import org.oscim.theme.styles.RenderStyle; import org.oscim.theme.styles.RenderStyle.StyleBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.xml.sax.Attributes; public class RuleBuilder { final static Logger log = LoggerFactory.getLogger(RuleBuilder.class); @@ -43,10 +40,8 @@ public class RuleBuilder { private static final String STRING_NEGATION = "~"; private static final String STRING_EXCLUSIVE = "-"; private static final String SEPARATOR = "\\|"; - //private static final String STRING_WILDCARD = "*"; - private static final int SELECT_FIRST = 1 << 0; - private static final int SELECT_WHEN_MATCHED = 1 << 1; + //private static final String STRING_WILDCARD = "*"; public RuleBuilder(RuleType type, int element, int zoom, int selector, String[] keys, String[] values) { @@ -108,71 +103,6 @@ public class RuleBuilder { return new RuleBuilder(type, keyList, valueList); } - private static void validate(byte zoomMin, byte zoomMax) { - XmlThemeBuilder.validateNonNegative("zoom-min", zoomMin); - XmlThemeBuilder.validateNonNegative("zoom-max", zoomMax); - if (zoomMin > zoomMax) - throw new ThemeException("zoom-min must be less or equal zoom-max: " + zoomMin); - } - - public static RuleBuilder create(String elementName, Attributes attributes, - Stack ruleStack) { - int element = Element.ANY; - int closed = Closed.ANY; - String keys = null; - String values = null; - byte zoomMin = 0; - byte zoomMax = Byte.MAX_VALUE; - int selector = 0; - - for (int i = 0; i < attributes.getLength(); ++i) { - String name = attributes.getLocalName(i); - String value = attributes.getValue(i); - - if ("e".equals(name)) { - String val = value.toUpperCase(); - if ("WAY".equals(val)) - element = Element.WAY; - else if ("NODE".equals(val)) - element = Element.NODE; - } else if ("k".equals(name)) { - keys = value; - } else if ("v".equals(name)) { - values = value; - } else if ("closed".equals(name)) { - String val = value.toUpperCase(); - if ("YES".equals(val)) - closed = Closed.YES; - else if ("NO".equals(val)) - closed = Closed.NO; - } else if ("zoom-min".equals(name)) { - zoomMin = Byte.parseByte(value); - } else if ("zoom-max".equals(name)) { - zoomMax = Byte.parseByte(value); - } else if ("select".equals(name)) { - if ("first".equals(value)) - selector |= SELECT_FIRST; - if ("when-matched".equals(value)) - selector |= SELECT_WHEN_MATCHED; - } else { - XmlThemeBuilder.logUnknownAttribute(elementName, name, value, i); - } - } - - if (closed == Closed.YES) - element = Element.POLY; - else if (closed == Closed.NO) - element = Element.LINE; - - validate(zoomMin, zoomMax); - - RuleBuilder b = create(ruleStack, keys, values); - b.setZoom(zoomMin, zoomMax); - b.element = element; - b.selector = selector; - return b; - } - public RuleBuilder setZoom(byte zoomMin, byte zoomMax) { // zoom-level bitmask zoom = 0;