blob: 492c83652bb276d57758491025a6d60a4796a392 [file] [log] [blame]
/*******************************************************************************
* 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.document;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSMediaRule;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSNode;
import org.w3c.dom.DOMException;
import org.w3c.dom.css.CSSRule;
import org.w3c.dom.css.CSSRuleList;
import org.w3c.dom.stylesheets.MediaList;
/**
*
*/
class CSSMediaRuleImpl extends CSSRuleImpl implements ICSSMediaRule {
/**
*
*/
CSSMediaRuleImpl() {
super();
}
CSSMediaRuleImpl(CSSMediaRuleImpl that) {
super(that);
}
/**
* @return org.w3c.dom.css.CSSRule
* @param rule
* org.w3c.dom.css.CSSRule
* @exception org.w3c.dom.DOMException
* The exception description.
*/
public org.w3c.dom.css.CSSRule appendRule(org.w3c.dom.css.CSSRule rule) throws org.w3c.dom.DOMException {
if (rule == null)
return null;
CSSRule ret = (CSSRule) appendChild((CSSNodeImpl) rule);
return ret;
}
public ICSSNode cloneNode(boolean deep) {
CSSMediaRuleImpl cloned = new CSSMediaRuleImpl(this);
if (deep)
cloneChildNodes(cloned, deep);
return cloned;
}
/**
* Used to delete a rule from the media block.
*
* @param index
* The index within the media block's rule collection of the
* rule to remove.
* @exception DOMException
* INDEX_SIZE_ERR: Raised if the specified index does not
* correspond to a rule in the media rule list. <br>
* NO_MODIFICATION_ALLOWED_ERR: Raised if this media rule
* is readonly.
*/
public void deleteRule(int index) throws DOMException {
CSSNodeImpl node = getIndexedRule(index);
if (node != null)
removeChild(node);
}
/**
* A list of all CSS rules contained within the media block.
*/
public CSSRuleList getCssRules() {
CSSRuleListImpl list = new CSSRuleListImpl();
for (ICSSNode node = getFirstChild(); node != null; node = node.getNextSibling()) {
if (node instanceof CSSRule)
list.appendNode(node);
}
return list;
}
CSSRuleImpl getIndexedRule(int index) {
if (index < 0)
return null;
int i = 0;
for (ICSSNode node = getFirstChild(); node != null; node = node.getNextSibling()) {
if (node instanceof CSSRule) {
if (i++ == index)
return (CSSRuleImpl) node;
}
}
return null;
}
/**
* A list of media types for this rule.
*/
public MediaList getMedia() {
for (ICSSNode node = getFirstChild(); node != null; node = node.getNextSibling()) {
if (node instanceof MediaListImpl)
return (MediaList) node;
}
return null;
}
/**
* @return short
*/
public short getNodeType() {
return MEDIARULE_NODE;
}
/**
* The type of the rule, as defined above. The expectation is that
* binding-specific casting methods can be used to cast down from an
* instance of the <code>CSSRule</code> interface to the specific
* derived interface implied by the <code>type</code>.
*/
public short getType() {
return MEDIA_RULE;
}
/**
* Used to insert a new rule into the media block.
*
* @param rule
* The parsable text representing the rule. For rule sets this
* contains both the selector and the style declaration. For
* at-rules, this specifies both the at-identifier and the rule
* content.
* @param index
* The index within the media block's rule collection of the
* rule before which to insert the specified rule. If the
* specified index is equal to the length of the media blocks's
* rule collection, the rule will be added to the end of the
* media block.
* @return The index within the media block's rule collection of the newly
* inserted rule.
* @exception DOMException
* HIERARCHY_REQUEST_ERR: Raised if the rule cannot be
* inserted at the specified index, e.g., if an
* <code>@import</code> rule is inserted after a standard rule set or other
* at-rule. <br>
* INDEX_SIZE_ERR: Raised if the specified index is not a valid
* insertion point. <br>
* NO_MODIFICATION_ALLOWED_ERR: Raised if this media rule is
* readonly. <br>
* SYNTAX_ERR: Raised if the specified rule has a syntax error and
* is unparsable.
*/
public int insertRule(String rule, int index) throws DOMException {
int length = getCssRules().getLength();
if (index < 0 || length < index)
throw new DOMException(DOMException.INDEX_SIZE_ERR, "");//$NON-NLS-1$
CSSRuleImpl refRule = (length != index) ? getIndexedRule(index) : null;
CSSRuleImpl newRule = (CSSRuleImpl) getOwnerDocument().createCSSRule(rule);
// prevent from nesting @media rule
if (newRule.getType() == CSSRule.MEDIA_RULE)
throw new DOMException(DOMException.SYNTAX_ERR, "");//$NON-NLS-1$
insertBefore(newRule, refRule);
return index;
}
/**
* @return org.w3c.dom.css.CSSRule
* @param newRule
* org.w3c.dom.css.CSSRule
* @param refRule
* org.w3c.dom.css.CSSRule
*/
public org.w3c.dom.css.CSSRule insertRuleBefore(org.w3c.dom.css.CSSRule newRule, org.w3c.dom.css.CSSRule refRule) throws org.w3c.dom.DOMException {
if (newRule == null && refRule == null)
return null;
CSSRule ret = (CSSRule) insertBefore((CSSNodeImpl) newRule, (CSSNodeImpl) refRule);
return ret;
}
/**
* @return org.w3c.dom.css.CSSRule
* @param rule
* org.w3c.dom.css.CSSRule
* @exception org.w3c.dom.DOMException
* The exception description.
*/
public org.w3c.dom.css.CSSRule removeRule(org.w3c.dom.css.CSSRule rule) throws org.w3c.dom.DOMException {
if (rule == null)
return null;
CSSRule ret = (CSSRule) removeChild((CSSNodeImpl) rule);
return ret;
}
/**
* @return org.w3c.dom.css.CSSRule
* @param newChild
* org.w3c.dom.css.CSSRule
* @param oldChild
* org.w3c.dom.css.CSSRule
* @exception org.w3c.dom.DOMException
* The exception description.
*/
public org.w3c.dom.css.CSSRule replaceRule(org.w3c.dom.css.CSSRule newRule, org.w3c.dom.css.CSSRule oldRule) throws org.w3c.dom.DOMException {
if (newRule == null && oldRule == null)
return null;
CSSRule ret = (CSSRule) replaceChild((CSSNodeImpl) newRule, (CSSNodeImpl) oldRule);
return ret;
}
}