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: Mspace.java,v b2e8c71e4a50 2009/09/10 14:00:50 max $ */
018    
019    package net.sourceforge.jeuclid.elements.presentation.token;
020    
021    import net.sourceforge.jeuclid.Constants;
022    import net.sourceforge.jeuclid.LayoutContext;
023    import net.sourceforge.jeuclid.elements.AbstractJEuclidElement;
024    import net.sourceforge.jeuclid.elements.support.attributes.AttributesHelper;
025    import net.sourceforge.jeuclid.layout.LayoutInfo;
026    import net.sourceforge.jeuclid.layout.LayoutStage;
027    import net.sourceforge.jeuclid.layout.LayoutView;
028    
029    import org.apache.batik.dom.AbstractDocument;
030    import org.w3c.dom.Node;
031    import org.w3c.dom.mathml.MathMLSpaceElement;
032    
033    /**
034     * This class presents a mspace.
035     * 
036     * <p>
037     * TODO: linebreak is unimplemented
038     * 
039     * @version $Revision: b2e8c71e4a50 $
040     */
041    public final class Mspace extends AbstractJEuclidElement implements
042            MathMLSpaceElement {
043    
044        /**
045         * The XML element from this class.
046         */
047        public static final String ELEMENT = "mspace";
048    
049        /** Attribute for width. */
050        public static final String ATTR_WIDTH = "width";
051    
052        /** Attribute for height. */
053        public static final String ATTR_HEIGHT = "height";
054    
055        /** Attribute for depth. */
056        public static final String ATTR_DEPTH = "depth";
057    
058        /** Attribute for linebreak. */
059        public static final String ATTR_LINEBREAK = "linebreak";
060    
061        private static final long serialVersionUID = 1L;
062    
063        /**
064         * Default constructor. Sets MathML Namespace.
065         * 
066         * @param qname
067         *            Qualified name.
068         * @param odoc
069         *            Owner Document.
070         */
071        public Mspace(final String qname, final AbstractDocument odoc) {
072            super(qname, odoc);
073    
074            this.setDefaultMathAttribute(Mspace.ATTR_DEPTH, Constants.ZERO);
075            this.setDefaultMathAttribute(Mspace.ATTR_HEIGHT, Constants.ZERO);
076            this.setDefaultMathAttribute(Mspace.ATTR_WIDTH, Constants.ZERO);
077            this.setDefaultMathAttribute(Mspace.ATTR_LINEBREAK, "auto");
078        }
079    
080        /** {@inheritDoc} */
081        @Override
082        protected Node newNode() {
083            return new Mspace(this.nodeName, this.ownerDocument);
084        }
085    
086        /**
087         * @return Space width
088         */
089        public String getWidth() {
090            return this.getMathAttribute(Mspace.ATTR_WIDTH);
091        }
092    
093        /**
094         * @param width
095         *            Space width
096         */
097        public void setWidth(final String width) {
098            this.setAttribute(Mspace.ATTR_WIDTH, width);
099        }
100    
101        /**
102         * @return Space height
103         */
104        public String getHeight() {
105            return this.getMathAttribute(Mspace.ATTR_HEIGHT);
106        }
107    
108        /**
109         * @param height
110         *            Space height
111         */
112        public void setHeight(final String height) {
113            this.setAttribute(Mspace.ATTR_HEIGHT, height);
114        }
115    
116        /**
117         * @return Space depth
118         */
119        public String getDepth() {
120            return this.getMathAttribute(Mspace.ATTR_DEPTH);
121        }
122    
123        /**
124         * @param depth
125         *            Space depth
126         */
127        public void setDepth(final String depth) {
128            this.setAttribute(Mspace.ATTR_DEPTH, depth);
129        }
130    
131        /** {@inheritDoc} */
132        @Override
133        protected void layoutStageInvariant(final LayoutView view,
134                final LayoutInfo info, final LayoutStage stage,
135                final LayoutContext context) {
136            final LayoutContext now = this.applyLocalAttributesToContext(context);
137            info.setAscentHeight(AttributesHelper.convertSizeToPt(this.getHeight(),
138                    now, AttributesHelper.PT), stage);
139            info.setDescentHeight(AttributesHelper.convertSizeToPt(this.getDepth(),
140                    now, AttributesHelper.PT), stage);
141            info.setWidth(AttributesHelper.convertSizeToPt(this.getWidth(), now,
142                    AttributesHelper.PT), stage);
143        }
144    
145        /** {@inheritDoc} */
146        public String getLinebreak() {
147            return this.getMathAttribute(Mspace.ATTR_LINEBREAK);
148        }
149    
150        /** {@inheritDoc} */
151        public void setLinebreak(final String linebreak) {
152            this.setAttribute(Mspace.ATTR_LINEBREAK, linebreak);
153        }
154    }