1 /*
2
3    Licensed to the Apache Software Foundation (ASF) under one or more
4    contributor license agreements.  See the NOTICE file distributed with
5    this work for additional information regarding copyright ownership.
6    The ASF licenses this file to You under the Apache License, Version 2.0
7    (the "License"); you may not use this file except in compliance with
8    the License.  You may obtain a copy of the License at
9
10        http://www.apache.org/licenses/LICENSE-2.0
11
12    Unless required by applicable law or agreed to in writing, software
13    distributed under the License is distributed on an "AS IS" BASIS,
14    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15    See the License for the specific language governing permissions and
16    limitations under the License.
17
18  */

19 package org.apache.batik.css.engine.value.css2;
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.IdentifierManager;
25 import org.apache.batik.css.engine.value.StringMap;
26 import org.apache.batik.css.engine.value.Value;
27 import org.apache.batik.css.engine.value.ValueConstants;
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 /**
33  * This class provides a manager for the 'font-stretch' property values.
34  *
35  * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
36  * @version $Id: FontStretchManager.java 1733416 2016-03-03 07:07:13Z gadams $
37  */

38 public class FontStretchManager extends IdentifierManager {
39
40     /**
41      * The identifier values.
42      */

43     protected static final StringMap values = new StringMap();
44     static {
45         values.put(CSSConstants.CSS_ALL_VALUE,
46                    ValueConstants.ALL_VALUE);
47         values.put(CSSConstants.CSS_CONDENSED_VALUE,
48                    ValueConstants.CONDENSED_VALUE);
49         values.put(CSSConstants.CSS_EXPANDED_VALUE,
50                    ValueConstants.EXPANDED_VALUE);
51         values.put(CSSConstants.CSS_EXTRA_CONDENSED_VALUE,
52                    ValueConstants.EXTRA_CONDENSED_VALUE);
53         values.put(CSSConstants.CSS_EXTRA_EXPANDED_VALUE,
54                    ValueConstants.EXTRA_EXPANDED_VALUE);
55         values.put(CSSConstants.CSS_NARROWER_VALUE,
56                    ValueConstants.NARROWER_VALUE);
57         values.put(CSSConstants.CSS_NORMAL_VALUE,
58                    ValueConstants.NORMAL_VALUE);
59         values.put(CSSConstants.CSS_SEMI_CONDENSED_VALUE,
60                    ValueConstants.SEMI_CONDENSED_VALUE);
61         values.put(CSSConstants.CSS_SEMI_EXPANDED_VALUE,
62                    ValueConstants.SEMI_EXPANDED_VALUE);
63         values.put(CSSConstants.CSS_ULTRA_CONDENSED_VALUE,
64                    ValueConstants.ULTRA_CONDENSED_VALUE);
65         values.put(CSSConstants.CSS_ULTRA_EXPANDED_VALUE,
66                    ValueConstants.ULTRA_EXPANDED_VALUE);
67         values.put(CSSConstants.CSS_WIDER_VALUE,
68                    ValueConstants.WIDER_VALUE);
69     }
70
71     /**
72      * Implements {@link
73      * org.apache.batik.css.engine.value.ValueManager#isInheritedProperty()}.
74      */

75     public boolean isInheritedProperty() {
76         return true;
77     }
78
79     /**
80      * Implements {@link ValueManager#isAnimatableProperty()}.
81      */

82     public boolean isAnimatableProperty() {
83         return true;
84     }
85
86     /**
87      * Implements {@link ValueManager#isAdditiveProperty()}.
88      */

89     public boolean isAdditiveProperty() {
90         return false;
91     }
92
93     /**
94      * Implements {@link ValueManager#getPropertyType()}.
95      */

96     public int getPropertyType() {
97         return SVGTypes.TYPE_IDENT;
98     }
99
100     /**
101      * Implements {@link
102      * org.apache.batik.css.engine.value.ValueManager#getPropertyName()}.
103      */

104     public String getPropertyName() {
105         return CSSConstants.CSS_FONT_STRETCH_PROPERTY;
106     }
107
108     /**
109      * Implements {@link
110      * org.apache.batik.css.engine.value.ValueManager#getDefaultValue()}.
111      */

112     public Value getDefaultValue() {
113         return ValueConstants.NORMAL_VALUE;
114     }
115
116     /**
117      * Implements {@link
118      * ValueManager#computeValue(CSSStylableElement,String,CSSEngine,int,StyleMap,Value)}.
119      */

120     public Value computeValue(CSSStylableElement elt,
121                               String pseudo,
122                               CSSEngine engine,
123                               int idx,
124                               StyleMap sm,
125                               Value value) {
126         if (value == ValueConstants.NARROWER_VALUE) {
127             sm.putParentRelative(idx, true);
128
129             CSSStylableElement p = CSSEngine.getParentCSSStylableElement(elt);
130             if (p == null) {
131                 return ValueConstants.SEMI_CONDENSED_VALUE;
132             }
133             Value v = engine.getComputedStyle(p, pseudo, idx);
134             if (v == ValueConstants.NORMAL_VALUE) {
135                 return ValueConstants.SEMI_CONDENSED_VALUE;
136             }
137             if (v == ValueConstants.CONDENSED_VALUE) {
138                 return ValueConstants.EXTRA_CONDENSED_VALUE;
139             }
140             if (v == ValueConstants.EXPANDED_VALUE) {
141                 return ValueConstants.SEMI_EXPANDED_VALUE;
142             }
143             if (v == ValueConstants.SEMI_EXPANDED_VALUE) {
144                 return ValueConstants.NORMAL_VALUE;
145             }
146             if (v == ValueConstants.SEMI_CONDENSED_VALUE) {
147                 return ValueConstants.CONDENSED_VALUE;
148             }
149             if (v == ValueConstants.EXTRA_CONDENSED_VALUE) {
150                 return ValueConstants.ULTRA_CONDENSED_VALUE;
151             }
152             if (v == ValueConstants.EXTRA_EXPANDED_VALUE) {
153                 return ValueConstants.EXPANDED_VALUE;
154             }
155             if (v == ValueConstants.ULTRA_CONDENSED_VALUE) {
156                 return ValueConstants.ULTRA_CONDENSED_VALUE;
157             }
158             return ValueConstants.EXTRA_EXPANDED_VALUE;
159         } else if (value == ValueConstants.WIDER_VALUE) {
160             sm.putParentRelative(idx, true);
161
162             CSSStylableElement p = CSSEngine.getParentCSSStylableElement(elt);
163             if (p == null) {
164                 return ValueConstants.SEMI_CONDENSED_VALUE;
165             }
166             Value v = engine.getComputedStyle(p, pseudo, idx);
167             if (v == ValueConstants.NORMAL_VALUE) {
168                 return ValueConstants.SEMI_EXPANDED_VALUE;
169             }
170             if (v == ValueConstants.CONDENSED_VALUE) {
171                 return ValueConstants.SEMI_CONDENSED_VALUE;
172             }
173             if (v == ValueConstants.EXPANDED_VALUE) {
174                 return ValueConstants.EXTRA_EXPANDED_VALUE;
175             }
176             if (v == ValueConstants.SEMI_EXPANDED_VALUE) {
177                 return ValueConstants.EXPANDED_VALUE;
178             }
179             if (v == ValueConstants.SEMI_CONDENSED_VALUE) {
180                 return ValueConstants.NORMAL_VALUE;
181             }
182             if (v == ValueConstants.EXTRA_CONDENSED_VALUE) {
183                 return ValueConstants.CONDENSED_VALUE;
184             }
185             if (v == ValueConstants.EXTRA_EXPANDED_VALUE) {
186                 return ValueConstants.ULTRA_EXPANDED_VALUE;
187             }
188             if (v == ValueConstants.ULTRA_CONDENSED_VALUE) {
189                 return ValueConstants.EXTRA_CONDENSED_VALUE;
190             }
191             return ValueConstants.ULTRA_EXPANDED_VALUE;
192         }
193         return value;
194     }
195
196     /**
197      * Implements {@link IdentifierManager#getIdentifiers()}.
198      */

199     public StringMap getIdentifiers() {
200         return values;
201     }
202 }
203