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