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.css.engine.value;
020:
021: import org.apache.batik.css.engine.CSSEngine;
022: import org.apache.batik.css.engine.CSSStylableElement;
023: import org.apache.batik.css.engine.StyleMap;
024: import org.apache.batik.util.CSSConstants;
025: import org.w3c.css.sac.LexicalUnit;
026: import org.w3c.dom.DOMException;
027: import org.w3c.dom.css.CSSPrimitiveValue;
028:
029: /**
030: * This class provides a manager for the property with support for
031: * CSS color values.
032: *
033: * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
034: * @version $Id: AbstractColorManager.java 489226 2006-12-21 00:05:36Z cam $
035: */
036: public abstract class AbstractColorManager extends IdentifierManager {
037:
038: /**
039: * The identifier values.
040: */
041: protected static final StringMap values = new StringMap();
042: static {
043: values.put(CSSConstants.CSS_AQUA_VALUE,
044: ValueConstants.AQUA_VALUE);
045: values.put(CSSConstants.CSS_BLACK_VALUE,
046: ValueConstants.BLACK_VALUE);
047: values.put(CSSConstants.CSS_BLUE_VALUE,
048: ValueConstants.BLUE_VALUE);
049: values.put(CSSConstants.CSS_FUCHSIA_VALUE,
050: ValueConstants.FUCHSIA_VALUE);
051: values.put(CSSConstants.CSS_GRAY_VALUE,
052: ValueConstants.GRAY_VALUE);
053: values.put(CSSConstants.CSS_GREEN_VALUE,
054: ValueConstants.GREEN_VALUE);
055: values.put(CSSConstants.CSS_LIME_VALUE,
056: ValueConstants.LIME_VALUE);
057: values.put(CSSConstants.CSS_MAROON_VALUE,
058: ValueConstants.MAROON_VALUE);
059: values.put(CSSConstants.CSS_NAVY_VALUE,
060: ValueConstants.NAVY_VALUE);
061: values.put(CSSConstants.CSS_OLIVE_VALUE,
062: ValueConstants.OLIVE_VALUE);
063: values.put(CSSConstants.CSS_PURPLE_VALUE,
064: ValueConstants.PURPLE_VALUE);
065: values
066: .put(CSSConstants.CSS_RED_VALUE,
067: ValueConstants.RED_VALUE);
068: values.put(CSSConstants.CSS_SILVER_VALUE,
069: ValueConstants.SILVER_VALUE);
070: values.put(CSSConstants.CSS_TEAL_VALUE,
071: ValueConstants.TEAL_VALUE);
072: values.put(CSSConstants.CSS_WHITE_VALUE,
073: ValueConstants.WHITE_VALUE);
074: values.put(CSSConstants.CSS_YELLOW_VALUE,
075: ValueConstants.YELLOW_VALUE);
076:
077: values.put(CSSConstants.CSS_ACTIVEBORDER_VALUE,
078: ValueConstants.ACTIVEBORDER_VALUE);
079: values.put(CSSConstants.CSS_ACTIVECAPTION_VALUE,
080: ValueConstants.ACTIVECAPTION_VALUE);
081: values.put(CSSConstants.CSS_APPWORKSPACE_VALUE,
082: ValueConstants.APPWORKSPACE_VALUE);
083: values.put(CSSConstants.CSS_BACKGROUND_VALUE,
084: ValueConstants.BACKGROUND_VALUE);
085: values.put(CSSConstants.CSS_BUTTONFACE_VALUE,
086: ValueConstants.BUTTONFACE_VALUE);
087: values.put(CSSConstants.CSS_BUTTONHIGHLIGHT_VALUE,
088: ValueConstants.BUTTONHIGHLIGHT_VALUE);
089: values.put(CSSConstants.CSS_BUTTONSHADOW_VALUE,
090: ValueConstants.BUTTONSHADOW_VALUE);
091: values.put(CSSConstants.CSS_BUTTONTEXT_VALUE,
092: ValueConstants.BUTTONTEXT_VALUE);
093: values.put(CSSConstants.CSS_CAPTIONTEXT_VALUE,
094: ValueConstants.CAPTIONTEXT_VALUE);
095: values.put(CSSConstants.CSS_GRAYTEXT_VALUE,
096: ValueConstants.GRAYTEXT_VALUE);
097: values.put(CSSConstants.CSS_HIGHLIGHT_VALUE,
098: ValueConstants.HIGHLIGHT_VALUE);
099: values.put(CSSConstants.CSS_HIGHLIGHTTEXT_VALUE,
100: ValueConstants.HIGHLIGHTTEXT_VALUE);
101: values.put(CSSConstants.CSS_INACTIVEBORDER_VALUE,
102: ValueConstants.INACTIVEBORDER_VALUE);
103: values.put(CSSConstants.CSS_INACTIVECAPTION_VALUE,
104: ValueConstants.INACTIVECAPTION_VALUE);
105: values.put(CSSConstants.CSS_INACTIVECAPTIONTEXT_VALUE,
106: ValueConstants.INACTIVECAPTIONTEXT_VALUE);
107: values.put(CSSConstants.CSS_INFOBACKGROUND_VALUE,
108: ValueConstants.INFOBACKGROUND_VALUE);
109: values.put(CSSConstants.CSS_INFOTEXT_VALUE,
110: ValueConstants.INFOTEXT_VALUE);
111: values.put(CSSConstants.CSS_MENU_VALUE,
112: ValueConstants.MENU_VALUE);
113: values.put(CSSConstants.CSS_MENUTEXT_VALUE,
114: ValueConstants.MENUTEXT_VALUE);
115: values.put(CSSConstants.CSS_SCROLLBAR_VALUE,
116: ValueConstants.SCROLLBAR_VALUE);
117: values.put(CSSConstants.CSS_THREEDDARKSHADOW_VALUE,
118: ValueConstants.THREEDDARKSHADOW_VALUE);
119: values.put(CSSConstants.CSS_THREEDFACE_VALUE,
120: ValueConstants.THREEDFACE_VALUE);
121: values.put(CSSConstants.CSS_THREEDHIGHLIGHT_VALUE,
122: ValueConstants.THREEDHIGHLIGHT_VALUE);
123: values.put(CSSConstants.CSS_THREEDLIGHTSHADOW_VALUE,
124: ValueConstants.THREEDLIGHTSHADOW_VALUE);
125: values.put(CSSConstants.CSS_THREEDSHADOW_VALUE,
126: ValueConstants.THREEDSHADOW_VALUE);
127: values.put(CSSConstants.CSS_WINDOW_VALUE,
128: ValueConstants.WINDOW_VALUE);
129: values.put(CSSConstants.CSS_WINDOWFRAME_VALUE,
130: ValueConstants.WINDOWFRAME_VALUE);
131: values.put(CSSConstants.CSS_WINDOWTEXT_VALUE,
132: ValueConstants.WINDOWTEXT_VALUE);
133: }
134:
135: /**
136: * The computed identifier values.
137: */
138: protected static final StringMap computedValues = new StringMap();
139: static {
140: computedValues.put(CSSConstants.CSS_BLACK_VALUE,
141: ValueConstants.BLACK_RGB_VALUE);
142: computedValues.put(CSSConstants.CSS_SILVER_VALUE,
143: ValueConstants.SILVER_RGB_VALUE);
144: computedValues.put(CSSConstants.CSS_GRAY_VALUE,
145: ValueConstants.GRAY_RGB_VALUE);
146: computedValues.put(CSSConstants.CSS_WHITE_VALUE,
147: ValueConstants.WHITE_RGB_VALUE);
148: computedValues.put(CSSConstants.CSS_MAROON_VALUE,
149: ValueConstants.MAROON_RGB_VALUE);
150: computedValues.put(CSSConstants.CSS_RED_VALUE,
151: ValueConstants.RED_RGB_VALUE);
152: computedValues.put(CSSConstants.CSS_PURPLE_VALUE,
153: ValueConstants.PURPLE_RGB_VALUE);
154: computedValues.put(CSSConstants.CSS_FUCHSIA_VALUE,
155: ValueConstants.FUCHSIA_RGB_VALUE);
156: computedValues.put(CSSConstants.CSS_GREEN_VALUE,
157: ValueConstants.GREEN_RGB_VALUE);
158: computedValues.put(CSSConstants.CSS_LIME_VALUE,
159: ValueConstants.LIME_RGB_VALUE);
160: computedValues.put(CSSConstants.CSS_OLIVE_VALUE,
161: ValueConstants.OLIVE_RGB_VALUE);
162: computedValues.put(CSSConstants.CSS_YELLOW_VALUE,
163: ValueConstants.YELLOW_RGB_VALUE);
164: computedValues.put(CSSConstants.CSS_NAVY_VALUE,
165: ValueConstants.NAVY_RGB_VALUE);
166: computedValues.put(CSSConstants.CSS_BLUE_VALUE,
167: ValueConstants.BLUE_RGB_VALUE);
168: computedValues.put(CSSConstants.CSS_TEAL_VALUE,
169: ValueConstants.TEAL_RGB_VALUE);
170: computedValues.put(CSSConstants.CSS_AQUA_VALUE,
171: ValueConstants.AQUA_RGB_VALUE);
172: }
173:
174: /**
175: * Implements {@link ValueManager#createValue(LexicalUnit,CSSEngine)}.
176: */
177: public Value createValue(LexicalUnit lu, CSSEngine engine)
178: throws DOMException {
179: if (lu.getLexicalUnitType() == LexicalUnit.SAC_RGBCOLOR) {
180: lu = lu.getParameters();
181: Value red = createColorComponent(lu);
182: lu = lu.getNextLexicalUnit().getNextLexicalUnit();
183: Value green = createColorComponent(lu);
184: lu = lu.getNextLexicalUnit().getNextLexicalUnit();
185: Value blue = createColorComponent(lu);
186: return createRGBColor(red, green, blue);
187: }
188: return super .createValue(lu, engine);
189: }
190:
191: /**
192: * Implements {@link
193: * ValueManager#computeValue(CSSStylableElement,String,CSSEngine,int,StyleMap,Value)}.
194: */
195: public Value computeValue(CSSStylableElement elt, String pseudo,
196: CSSEngine engine, int idx, StyleMap sm, Value value) {
197: if (value.getPrimitiveType() == CSSPrimitiveValue.CSS_IDENT) {
198: String ident = value.getStringValue();
199: // Search for a direct computed value.
200: Value v = (Value) computedValues.get(ident);
201: if (v != null) {
202: return v;
203: }
204: // Must be a system color...
205: if (values.get(ident) == null) {
206: throw new IllegalStateException("Not a system-color:"
207: + ident);
208: }
209: return engine.getCSSContext().getSystemColor(ident);
210: }
211: return super .computeValue(elt, pseudo, engine, idx, sm, value);
212: }
213:
214: /**
215: * Creates an RGB color.
216: */
217: protected Value createRGBColor(Value r, Value g, Value b) {
218: return new RGBColorValue(r, g, b);
219: }
220:
221: /**
222: * Creates a color component from a lexical unit.
223: */
224: protected Value createColorComponent(LexicalUnit lu)
225: throws DOMException {
226: switch (lu.getLexicalUnitType()) {
227: case LexicalUnit.SAC_INTEGER:
228: return new FloatValue(CSSPrimitiveValue.CSS_NUMBER, lu
229: .getIntegerValue());
230:
231: case LexicalUnit.SAC_REAL:
232: return new FloatValue(CSSPrimitiveValue.CSS_NUMBER, lu
233: .getFloatValue());
234:
235: case LexicalUnit.SAC_PERCENTAGE:
236: return new FloatValue(CSSPrimitiveValue.CSS_PERCENTAGE, lu
237: .getFloatValue());
238: }
239: throw createInvalidRGBComponentUnitDOMException(lu
240: .getLexicalUnitType());
241: }
242:
243: /**
244: * Implements {@link IdentifierManager#getIdentifiers()}.
245: */
246: public StringMap getIdentifiers() {
247: return values;
248: }
249:
250: private DOMException createInvalidRGBComponentUnitDOMException(
251: short type) {
252: Object[] p = new Object[] { getPropertyName(),
253: new Integer(type) };
254: String s = Messages.formatMessage("invalid.rgb.component.unit",
255: p);
256: return new DOMException(DOMException.NOT_SUPPORTED_ERR, s);
257: }
258:
259: }
|