001 /* 002 * Copyright 2002 - 2009 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: DocumentElement.java,v 371548310efa 2010/08/09 21:15:33 max $ */ 018 019 package net.sourceforge.jeuclid.elements.generic; 020 021 import java.awt.Color; 022 import java.util.List; 023 024 import net.sourceforge.jeuclid.LayoutContext; 025 import net.sourceforge.jeuclid.context.LayoutContextImpl; 026 import net.sourceforge.jeuclid.context.Parameter; 027 import net.sourceforge.jeuclid.elements.JEuclidElementFactory; 028 import net.sourceforge.jeuclid.elements.JEuclidNode; 029 import net.sourceforge.jeuclid.elements.support.ElementListSupport; 030 import net.sourceforge.jeuclid.layout.JEuclidView; 031 import net.sourceforge.jeuclid.layout.LayoutInfo; 032 import net.sourceforge.jeuclid.layout.LayoutStage; 033 import net.sourceforge.jeuclid.layout.LayoutView; 034 import net.sourceforge.jeuclid.layout.LayoutableDocument; 035 import net.sourceforge.jeuclid.layout.LayoutableNode; 036 037 import org.apache.batik.dom.GenericDocument; 038 import org.w3c.dom.DocumentType; 039 import org.w3c.dom.Element; 040 import org.w3c.dom.Node; 041 import org.w3c.dom.mathml.MathMLDocument; 042 import org.w3c.dom.views.DocumentView; 043 044 /** 045 * Class for MathML Document Nodes. 046 * 047 * @version $Revision: 371548310efa $ 048 */ 049 public final class DocumentElement extends GenericDocument implements 050 MathMLDocument, JEuclidNode, DocumentView, LayoutableDocument { 051 052 private static final long serialVersionUID = 1L; 053 054 /** 055 * Creates a math element. 056 * 057 */ 058 public DocumentElement() { 059 this(null); 060 } 061 062 /** 063 * Creates a MathML compatible document with the given DocumentType. 064 * 065 * @param doctype 066 * DocumentType to use. This is currently ignored. 067 */ 068 public DocumentElement(final DocumentType doctype) { 069 super(doctype, JEuclidDOMImplementation.getInstance()); 070 super.setEventsEnabled(true); 071 this.ownerDocument = this; 072 } 073 074 /** {@inheritDoc} */ 075 public String getDomain() { 076 throw new UnsupportedOperationException(); 077 } 078 079 /** {@inheritDoc} */ 080 public String getReferrer() { 081 throw new UnsupportedOperationException(); 082 } 083 084 /** {@inheritDoc} */ 085 public String getURI() { 086 throw new UnsupportedOperationException(); 087 } 088 089 /** {@inheritDoc} */ 090 public LayoutContext getChildLayoutContext(final int childNum, 091 final LayoutContext context) { 092 return context; 093 } 094 095 /** {@inheritDoc} */ 096 // CHECKSTYLE:OFF 097 public JEuclidView getDefaultView() { 098 // CHECKSTYLE:ON 099 return new JEuclidView(this, 100 LayoutContextImpl.getDefaultLayoutContext(), null); 101 } 102 103 /** {@inheritDoc} */ 104 public List<LayoutableNode> getChildrenToLayout() { 105 return ElementListSupport.createListOfLayoutChildren(this); 106 } 107 108 /** {@inheritDoc} */ 109 public List<LayoutableNode> getChildrenToDraw() { 110 return ElementListSupport.createListOfLayoutChildren(this); 111 } 112 113 /** {@inheritDoc} */ 114 public void layoutStage1(final LayoutView view, final LayoutInfo info, 115 final LayoutStage childMinStage, final LayoutContext context) { 116 ElementListSupport.layoutSequential(view, info, this 117 .getChildrenToLayout(), LayoutStage.STAGE1); 118 info.setLayoutStage(childMinStage); 119 // TODO: This should be done in a better way. 120 if (context.getParameter(Parameter.MATHBACKGROUND) == null) { 121 info.setLayoutStage(childMinStage); 122 } else { 123 info.setLayoutStage(LayoutStage.STAGE1); 124 } 125 } 126 127 /** {@inheritDoc} */ 128 public void layoutStage2(final LayoutView view, final LayoutInfo info, 129 final LayoutContext context) { 130 ElementListSupport.layoutSequential(view, info, this 131 .getChildrenToLayout(), LayoutStage.STAGE2); 132 ElementListSupport.addBackground((Color) context 133 .getParameter(Parameter.MATHBACKGROUND), info, true); 134 info.setLayoutStage(LayoutStage.STAGE2); 135 } 136 137 /** {@inheritDoc} */ 138 @Override 139 protected Node newNode() { 140 return new DocumentElement(); 141 } 142 143 /** {@inheritDoc} */ 144 @Override 145 public Element createElement(final String tagName) { 146 return JEuclidElementFactory.elementFromName(null, tagName, this); 147 } 148 149 /** {@inheritDoc} */ 150 @Override 151 public Element createElementNS(final String namespaceURI, 152 final String qualifiedName) { 153 final String ns; 154 if (namespaceURI != null && namespaceURI.length() == 0) { 155 ns = null; 156 } else { 157 ns = namespaceURI; 158 } 159 return JEuclidElementFactory.elementFromName(ns, qualifiedName, this); 160 } 161 }