1/*
2 * Copyright (C) 2007-2008 Esmertec AG.
3 * Copyright (C) 2007-2008 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 *      http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18package com.android.mms.dom.smil;
19
20import com.android.mms.LogTag;
21
22import org.w3c.dom.DOMException;
23import org.w3c.dom.smil.SMILDocument;
24import org.w3c.dom.smil.SMILRegionElement;
25
26import android.util.Log;
27
28public class SmilRegionElementImpl extends SmilElementImpl implements
29        SMILRegionElement {
30
31    /*
32     * Internal Interface
33     */
34
35    private static final String HIDDEN_ATTRIBUTE = "hidden";
36    private static final String SLICE_ATTRIBUTE = "slice";
37    private static final String SCROLL_ATTRIBUTE = "scroll";
38    private static final String MEET_ATTRIBUTE = "meet";
39    private static final String FILL_ATTRIBUTE = "fill";
40    private static final String ID_ATTRIBUTE_NAME = "id";
41    private static final String WIDTH_ATTRIBUTE_NAME = "width";
42    private static final String TITLE_ATTRIBUTE_NAME = "title";
43    private static final String HEIGHT_ATTRIBUTE_NAME = "height";
44    private static final String BACKGROUND_COLOR_ATTRIBUTE_NAME = "backgroundColor";
45    private static final String Z_INDEX_ATTRIBUTE_NAME = "z-index";
46    private static final String TOP_ATTRIBUTE_NAME = "top";
47    private static final String LEFT_ATTRIBUTE_NAME = "left";
48    private static final String RIGHT_ATTRIBUTE_NAME = "right";
49    private static final String BOTTOM_ATTRIBUTE_NAME = "bottom";
50    private static final String FIT_ATTRIBUTE_NAME = "fit";
51    private static final String TAG = LogTag.TAG;
52    private static final boolean DEBUG = false;
53    private static final boolean LOCAL_LOGV = false;
54
55    SmilRegionElementImpl(SmilDocumentImpl owner, String tagName) {
56        super(owner, tagName);
57    }
58
59    /*
60     * SMILRegionElement Interface
61     */
62
63    public String getFit() {
64        String fit = getAttribute(FIT_ATTRIBUTE_NAME);
65        if (FILL_ATTRIBUTE.equalsIgnoreCase(fit)) {
66            return FILL_ATTRIBUTE;
67        } else if (MEET_ATTRIBUTE.equalsIgnoreCase(fit)) {
68            return MEET_ATTRIBUTE;
69        } else if (SCROLL_ATTRIBUTE.equalsIgnoreCase(fit)) {
70            return SCROLL_ATTRIBUTE;
71        } else if (SLICE_ATTRIBUTE.equalsIgnoreCase(fit)) {
72            return SLICE_ATTRIBUTE;
73        } else {
74            return HIDDEN_ATTRIBUTE;
75        }
76    }
77
78    public int getLeft() {
79        try {
80            return parseRegionLength(getAttribute(LEFT_ATTRIBUTE_NAME), true);
81        } catch (NumberFormatException _) {
82            if (LOCAL_LOGV) {
83                Log.v(TAG, "Left attribute is not set or incorrect.");
84            }
85        }
86        try {
87            int bbw = ((SMILDocument) getOwnerDocument()).getLayout().getRootLayout().getWidth();
88            int right = parseRegionLength(getAttribute(RIGHT_ATTRIBUTE_NAME), true);
89            int width = parseRegionLength(getAttribute(WIDTH_ATTRIBUTE_NAME), true);
90            return bbw - right - width;
91        } catch (NumberFormatException _) {
92            if (LOCAL_LOGV) {
93                Log.v(TAG, "Right or width attribute is not set or incorrect.");
94            }
95        }
96        return 0;
97    }
98
99    public int getTop() {
100        try {
101            return parseRegionLength(getAttribute(TOP_ATTRIBUTE_NAME), false);
102        } catch (NumberFormatException _) {
103            if (LOCAL_LOGV) {
104                Log.v(TAG, "Top attribute is not set or incorrect.");
105            }
106        }
107        try {
108            int bbh = ((SMILDocument) getOwnerDocument()).getLayout().getRootLayout().getHeight();
109            int bottom = parseRegionLength(getAttribute(BOTTOM_ATTRIBUTE_NAME), false);
110            int height = parseRegionLength(getAttribute(HEIGHT_ATTRIBUTE_NAME), false);
111            return bbh - bottom - height;
112        } catch (NumberFormatException _) {
113            if (LOCAL_LOGV) {
114                Log.v(TAG, "Bottom or height attribute is not set or incorrect.");
115            }
116        }
117        return 0;
118    }
119
120    public int getZIndex() {
121        try {
122            return Integer.parseInt(this.getAttribute(Z_INDEX_ATTRIBUTE_NAME));
123        } catch (NumberFormatException _) {
124            return 0;
125        }
126    }
127
128    public void setFit(String fit) throws DOMException {
129        if (fit.equalsIgnoreCase(FILL_ATTRIBUTE)
130                || fit.equalsIgnoreCase(MEET_ATTRIBUTE)
131                || fit.equalsIgnoreCase(SCROLL_ATTRIBUTE)
132                || fit.equalsIgnoreCase(SLICE_ATTRIBUTE)) {
133            this.setAttribute(FIT_ATTRIBUTE_NAME, fit.toLowerCase());
134        } else {
135            this.setAttribute(FIT_ATTRIBUTE_NAME, HIDDEN_ATTRIBUTE);
136        }
137    }
138
139    public void setLeft(int left) throws DOMException {
140        this.setAttribute(LEFT_ATTRIBUTE_NAME, String.valueOf(left));
141    }
142
143    public void setTop(int top) throws DOMException {
144        this.setAttribute(TOP_ATTRIBUTE_NAME, String.valueOf(top));
145    }
146
147    public void setZIndex(int zIndex) throws DOMException {
148        if (zIndex > 0) {
149            this.setAttribute(Z_INDEX_ATTRIBUTE_NAME, Integer.toString(zIndex));
150        } else {
151            this.setAttribute(Z_INDEX_ATTRIBUTE_NAME, Integer.toString(0));
152        }
153    }
154
155    public String getBackgroundColor() {
156        return this.getAttribute(BACKGROUND_COLOR_ATTRIBUTE_NAME);
157    }
158
159    public int getHeight() {
160        try {
161            final int height = parseRegionLength(getAttribute(HEIGHT_ATTRIBUTE_NAME), false);
162            return height == 0 ?
163                    ((SMILDocument) getOwnerDocument()).getLayout().getRootLayout().getHeight() :
164                        height;
165        } catch (NumberFormatException _) {
166            if (LOCAL_LOGV) {
167                Log.v(TAG, "Height attribute is not set or incorrect.");
168            }
169        }
170        int bbh = ((SMILDocument) getOwnerDocument()).getLayout().getRootLayout().getHeight();
171        try {
172            bbh -= parseRegionLength(getAttribute(TOP_ATTRIBUTE_NAME), false);
173        } catch (NumberFormatException _) {
174            if (LOCAL_LOGV) {
175                Log.v(TAG, "Top attribute is not set or incorrect.");
176            }
177        }
178        try {
179            bbh -= parseRegionLength(getAttribute(BOTTOM_ATTRIBUTE_NAME), false);
180        } catch (NumberFormatException _) {
181            if (LOCAL_LOGV) {
182                Log.v(TAG, "Bottom attribute is not set or incorrect.");
183            }
184        }
185        return bbh;
186    }
187
188    public String getTitle() {
189        return this.getAttribute(TITLE_ATTRIBUTE_NAME);
190    }
191
192    public int getWidth() {
193        try {
194            final int width = parseRegionLength(getAttribute(WIDTH_ATTRIBUTE_NAME), true);
195            return width == 0 ?
196                    ((SMILDocument) getOwnerDocument()).getLayout().getRootLayout().getWidth() :
197                        width;
198        } catch (NumberFormatException _) {
199            if (LOCAL_LOGV) {
200                Log.v(TAG, "Width attribute is not set or incorrect.");
201            }
202        }
203        int bbw = ((SMILDocument) getOwnerDocument()).getLayout().getRootLayout().getWidth();
204        try {
205            bbw -= parseRegionLength(getAttribute(LEFT_ATTRIBUTE_NAME), true);
206        } catch (NumberFormatException _) {
207            if (LOCAL_LOGV) {
208                Log.v(TAG, "Left attribute is not set or incorrect.");
209            }
210        }
211        try {
212            bbw -= parseRegionLength(getAttribute(RIGHT_ATTRIBUTE_NAME), true);
213        } catch (NumberFormatException _) {
214            if (LOCAL_LOGV) {
215                Log.v(TAG, "Right attribute is not set or incorrect.");
216            }
217        }
218        return bbw;
219    }
220
221    public void setBackgroundColor(String backgroundColor) throws DOMException {
222        this.setAttribute(BACKGROUND_COLOR_ATTRIBUTE_NAME, backgroundColor);
223    }
224
225    public void setHeight(int height) throws DOMException {
226        this.setAttribute(HEIGHT_ATTRIBUTE_NAME, String.valueOf(height) + "px");
227    }
228
229    public void setTitle(String title) throws DOMException {
230        this.setAttribute(TITLE_ATTRIBUTE_NAME, title);
231    }
232
233    public void setWidth(int width) throws DOMException {
234        this.setAttribute(WIDTH_ATTRIBUTE_NAME, String.valueOf(width) + "px");
235    }
236
237    /*
238     * SMILElement Interface
239     */
240
241    @Override
242    public String getId() {
243        return this.getAttribute(ID_ATTRIBUTE_NAME);
244    }
245
246    @Override
247    public void setId(String id) throws DOMException {
248        this.setAttribute(ID_ATTRIBUTE_NAME, id);
249    }
250
251    /*
252     * Internal Interface
253     */
254
255    private int parseRegionLength(String length, boolean horizontal) {
256        if (length.endsWith("px")) {
257            length = length.substring(0, length.indexOf("px"));
258            return Integer.parseInt(length);
259        } else if (length.endsWith("%")) {
260            double value = 0.01*Integer.parseInt(length.substring(0, length.length() - 1));
261            if (horizontal) {
262                value *= ((SMILDocument) getOwnerDocument()).getLayout().getRootLayout().getWidth();
263            } else {
264                value *= ((SMILDocument) getOwnerDocument()).getLayout().getRootLayout().getHeight();
265            }
266            return (int) Math.round(value);
267        } else {
268            return Integer.parseInt(length);
269        }
270    }
271
272    /*
273     * (non-Javadoc)
274     * @see java.lang.Object#toString()
275     */
276    @Override
277    public String toString() {
278        return super.toString()
279                + ": id=" + getId()
280                + ", width=" + getWidth()
281                + ", height=" + getHeight()
282                + ", left=" + getLeft()
283                + ", top=" + getTop();
284    }
285}
286