/*
 * Copyright (c) 1999 World Wide Web Consortium,
 * (Massachusetts Institute of Technology, Institut National de
 * Recherche en Informatique et en Automatique, Keio University). All
 * Rights Reserved. This program is distributed under the W3C's Software
 * Intellectual Property License. This program is distributed in the
 * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
 * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
 * PURPOSE.
 * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
 *
 * $Id: Selector.java,v 1.1 2009/12/06 10:40:08 rsternber Exp $
 */
package org.w3c.css.sac;

/**
 * This interface defines a selector.
 * <p><b>Remarks</b>: Not all the following selectors are supported (or will be
 * supported) by CSS.
 * <p>All examples are CSS2 compliant.
 *
 * @version $Revision: 1.1 $
 * @author Philippe Le Hegaret
 */
public interface Selector {
    
    /* simple selectors */

    /**
     * This is a conditional selector.
     * example:
     * <pre class="example">
     *   simple[role="private"]
     *   .part1
     *   H1#myId
     *   P:lang(fr).p1
     * </pre>
     *
     * @see ConditionalSelector
     */
    public static final short SAC_CONDITIONAL_SELECTOR		= 0;

    /**
     * This selector matches any node.
     * @see SimpleSelector
     */    
    public static final short SAC_ANY_NODE_SELECTOR		= 1;

    /**
     * This selector matches the root node.
     * @see SimpleSelector
     */    
    public static final short SAC_ROOT_NODE_SELECTOR		= 2;

    /**
     * This selector matches only node that are different from a specified one.
     * @see NegativeSelector
     */    
    public static final short SAC_NEGATIVE_SELECTOR		= 3;

    /**
     * This selector matches only element node.
     * example:
     * <pre class="example">
     *   H1
     *   animate
     * </pre>
     * @see ElementSelector
     */
    public static final short SAC_ELEMENT_NODE_SELECTOR		= 4;

    /**
     * This selector matches only text node.
     * @see CharacterDataSelector
     */
    public static final short SAC_TEXT_NODE_SELECTOR		= 5;

    /**
     * This selector matches only cdata node.
     * @see CharacterDataSelector
     */
    public static final short SAC_CDATA_SECTION_NODE_SELECTOR	= 6;

    /**
     * This selector matches only processing instruction node.
     * @see ProcessingInstructionSelector
     */
    public static final short SAC_PROCESSING_INSTRUCTION_NODE_SELECTOR	= 7;

    /**
     * This selector matches only comment node.
     * @see CharacterDataSelector
     */    
    public static final short SAC_COMMENT_NODE_SELECTOR		= 8;
    /**
     * This selector matches the 'first line' pseudo element.
     * example:
     * <pre class="example">
     *   :first-line
     * </pre>
     * @see ElementSelector
     */
    public static final short SAC_PSEUDO_ELEMENT_SELECTOR	= 9;

    /* combinator selectors */

    /**
     * This selector matches an arbitrary descendant of some ancestor element.
     * example:
     * <pre class="example">
     *   E F
     * </pre>
     * @see DescendantSelector
     */    
    public static final short SAC_DESCENDANT_SELECTOR		= 10;

    /**
     * This selector matches a childhood relationship between two elements.
     * example:
     * <pre class="example">
     *   E > F
     * </pre>
     * @see DescendantSelector
     */    
    public static final short SAC_CHILD_SELECTOR		= 11;
    /**
     * This selector matches two selectors who shared the same parent in the
     * document tree and the element represented by the first sequence
     * immediately precedes the element represented by the second one.
     * example:
     * <pre class="example">
     *   E + F
     * </pre>
     * @see SiblingSelector
     */
    public static final short SAC_DIRECT_ADJACENT_SELECTOR	= 12;

    /**
     * An integer indicating the type of <code>Selector</code>
     */
    public short getSelectorType();

}
