/******************************************************************************* * Copyright (c) 2004, 2006 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.wst.css.core.internal.document; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.wst.css.core.internal.parserz.CSSRegionContexts; import org.eclipse.wst.css.core.internal.parserz.CSSTextParser; import org.eclipse.wst.css.core.internal.parserz.CSSTextToken; import org.eclipse.wst.css.core.internal.provisional.document.ICSSSelector; import org.eclipse.wst.css.core.internal.provisional.document.ICSSSelectorList; import org.w3c.dom.Element; /** * */ public class CSSSelectorListImpl implements ICSSSelectorList { private String fText = null; private String fCachedString = null; // normalized string private List fSelectors = null; public CSSSelectorListImpl(String cssText) { super(); fText = cssText; parseSelectorText(); } /** * @return boolean * @param obj * java.lang.Object */ public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || this.getClass() != obj.getClass()) return false; CSSSelectorListImpl foreign = (CSSSelectorListImpl) obj; if (getLength() != foreign.getLength()) return false; for (int i = 0; i < getLength(); i++) { if (!getSelector(i).equals(foreign.getSelector(i))) return false; } return true; } /** * @return java.util.Iterator */ public Iterator getIterator() { return getSelectors().iterator(); } /** * @return int */ public int getLength() { return getSelectors().size(); } public ICSSSelector getSelector(int index) { List selectors = getSelectors(); if (0 <= index && index < selectors.size()) { return (ICSSSelector) selectors.get(index); } else { return null; } } private List getSelectors() { if (fSelectors == null) { parseSelectorText(); } return fSelectors; } /** * @return java.lang.String */ public String getString() { if (fCachedString == null) { StringBuffer buf = new StringBuffer(); boolean bFirst = true; // groups is list of comma-separated selectors Iterator i = getSelectors().iterator(); while (i.hasNext()) { if (!bFirst) { buf.append(", ");//$NON-NLS-1$ } ICSSSelector item = (ICSSSelector) i.next(); buf.append(item.getString()); bFirst = false; } fCachedString = buf.toString(); } return fCachedString; } /** * @return boolean * @param element * org.w3c.dom.Element */ public boolean match(Element element, String pseudoName) { int nSelectors = getLength(); for (int iSelector = 0; iSelector < nSelectors; iSelector++) { // Check each Selector Lists ICSSSelector selector = getSelector(iSelector); if (selector.match(element, pseudoName)) return true; } return false; } /** * */ private void parseSelectorText() { fSelectors = new ArrayList(); if (fText == null) { return; } CSSTextParser parser = new CSSTextParser(CSSTextParser.MODE_STYLESHEET, fText); CSSTextToken[] tokens = parser.getTokens(); if (tokens.length <= 0) { return; } List tokenGroup = new ArrayList(); for (int i = 0; i < tokens.length; i++) { CSSTextToken token = tokens[i]; if (token.kind == CSSRegionContexts.CSS_SELECTOR_SEPARATOR && 0 < tokenGroup.size()) { ICSSSelector selector = new CSSSelector(tokenGroup); if (selector != null) { fSelectors.add(selector); } tokenGroup.clear(); } else { tokenGroup.add(tokens[i]); } } if (0 < tokenGroup.size()) { ICSSSelector selector = new CSSSelector(tokenGroup); if (selector != null) { fSelectors.add(selector); } } } /** * */ public String toString() { return getString(); } /** * */ public Iterator getErrors() { List errors = new ArrayList(); Iterator iSelector = getSelectors().iterator(); while (iSelector.hasNext()) { Iterator iError = ((ICSSSelector) iSelector.next()).getErrors(); while (iError.hasNext()) { errors.add(iError.next()); } } return errors.iterator(); } /** * */ public int getErrorCount() { int nErrors = 0; Iterator i = getErrors(); while (i.hasNext()) { nErrors++; i.next(); } return nErrors; } }