package com.adobe.dp.css; import com.adobe.dp.xml.util.SMap; public class SiblingElementMatcher extends ElementMatcher { private ElementMatcher prev; private ElementMatcher curr; boolean prevMatched; private SparseStack state = new SparseStack(); public SiblingElementMatcher(Selector selector, ElementMatcher prev, ElementMatcher curr) { super(selector); this.prev = prev; this.curr = curr; } public void popElement() { prev.popElement(); curr.popElement(); prevMatched = state.pop() != null; } public MatchResult pushElement(String ns, String name, SMap attrs) { MatchResult p = prev.pushElement(ns, name, attrs); if( p != null && p.getPseudoElement() != null ) return null; // something illegal like foo:first-line + bar state.push(p); MatchResult c = curr.pushElement(ns, name, attrs); if( !prevMatched ) c = null; prevMatched = false; return c; } }