/*
 * Copyright (c) 2000 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.
 */

package org.w3c.dom.css;

import org.w3c.dom.Element;
import org.w3c.dom.views.AbstractView;

/**
 *  This interface represents a CSS view. The <code>getComputedStyle</code> 
 * method provides a read only access to the computed values of an element. 
 * <p> The expectation is that an instance of the <code>ViewCSS</code> 
 * interface can be obtained by using binding-specific casting methods on an 
 * instance of the <code>AbstractView</code> interface. 
 * <p> Since a computed style is related to an <code>Element</code> node, if 
 * this element is removed from the document, the associated 
 * <code>CSSStyleDeclaration</code> and <code>CSSValue</code> related to 
 * this declaration are no longer valid. 
 * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113'>Document Object Model (DOM) Level 2 Style Specification</a>.
 * @since DOM Level 2
 */
public interface ViewCSS extends AbstractView {
    /**
     *  This method is used to get the computed style as it is defined in [<a href='http://www.w3.org/TR/1998/REC-CSS2-19980512'>CSS2</a>]. 
     * @param elt  The element whose style is to be computed. This parameter 
     *   cannot be null. 
     * @param pseudoElt  The pseudo-element or <code>null</code> if none. 
     * @return  The computed style. The <code>CSSStyleDeclaration</code> is 
     *   read-only and contains only absolute values. 
     */
    public CSSStyleDeclaration getComputedStyle(Element elt, 
                                                String pseudoElt);

}
