| /******************************************************************************* |
| * Copyright (c) 2004 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.util; |
| |
| |
| |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.Collections; |
| import java.util.Iterator; |
| |
| import org.eclipse.wst.css.core.internal.provisional.document.ICSSImportRule; |
| import org.eclipse.wst.css.core.internal.provisional.document.ICSSMediaRule; |
| import org.eclipse.wst.css.core.internal.provisional.document.ICSSNode; |
| import org.eclipse.wst.css.core.internal.provisional.document.ICSSSelector; |
| import org.eclipse.wst.css.core.internal.provisional.document.ICSSSelectorItem; |
| import org.eclipse.wst.css.core.internal.provisional.document.ICSSSelectorList; |
| import org.eclipse.wst.css.core.internal.provisional.document.ICSSSimpleSelector; |
| import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleRule; |
| import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleSheet; |
| |
| |
| /** |
| * |
| */ |
| public class CSSClassTraverser extends AbstractCssTraverser { |
| |
| ArrayList fClassNames; |
| |
| /** |
| * |
| */ |
| public CSSClassTraverser() { |
| super(); |
| } |
| |
| /** |
| * |
| */ |
| private void addClassNames(ICSSStyleRule rule) { |
| ICSSSelectorList selectorList = rule.getSelectors(); |
| Iterator iSelector = selectorList.getIterator(); |
| while (iSelector.hasNext()) { |
| ICSSSelector selector = (ICSSSelector) iSelector.next(); |
| Iterator iItem = selector.getIterator(); |
| while (iItem.hasNext()) { |
| ICSSSelectorItem item = (ICSSSelectorItem) iItem.next(); |
| if (item.getItemType() == ICSSSelectorItem.SIMPLE) { |
| ICSSSimpleSelector sel = (ICSSSimpleSelector) item; |
| int nClasses = sel.getNumOfClasses(); |
| for (int iClass = 0; iClass < nClasses; iClass++) { |
| String className = sel.getClass(iClass); |
| if (!fClassNames.contains(className)) |
| fClassNames.add(className); |
| } |
| } |
| } |
| } |
| } |
| |
| /** |
| * |
| */ |
| protected void begin(ICSSNode node) { |
| if (fClassNames == null) |
| fClassNames = new ArrayList(); |
| } |
| |
| /** |
| * |
| */ |
| protected void end(ICSSNode node) { |
| } |
| |
| /** |
| * |
| */ |
| public Collection getClassNames() { |
| return (fClassNames != null) ? fClassNames : Collections.EMPTY_LIST; |
| } |
| |
| /** |
| * |
| */ |
| protected short postNode(ICSSNode node) { |
| return TRAV_CONT; |
| } |
| |
| /** |
| * |
| */ |
| protected short preNode(ICSSNode node) { |
| short ret; |
| if (node instanceof ICSSStyleRule) { |
| addClassNames((ICSSStyleRule) node); |
| ret = TRAV_PRUNE; |
| } |
| else if (node instanceof ICSSStyleSheet || node instanceof ICSSMediaRule || node instanceof ICSSImportRule) { |
| ret = TRAV_CONT; |
| } |
| else { |
| ret = TRAV_PRUNE; |
| } |
| return ret; |
| } |
| } |