172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project/*
272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Copyright (C) 2007 Esmertec AG.
372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *
572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * you may not use this file except in compliance with the License.
772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * You may obtain a copy of the License at
872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *
972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
1072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project *
1172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * See the License for the specific language governing permissions and
1572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project * limitations under the License.
1672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project */
1772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
1872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpackage com.android.mms.dom.smil;
1972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
2072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.DOMException;
2172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.Element;
2272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.Node;
2372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.NodeList;
2472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.events.DocumentEvent;
2572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.events.Event;
2672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.smil.ElementSequentialTimeContainer;
2772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.smil.ElementTime;
2872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.smil.SMILDocument;
2972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.smil.SMILElement;
3072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.smil.SMILLayoutElement;
3172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport org.w3c.dom.smil.TimeList;
3272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
3372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.dom.DocumentImpl;
3472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectimport com.android.mms.dom.events.EventImpl;
3572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
3672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Projectpublic class SmilDocumentImpl extends DocumentImpl implements SMILDocument, DocumentEvent {
3772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /*
3872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * The sequential time container cannot be initialized here because the real container
3972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * is body, which hasn't been created yet. It will be initialized when the body has
4072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * already been created. Please see getBody().
4172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
4272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    ElementSequentialTimeContainer mSeqTimeContainer;
4372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
4472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public final static String SMIL_DOCUMENT_START_EVENT = "SmilDocumentStart";
4572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public final static String SMIL_DOCUMENT_END_EVENT = "SimlDocumentEnd";
4672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
4772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /*
4872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * Internal methods
4972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
5072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public SmilDocumentImpl() {
5172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        super();
5272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
5372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
5472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /*
5572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * ElementSequentialTimeContainer stuff
5672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
5772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
5872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public NodeList getActiveChildrenAt(float instant) {
5972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mSeqTimeContainer.getActiveChildrenAt(instant);
6072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
6172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
6272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public NodeList getTimeChildren() {
6372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mSeqTimeContainer.getTimeChildren();
6472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
6572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
6672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean beginElement() {
6772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mSeqTimeContainer.beginElement();
6872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
6972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
7072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public boolean endElement() {
7172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mSeqTimeContainer.endElement();
7272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
7372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
7472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public TimeList getBegin() {
7572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mSeqTimeContainer.getBegin();
7672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
7772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
7872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public float getDur() {
7972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mSeqTimeContainer.getDur();
8072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
8172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
8272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public TimeList getEnd() {
8372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mSeqTimeContainer.getEnd();
8472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
8572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
8672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public short getFill() {
8772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mSeqTimeContainer.getFill();
8872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
8972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
9072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public short getFillDefault() {
9172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mSeqTimeContainer.getFillDefault();
9272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
9372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
9472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public float getRepeatCount() {
9572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mSeqTimeContainer.getRepeatCount();
9672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
9772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
9872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public float getRepeatDur() {
9972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mSeqTimeContainer.getRepeatDur();
10072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
10172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
10272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public short getRestart() {
10372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return mSeqTimeContainer.getRestart();
10472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
10572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
10672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void pauseElement() {
10772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mSeqTimeContainer.pauseElement();
10872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
10972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
11072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void resumeElement() {
11172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mSeqTimeContainer.resumeElement();
11272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
11372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
11472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void seekElement(float seekTo) {
11572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mSeqTimeContainer.seekElement(seekTo);
11672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
11772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
11872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void setBegin(TimeList begin) throws DOMException {
11972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mSeqTimeContainer.setBegin(begin);
12072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
12172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
12272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void setDur(float dur) throws DOMException {
12372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mSeqTimeContainer.setDur(dur);
12472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
12572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
12672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void setEnd(TimeList end) throws DOMException {
12772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mSeqTimeContainer.setEnd(end);
12872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
12972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
13072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void setFill(short fill) throws DOMException {
13172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mSeqTimeContainer.setFill(fill);
13272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
13372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
13472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void setFillDefault(short fillDefault) throws DOMException {
13572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mSeqTimeContainer.setFillDefault(fillDefault);
13672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
13772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
13872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void setRepeatCount(float repeatCount) throws DOMException {
13972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mSeqTimeContainer.setRepeatCount(repeatCount);
14072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
14172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
14272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void setRepeatDur(float repeatDur) throws DOMException {
14372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mSeqTimeContainer.setRepeatDur(repeatDur);
14472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
14572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
14672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public void setRestart(short restart) throws DOMException {
14772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mSeqTimeContainer.setRestart(restart);
14872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
14972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
15072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /*
15172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * Document Interface
15272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
15372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
15472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
15572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public Element createElement(String tagName) throws DOMException {
15672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Find the appropriate class for this element
15772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        tagName = tagName.toLowerCase();
15872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (tagName.equals("text") ||
15972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                tagName.equals("img") ||
16072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                tagName.equals("video")) {
16172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return new SmilRegionMediaElementImpl(this, tagName);
16272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (tagName.equals("audio")) {
16372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return new SmilMediaElementImpl(this, tagName);
16472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (tagName.equals("layout")) {
16572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return new SmilLayoutElementImpl(this, tagName);
16672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (tagName.equals("root-layout")) {
16772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return new SmilRootLayoutElementImpl(this, tagName);
16872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (tagName.equals("region")) {
16972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return new SmilRegionElementImpl(this, tagName);
17072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (tagName.equals("ref")) {
17172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return new SmilRefElementImpl(this, tagName);
17272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else if (tagName.equals("par")) {
17372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return new SmilParElementImpl(this, tagName);
17472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else {
17572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // This includes also the structural nodes SMIL,
17672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // HEAD, BODY, for which no specific types are defined.
17772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return new SmilElementImpl(this, tagName);
17872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
17972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
18072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
18172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    @Override
18272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public SMILElement getDocumentElement() {
18372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Node rootElement = getFirstChild();
18472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (rootElement == null || !(rootElement instanceof SMILElement)) {
18572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // The root doesn't exist. Create a new one.
18672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            rootElement = createElement("smil");
18772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            appendChild(rootElement);
18872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
18972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
19072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return (SMILElement) rootElement;
19172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
19272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
19372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /*
19472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * SMILElement Interface
19572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
19672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
19772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public SMILElement getHead() {
19872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Node rootElement = getDocumentElement();
19972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Node headElement = rootElement.getFirstChild();
20072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (headElement == null || !(headElement instanceof SMILElement)) {
20172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // The head doesn't exist. Create a new one.
20272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            headElement = createElement("head");
20372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            rootElement.appendChild(headElement);
20472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
20572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
20672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return (SMILElement) headElement;
20772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
20872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
20972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public SMILElement getBody() {
21072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Node rootElement = getDocumentElement();
21172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Node headElement = getHead();
21272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Node bodyElement = headElement.getNextSibling();
21372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (bodyElement == null || !(bodyElement instanceof SMILElement)) {
21472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // The body doesn't exist. Create a new one.
21572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            bodyElement = createElement("body");
21672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            rootElement.appendChild(bodyElement);
21772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
21872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
21972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Initialize the real sequential time container, which is body.
22072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        mSeqTimeContainer = new ElementSequentialTimeContainerImpl((SMILElement) bodyElement) {
22172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            public NodeList getTimeChildren() {
22272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                return getBody().getElementsByTagName("par");
22372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
22472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
22572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            public boolean beginElement() {
22672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                Event startEvent = createEvent("Event");
22772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                startEvent.initEvent(SMIL_DOCUMENT_START_EVENT, false, false);
22872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                dispatchEvent(startEvent);
22972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                return true;
23072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
23172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
23272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            public boolean endElement() {
23372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                Event endEvent = createEvent("Event");
23472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                endEvent.initEvent(SMIL_DOCUMENT_END_EVENT, false, false);
23572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                dispatchEvent(endEvent);
23672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                return true;
23772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
23872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
23972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            public void pauseElement() {
24072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                // TODO Auto-generated method stub
24172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
24272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
24372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
24472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            public void resumeElement() {
24572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                // TODO Auto-generated method stub
24672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
24772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
24872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
24972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            public void seekElement(float seekTo) {
25072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                // TODO Auto-generated method stub
25172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
25272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
25372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
25472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            ElementTime getParentElementTime() {
25572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                return null;
25672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            }
25772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        };
25872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
25972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return (SMILElement) bodyElement;
26072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
26172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
26272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public SMILLayoutElement getLayout() {
26372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Node headElement = getHead();
26472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        Node layoutElement = null;
26572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
26672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        // Find the layout element under <code>HEAD</code>
26772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        layoutElement = headElement.getFirstChild();
26872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        while ((layoutElement != null) && !(layoutElement instanceof SMILLayoutElement)) {
26972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            layoutElement = layoutElement.getNextSibling();
27072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
27172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
27272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if (layoutElement == null) {
27372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            // The layout doesn't exist. Create a default one.
27472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            layoutElement = new SmilLayoutElementImpl(this, "layout");
27572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            headElement.appendChild(layoutElement);
27672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
27772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        return (SMILLayoutElement) layoutElement;
27872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
27972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project
28072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    /*
28172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     * DocumentEvent Interface
28272735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project     */
28372735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    public Event createEvent(String eventType) throws DOMException {
28472735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        if ("Event".equals(eventType)) {
28572735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            return new EventImpl();
28672735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        } else {
28772735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project            throw new DOMException(DOMException.NOT_SUPPORTED_ERR,
28872735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project                       "Not supported interface");
28972735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project        }
29072735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project    }
29172735c62aba8fd2a9420a0f9f83d22543e3c164fThe Android Open Source Project}
292