Home | History | Annotate | Download | only in smil
      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 
     18 package com.android.mms.dom.smil;
     19 
     20 import com.android.mms.LogTag;
     21 
     22 import org.w3c.dom.DOMException;
     23 import org.w3c.dom.smil.SMILDocument;
     24 import org.w3c.dom.smil.SMILRegionElement;
     25 
     26 import android.util.Log;
     27 
     28 public 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