001 /* 002 * Copyright 2002 - 2007 JEuclid, http://jeuclid.sf.net 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017 /* $Id: Semantics.java,v bc1d5fde7b73 2009/06/01 14:40:54 maxberger $ */ 018 019 package net.sourceforge.jeuclid.elements.content.semantic; 020 021 import net.sourceforge.jeuclid.elements.presentation.AbstractContainer; 022 023 import org.apache.batik.dom.AbstractDocument; 024 import org.w3c.dom.Node; 025 import org.w3c.dom.mathml.MathMLElement; 026 import org.w3c.dom.mathml.MathMLSemanticsElement; 027 028 /** 029 * This class represents a semantics element. 030 * 031 * @version $Revision: bc1d5fde7b73 $ 032 */ 033 public final class Semantics extends AbstractContainer implements 034 MathMLSemanticsElement { 035 036 /** 037 * The XML element from this class. 038 */ 039 public static final String ELEMENT = "semantics"; 040 041 private static final long serialVersionUID = 1L; 042 043 /** 044 * Default constructor. Sets MathML Namespace. 045 * 046 * @param qname 047 * Qualified name. 048 * @param odoc 049 * Owner Document. 050 */ 051 public Semantics(final String qname, final AbstractDocument odoc) { 052 super(qname, odoc); 053 } 054 055 /** {@inheritDoc} */ 056 @Override 057 protected Node newNode() { 058 return new Semantics(this.nodeName, this.ownerDocument); 059 } 060 061 /** {@inheritDoc} */ 062 public void deleteAnnotation(final int index) { 063 this.removeAnnotation(index); 064 } 065 066 /** {@inheritDoc} */ 067 public MathMLElement getAnnotation(final int index) { 068 // Index is 1-based! 069 return (MathMLElement) this.getChildNodes().item(index); 070 } 071 072 /** {@inheritDoc} */ 073 public MathMLElement getBody() { 074 return (MathMLElement) this.getFirstChild(); 075 } 076 077 /** {@inheritDoc} */ 078 public int getNAnnotations() { 079 return Math.max(0, this.getChildNodes().getLength() - 1); 080 } 081 082 /** {@inheritDoc} */ 083 public MathMLElement insertAnnotation(final MathMLElement newAnnotation, 084 final int index) { 085 if (index == 0) { 086 if (this.getNAnnotations() == 0) { 087 this.setAnnotation(newAnnotation, 1); 088 } else { 089 this.addMathElement(newAnnotation); 090 } 091 } else { 092 final MathMLElement oldChild = this.getAnnotation(index); 093 if (oldChild == null) { 094 this.setAnnotation(newAnnotation, index); 095 } else { 096 this.insertBefore(newAnnotation, oldChild); 097 } 098 } 099 return newAnnotation; 100 } 101 102 /** {@inheritDoc} */ 103 public MathMLElement removeAnnotation(final int index) { 104 final MathMLElement oldChild = this.getAnnotation(index); 105 return (MathMLElement) this.removeChild(oldChild); 106 } 107 108 /** {@inheritDoc} */ 109 public MathMLElement setAnnotation(final MathMLElement newAnnotation, 110 final int index) { 111 // Index is 1-based! 112 this.setMathElement(index, newAnnotation); 113 return newAnnotation; 114 } 115 116 /** {@inheritDoc} */ 117 public void setBody(final MathMLElement body) { 118 this.setMathElement(0, body); 119 } 120 121 }