001: /*
002:
003: Licensed to the Apache Software Foundation (ASF) under one or more
004: contributor license agreements. See the NOTICE file distributed with
005: this work for additional information regarding copyright ownership.
006: The ASF licenses this file to You under the Apache License, Version 2.0
007: (the "License"); you may not use this file except in compliance with
008: the License. You may obtain a copy of the License at
009:
010: http://www.apache.org/licenses/LICENSE-2.0
011:
012: Unless required by applicable law or agreed to in writing, software
013: distributed under the License is distributed on an "AS IS" BASIS,
014: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015: See the License for the specific language governing permissions and
016: limitations under the License.
017:
018: */
019: package org.apache.batik.extension;
020:
021: import java.net.MalformedURLException;
022: import java.net.URL;
023:
024: import org.apache.batik.css.engine.CSSStylableElement;
025: import org.apache.batik.css.engine.StyleDeclarationProvider;
026: import org.apache.batik.css.engine.StyleMap;
027: import org.apache.batik.dom.AbstractDocument;
028:
029: import org.w3c.dom.Node;
030: import org.w3c.dom.css.CSSStyleDeclaration;
031: import org.w3c.dom.css.CSSValue;
032: import org.w3c.dom.svg.SVGAnimatedString;
033: import org.w3c.dom.svg.SVGStylable;
034:
035: /**
036: * This class implements the basic features an element must have in
037: * order to be usable as a foreign element within an SVGOMDocument,
038: * and the support for both the 'style' attribute and the style
039: * attributes (ie: fill="red", ...).
040: *
041: * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
042: * @version $Id: StylableExtensionElement.java 489226 2006-12-21 00:05:36Z cam $
043: */
044: public abstract class StylableExtensionElement extends ExtensionElement
045: implements CSSStylableElement, SVGStylable {
046:
047: /**
048: * The base URL.
049: */
050: protected URL cssBase;
051:
052: /**
053: * The computed style map.
054: */
055: protected StyleMap computedStyleMap;
056:
057: /**
058: * Creates a new Element object.
059: */
060: protected StylableExtensionElement() {
061: }
062:
063: /**
064: * Creates a new Element object.
065: * @param name The element name, for validation purposes.
066: * @param owner The owner document.
067: */
068: protected StylableExtensionElement(String name,
069: AbstractDocument owner) {
070: super (name, owner);
071: }
072:
073: // CSSStylableElement //////////////////////////////////////////
074:
075: /**
076: * Returns the computed style of this element/pseudo-element.
077: */
078: public StyleMap getComputedStyleMap(String pseudoElement) {
079: return computedStyleMap;
080: }
081:
082: /**
083: * Sets the computed style of this element/pseudo-element.
084: */
085: public void setComputedStyleMap(String pseudoElement, StyleMap sm) {
086: computedStyleMap = sm;
087: }
088:
089: /**
090: * Returns the ID of this element.
091: */
092: public String getXMLId() {
093: return getAttributeNS(null, "id");
094: }
095:
096: /**
097: * Returns the class of this element.
098: */
099: public String getCSSClass() {
100: return getAttributeNS(null, "class");
101: }
102:
103: /**
104: * Returns the CSS base URL of this element.
105: * @throws IllegalArgumentException when {@link #getBaseURI()} returns an
106: * invalid URL. The information from the MalformedURLException
107: * is passed to the IllegalArgumentException
108: */
109: public URL getCSSBase() {
110: String bu = "";
111: if (cssBase == null) {
112: try {
113: bu = getBaseURI();
114: if (bu == null) {
115: return null;
116: }
117: cssBase = new URL(bu);
118: } catch (MalformedURLException e) {
119: String msg = "MalformedURLException:" + e.getMessage()
120: + ':' + bu;
121: throw new IllegalArgumentException(msg);
122: }
123: }
124: return cssBase;
125: }
126:
127: /**
128: * Tells whether this element is an instance of the given pseudo
129: * class.
130: */
131: public boolean isPseudoInstanceOf(String pseudoClass) {
132: if (pseudoClass.equals("first-child")) {
133: Node n = getPreviousSibling();
134: while (n != null && n.getNodeType() != ELEMENT_NODE) {
135: n = n.getPreviousSibling();
136: }
137: return n == null;
138: }
139: return false;
140: }
141:
142: /**
143: * Returns the object that gives access to the underlying
144: * {@link org.apache.batik.css.engine.StyleDeclaration} for the override
145: * style of this element.
146: */
147: public StyleDeclarationProvider getOverrideStyleDeclarationProvider() {
148: return null;
149: }
150:
151: // SVGStylable //////////////////////////////////////////////////
152:
153: /**
154: * <b>DOM</b>: Implements {@link org.w3c.dom.svg.SVGStylable#getStyle()}.
155: */
156: public CSSStyleDeclaration getStyle() {
157: throw new UnsupportedOperationException("Not implemented");
158: }
159:
160: /**
161: * <b>DOM</b>: Implements {@link
162: * org.w3c.dom.svg.SVGStylable#getPresentationAttribute(String)}.
163: */
164: public CSSValue getPresentationAttribute(String name) {
165: throw new UnsupportedOperationException("Not implemented");
166: }
167:
168: /**
169: * <b>DOM</b>: Implements {@link
170: * org.w3c.dom.svg.SVGStylable#getClassName()}.
171: */
172: public SVGAnimatedString getClassName() {
173: throw new UnsupportedOperationException("Not implemented");
174: }
175: }
|