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: MathComponent.java,v 03dc0884e86f 2008/06/21 10:53:35 maxberger $ */
018    
019    package net.sourceforge.jeuclid.awt;
020    
021    import java.awt.Component;
022    import java.awt.Dimension;
023    import java.awt.Graphics;
024    import java.awt.Graphics2D;
025    
026    import net.sourceforge.jeuclid.MutableLayoutContext;
027    import net.sourceforge.jeuclid.context.LayoutContextImpl;
028    import net.sourceforge.jeuclid.context.Parameter;
029    import net.sourceforge.jeuclid.layout.JEuclidView;
030    
031    import org.w3c.dom.Document;
032    
033    /**
034     * A class for displaying MathML content in a AWT Component.
035     * 
036     * @see net.sourceforge.jeuclid.swing.JMathComponent
037     * @version $Revision: 03dc0884e86f $
038     */
039    public class MathComponent extends Component {
040        /**
041         * Logger for this class
042         */
043        // currently unused
044        // private static final Logger LOGGER =
045        // Logger.getLogger(MathComponent.class
046        // .getName());
047        /**
048         * 
049         */
050        private static final long serialVersionUID = 1L;
051    
052        /**
053         * Reference to the MathBase class.
054         */
055        private transient JEuclidView view;
056    
057        private Document document;
058    
059        private MutableLayoutContext parameters = new LayoutContextImpl(
060                LayoutContextImpl.getDefaultLayoutContext());
061    
062        /**
063         * Default constructor.
064         */
065        public MathComponent() {
066            // do nothing.
067        }
068    
069        /**
070         * Sets the rendering parameters.
071         * 
072         * @param newParameters
073         *            the set of parameters.
074         */
075        public final void setParameters(final MutableLayoutContext newParameters) {
076            this.parameters = newParameters;
077        }
078    
079        /**
080         * @return the document
081         */
082        public Document getDocument() {
083            return this.document;
084        }
085    
086        /**
087         * Gets the minimum size of this component.
088         * 
089         * @return A dimension object indicating this component's minimum size.
090         */
091        @Override
092        public Dimension getMinimumSize() {
093            if (this.view == null) {
094                return new Dimension(1, 1);
095            } else {
096                return new Dimension((int) Math.ceil(this.view.getWidth()),
097                        (int) Math.ceil(this.view.getAscentHeight()
098                                + (int) Math.ceil(this.view.getDescentHeight())));
099            }
100        }
101    
102        /**
103         * Gets the preferred size of this component.
104         * 
105         * @return A dimension object indicating this component's preferred size.
106         */
107        @Override
108        public Dimension getPreferredSize() {
109            return this.getMinimumSize();
110        }
111    
112        /**
113         * Paints this component.
114         * 
115         * @param g
116         *            The graphics context to use for painting.
117         */
118        @Override
119        public void paint(final Graphics g) {
120            super.paint(g);
121            if (this.view != null) {
122                this.view.draw((Graphics2D) g, 0, (int) Math.ceil(this.view
123                        .getAscentHeight()));
124            }
125        }
126    
127        private void redo() {
128            final Graphics2D g2d = (Graphics2D) this.getGraphics();
129            if ((this.document == null) || (g2d == null)) {
130                this.view = null;
131            } else {
132                this.view = new JEuclidView(this.document, this.parameters, g2d);
133            }
134            this.repaint();
135        }
136    
137        /**
138         * Enables, or disables the debug mode.
139         * 
140         * @param debugMode
141         *            Debug mode.
142         */
143        public void setDebug(final boolean debugMode) {
144            this.parameters.setParameter(Parameter.DEBUG, debugMode);
145            this.redo();
146        }
147    
148        /**
149         * @param newDocument
150         *            the document to set
151         */
152        public void setDocument(final Document newDocument) {
153            this.document = newDocument;
154            this.redo();
155        }
156    
157    }