1
19 package org.apache.batik.css.engine.value.svg;
20
21 import org.apache.batik.css.engine.CSSEngine;
22 import org.apache.batik.css.engine.CSSStylableElement;
23 import org.apache.batik.css.engine.StyleMap;
24 import org.apache.batik.css.engine.value.FloatValue;
25 import org.apache.batik.css.engine.value.LengthManager;
26 import org.apache.batik.css.engine.value.StringMap;
27 import org.apache.batik.css.engine.value.Value;
28 import org.apache.batik.css.engine.value.ValueManager;
29 import org.apache.batik.util.CSSConstants;
30 import org.apache.batik.util.SVGTypes;
31
32 import org.w3c.css.sac.LexicalUnit;
33 import org.w3c.dom.DOMException;
34 import org.w3c.dom.css.CSSPrimitiveValue;
35
36
42 public class BaselineShiftManager extends LengthManager {
43
44
47 protected static final StringMap values = new StringMap();
48 static {
49 values.put(CSSConstants.CSS_BASELINE_VALUE,
50 SVGValueConstants.BASELINE_VALUE);
51 values.put(CSSConstants.CSS_SUB_VALUE,
52 SVGValueConstants.SUB_VALUE);
53 values.put(CSSConstants.CSS_SUPER_VALUE,
54 SVGValueConstants.SUPER_VALUE);
55 }
56
57
60 public boolean isInheritedProperty() {
61 return false;
62 }
63
64
67 public boolean isAnimatableProperty() {
68 return true;
69 }
70
71
74 public boolean isAdditiveProperty() {
75 return false;
76 }
77
78
81 public int getPropertyType() {
82 return SVGTypes.TYPE_BASELINE_SHIFT_VALUE;
83 }
84
85
88 public String getPropertyName() {
89 return CSSConstants.CSS_BASELINE_SHIFT_PROPERTY;
90 }
91
92
95 public Value getDefaultValue() {
96 return SVGValueConstants.BASELINE_VALUE;
97 }
98
99
102 public Value createValue(LexicalUnit lu, CSSEngine engine)
103 throws DOMException {
104 switch (lu.getLexicalUnitType()) {
105 case LexicalUnit.SAC_INHERIT:
106 return SVGValueConstants.INHERIT_VALUE;
107
108 case LexicalUnit.SAC_IDENT:
109 Object v = values.get(lu.getStringValue().toLowerCase().intern());
110 if (v == null) {
111 throw createInvalidIdentifierDOMException(lu.getStringValue());
112 }
113 return (Value)v;
114 }
115 return super.createValue(lu, engine);
116 }
117
118
121 public Value createStringValue(short type, String value, CSSEngine engine)
122 throws DOMException {
123 if (type != CSSPrimitiveValue.CSS_IDENT) {
124 throw createInvalidIdentifierDOMException(value);
125 }
126 Object v = values.get(value.toLowerCase().intern());
127 if (v == null) {
128 throw createInvalidIdentifierDOMException(value);
129 }
130 return (Value)v;
131 }
132
133
137 public Value computeValue(CSSStylableElement elt,
138 String pseudo,
139 CSSEngine engine,
140 int idx,
141 StyleMap sm,
142 Value value) {
143 if (value.getPrimitiveType() == CSSPrimitiveValue.CSS_PERCENTAGE) {
144 sm.putLineHeightRelative(idx, true);
145
146 int fsi = engine.getLineHeightIndex();
147 CSSStylableElement parent;
148 parent = (CSSStylableElement)elt.getParentNode();
149 if (parent == null) {
150
151
152
153 parent = elt;
154 }
155 Value fs = engine.getComputedStyle(parent, pseudo, fsi);
156 float fsv = fs.getFloatValue();
157 float v = value.getFloatValue();
158 return new FloatValue(CSSPrimitiveValue.CSS_NUMBER,
159 (fsv * v) / 100f);
160 }
161 return super.computeValue(elt, pseudo, engine, idx, sm, value);
162 }
163
164
165
169 protected int getOrientation() {
170 return BOTH_ORIENTATION;
171 }
172
173 }
174