001: /*
002:
003: ============================================================================
004: The Apache Software License, Version 1.1
005: ============================================================================
006:
007: Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved.
008:
009: Redistribution and use in source and binary forms, with or without modifica-
010: tion, are permitted provided that the following conditions are met:
011:
012: 1. Redistributions of source code must retain the above copyright notice,
013: this list of conditions and the following disclaimer.
014:
015: 2. Redistributions in binary form must reproduce the above copyright notice,
016: this list of conditions and the following disclaimer in the documentation
017: and/or other materials provided with the distribution.
018:
019: 3. The end-user documentation included with the redistribution, if any, must
020: include the following acknowledgment: "This product includes software
021: developed by the Apache Software Foundation (http://www.apache.org/)."
022: Alternately, this acknowledgment may appear in the software itself, if
023: and wherever such third-party acknowledgments normally appear.
024:
025: 4. The names "Batik" and "Apache Software Foundation" must not be
026: used to endorse or promote products derived from this software without
027: prior written permission. For written permission, please contact
028: apache@apache.org.
029:
030: 5. Products derived from this software may not be called "Apache", nor may
031: "Apache" appear in their name, without prior written permission of the
032: Apache Software Foundation.
033:
034: THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
035: INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
036: FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
037: APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
038: INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
039: DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
040: OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
041: ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
042: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
043: THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
044:
045: This software consists of voluntary contributions made by many individuals
046: on behalf of the Apache Software Foundation. For more information on the
047: Apache Software Foundation, please see <http://www.apache.org/>.
048:
049: */
050:
051: package org.apache.batik.css.engine.value;
052:
053: import org.apache.batik.css.engine.CSSEngine;
054: import org.apache.batik.css.engine.CSSStylableElement;
055: import org.apache.batik.css.engine.StyleMap;
056: import org.apache.batik.util.CSSConstants;
057: import org.w3c.css.sac.LexicalUnit;
058: import org.w3c.dom.DOMException;
059: import org.w3c.dom.css.CSSPrimitiveValue;
060:
061: /**
062: * This class provides a manager for the property with support for
063: * CSS color values.
064: *
065: * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
066: * @version $Id$
067: */
068: public abstract class AbstractColorManager extends IdentifierManager {
069:
070: /**
071: * The identifier values.
072: */
073: public final static StringMap values = new StringMap();
074: static {
075: values.put(CSSConstants.CSS_AQUA_VALUE,
076: ValueConstants.AQUA_VALUE);
077: values.put(CSSConstants.CSS_BLACK_VALUE,
078: ValueConstants.BLACK_VALUE);
079: values.put(CSSConstants.CSS_BLUE_VALUE,
080: ValueConstants.BLUE_VALUE);
081: values.put(CSSConstants.CSS_FUCHSIA_VALUE,
082: ValueConstants.FUCHSIA_VALUE);
083: values.put(CSSConstants.CSS_GRAY_VALUE,
084: ValueConstants.GRAY_VALUE);
085: values.put(CSSConstants.CSS_GREEN_VALUE,
086: ValueConstants.GREEN_VALUE);
087: values.put(CSSConstants.CSS_LIME_VALUE,
088: ValueConstants.LIME_VALUE);
089: values.put(CSSConstants.CSS_MAROON_VALUE,
090: ValueConstants.MAROON_VALUE);
091: values.put(CSSConstants.CSS_NAVY_VALUE,
092: ValueConstants.NAVY_VALUE);
093: values.put(CSSConstants.CSS_OLIVE_VALUE,
094: ValueConstants.OLIVE_VALUE);
095: values.put(CSSConstants.CSS_PURPLE_VALUE,
096: ValueConstants.PURPLE_VALUE);
097: values
098: .put(CSSConstants.CSS_RED_VALUE,
099: ValueConstants.RED_VALUE);
100: values.put(CSSConstants.CSS_SILVER_VALUE,
101: ValueConstants.SILVER_VALUE);
102: values.put(CSSConstants.CSS_TEAL_VALUE,
103: ValueConstants.TEAL_VALUE);
104: values.put(CSSConstants.CSS_WHITE_VALUE,
105: ValueConstants.WHITE_VALUE);
106: values.put(CSSConstants.CSS_YELLOW_VALUE,
107: ValueConstants.YELLOW_VALUE);
108:
109: values.put(CSSConstants.CSS_ACTIVEBORDER_VALUE,
110: ValueConstants.ACTIVEBORDER_VALUE);
111: values.put(CSSConstants.CSS_ACTIVECAPTION_VALUE,
112: ValueConstants.ACTIVECAPTION_VALUE);
113: values.put(CSSConstants.CSS_APPWORKSPACE_VALUE,
114: ValueConstants.APPWORKSPACE_VALUE);
115: values.put(CSSConstants.CSS_BACKGROUND_VALUE,
116: ValueConstants.BACKGROUND_VALUE);
117: values.put(CSSConstants.CSS_BUTTONFACE_VALUE,
118: ValueConstants.BUTTONFACE_VALUE);
119: values.put(CSSConstants.CSS_BUTTONHIGHLIGHT_VALUE,
120: ValueConstants.BUTTONHIGHLIGHT_VALUE);
121: values.put(CSSConstants.CSS_BUTTONSHADOW_VALUE,
122: ValueConstants.BUTTONSHADOW_VALUE);
123: values.put(CSSConstants.CSS_BUTTONTEXT_VALUE,
124: ValueConstants.BUTTONTEXT_VALUE);
125: values.put(CSSConstants.CSS_CAPTIONTEXT_VALUE,
126: ValueConstants.CAPTIONTEXT_VALUE);
127: values.put(CSSConstants.CSS_GRAYTEXT_VALUE,
128: ValueConstants.GRAYTEXT_VALUE);
129: values.put(CSSConstants.CSS_HIGHLIGHT_VALUE,
130: ValueConstants.HIGHLIGHT_VALUE);
131: values.put(CSSConstants.CSS_HIGHLIGHTTEXT_VALUE,
132: ValueConstants.HIGHLIGHTTEXT_VALUE);
133: values.put(CSSConstants.CSS_INACTIVEBORDER_VALUE,
134: ValueConstants.INACTIVEBORDER_VALUE);
135: values.put(CSSConstants.CSS_INACTIVECAPTION_VALUE,
136: ValueConstants.INACTIVECAPTION_VALUE);
137: values.put(CSSConstants.CSS_INACTIVECAPTIONTEXT_VALUE,
138: ValueConstants.INACTIVECAPTIONTEXT_VALUE);
139: values.put(CSSConstants.CSS_INFOBACKGROUND_VALUE,
140: ValueConstants.INFOBACKGROUND_VALUE);
141: values.put(CSSConstants.CSS_INFOTEXT_VALUE,
142: ValueConstants.INFOTEXT_VALUE);
143: values.put(CSSConstants.CSS_MENU_VALUE,
144: ValueConstants.MENU_VALUE);
145: values.put(CSSConstants.CSS_MENUTEXT_VALUE,
146: ValueConstants.MENUTEXT_VALUE);
147: values.put(CSSConstants.CSS_SCROLLBAR_VALUE,
148: ValueConstants.SCROLLBAR_VALUE);
149: values.put(CSSConstants.CSS_THREEDDARKSHADOW_VALUE,
150: ValueConstants.THREEDDARKSHADOW_VALUE);
151: values.put(CSSConstants.CSS_THREEDFACE_VALUE,
152: ValueConstants.THREEDFACE_VALUE);
153: values.put(CSSConstants.CSS_THREEDHIGHLIGHT_VALUE,
154: ValueConstants.THREEDHIGHLIGHT_VALUE);
155: values.put(CSSConstants.CSS_THREEDLIGHTSHADOW_VALUE,
156: ValueConstants.THREEDLIGHTSHADOW_VALUE);
157: values.put(CSSConstants.CSS_THREEDSHADOW_VALUE,
158: ValueConstants.THREEDSHADOW_VALUE);
159: values.put(CSSConstants.CSS_WINDOW_VALUE,
160: ValueConstants.WINDOW_VALUE);
161: values.put(CSSConstants.CSS_WINDOWFRAME_VALUE,
162: ValueConstants.WINDOWFRAME_VALUE);
163: values.put(CSSConstants.CSS_WINDOWTEXT_VALUE,
164: ValueConstants.WINDOWTEXT_VALUE);
165: // BEGIN RAVE MODIFICATIONS
166: // Dynamically computed color; defaults to a blue color
167: // for links but will consult value attributes if necessary.
168: // Treated as a system color.
169: values.put(CSSConstants.CSS_LINKCOLOR_VALUE,
170: ValueConstants.LINKCOLOR_VALUE);
171: // END RAVE MODIFICATIONS
172: }
173:
174: /**
175: * The computed identifier values.
176: */
177: protected final static StringMap computedValues = new StringMap();
178: static {
179: computedValues.put(CSSConstants.CSS_BLACK_VALUE,
180: ValueConstants.BLACK_RGB_VALUE);
181: computedValues.put(CSSConstants.CSS_SILVER_VALUE,
182: ValueConstants.SILVER_RGB_VALUE);
183: computedValues.put(CSSConstants.CSS_GRAY_VALUE,
184: ValueConstants.GRAY_RGB_VALUE);
185: computedValues.put(CSSConstants.CSS_WHITE_VALUE,
186: ValueConstants.WHITE_RGB_VALUE);
187: computedValues.put(CSSConstants.CSS_MAROON_VALUE,
188: ValueConstants.MAROON_RGB_VALUE);
189: computedValues.put(CSSConstants.CSS_RED_VALUE,
190: ValueConstants.RED_RGB_VALUE);
191: computedValues.put(CSSConstants.CSS_PURPLE_VALUE,
192: ValueConstants.PURPLE_RGB_VALUE);
193: computedValues.put(CSSConstants.CSS_FUCHSIA_VALUE,
194: ValueConstants.FUCHSIA_RGB_VALUE);
195: computedValues.put(CSSConstants.CSS_GREEN_VALUE,
196: ValueConstants.GREEN_RGB_VALUE);
197: computedValues.put(CSSConstants.CSS_LIME_VALUE,
198: ValueConstants.LIME_RGB_VALUE);
199: computedValues.put(CSSConstants.CSS_OLIVE_VALUE,
200: ValueConstants.OLIVE_RGB_VALUE);
201: computedValues.put(CSSConstants.CSS_YELLOW_VALUE,
202: ValueConstants.YELLOW_RGB_VALUE);
203: computedValues.put(CSSConstants.CSS_NAVY_VALUE,
204: ValueConstants.NAVY_RGB_VALUE);
205: computedValues.put(CSSConstants.CSS_BLUE_VALUE,
206: ValueConstants.BLUE_RGB_VALUE);
207: computedValues.put(CSSConstants.CSS_TEAL_VALUE,
208: ValueConstants.TEAL_RGB_VALUE);
209: computedValues.put(CSSConstants.CSS_AQUA_VALUE,
210: ValueConstants.AQUA_RGB_VALUE);
211: }
212:
213: /**
214: * Implements {@link ValueManager#createValue(LexicalUnit,CSSEngine)}.
215: */
216: public Value createValue(LexicalUnit lu, CSSEngine engine)
217: throws DOMException {
218: if (lu.getLexicalUnitType() == LexicalUnit.SAC_RGBCOLOR) {
219: lu = lu.getParameters();
220: Value red = createColorComponent(lu);
221: lu = lu.getNextLexicalUnit().getNextLexicalUnit();
222: Value green = createColorComponent(lu);
223: lu = lu.getNextLexicalUnit().getNextLexicalUnit();
224: Value blue = createColorComponent(lu);
225: return createRGBColor(red, green, blue);
226: }
227: return super .createValue(lu, engine);
228: }
229:
230: /**
231: * Implements {@link
232: * ValueManager#computeValue(CSSStylableElement,String,CSSEngine,int,StyleMap,Value)}.
233: */
234: public Value computeValue(CSSStylableElement elt, String pseudo,
235: CSSEngine engine, int idx, StyleMap sm, Value value) {
236: if (value.getPrimitiveType() == CSSPrimitiveValue.CSS_IDENT) {
237: String ident = value.getStringValue();
238: // Search for a direct computed value.
239: Value v = (Value) computedValues.get(ident);
240: if (v != null) {
241: return v;
242: }
243: // Must be a system color...
244: if (values.get(ident) == null) {
245: throw new InternalError();
246: }
247: return engine.getCSSContext().getSystemColor(ident);
248: }
249: return super .computeValue(elt, pseudo, engine, idx, sm, value);
250: }
251:
252: /**
253: * Creates an RGB color.
254: */
255: protected Value createRGBColor(Value r, Value g, Value b) {
256: return new RGBColorValue(r, g, b);
257: }
258:
259: /**
260: * Creates a color component from a lexical unit.
261: */
262: protected Value createColorComponent(LexicalUnit lu)
263: throws DOMException {
264: switch (lu.getLexicalUnitType()) {
265: case LexicalUnit.SAC_INTEGER:
266: return new FloatValue(CSSPrimitiveValue.CSS_NUMBER, lu
267: .getIntegerValue());
268:
269: case LexicalUnit.SAC_REAL:
270: return new FloatValue(CSSPrimitiveValue.CSS_NUMBER, lu
271: .getFloatValue());
272:
273: case LexicalUnit.SAC_PERCENTAGE:
274: return new FloatValue(CSSPrimitiveValue.CSS_PERCENTAGE, lu
275: .getFloatValue());
276: }
277: throw createInvalidRGBComponentUnitDOMException(lu
278: .getLexicalUnitType());
279: }
280:
281: /**
282: * Implements {@link IdentifierManager#getIdentifiers()}.
283: */
284: protected StringMap getIdentifiers() {
285: return values;
286: }
287:
288: private DOMException createInvalidRGBComponentUnitDOMException(
289: short type) {
290: Object[] p = new Object[] { getPropertyName(),
291: new Integer(type) };
292: String s = Messages.formatMessage("invalid.rgb.component.unit",
293: p);
294: return new DOMException(DOMException.NOT_SUPPORTED_ERR, s);
295: }
296:
297: }
|