001    /*
002     * Copyright 2002 - 2008 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: LayoutContextImpl.java,v 896e3a9ebb36 2008/11/28 13:39:06 maxberger $ */
018    
019    package net.sourceforge.jeuclid.context;
020    
021    import java.awt.Color;
022    import java.io.Serializable;
023    import java.util.ArrayList;
024    import java.util.Collections;
025    import java.util.List;
026    import java.util.Map;
027    import java.util.TreeMap;
028    
029    import net.sourceforge.jeuclid.Constants;
030    import net.sourceforge.jeuclid.LayoutContext;
031    import net.sourceforge.jeuclid.MutableLayoutContext;
032    
033    /**
034     * @version $Revision: 896e3a9ebb36 $
035     */
036    public class LayoutContextImpl implements MutableLayoutContext, Serializable {
037    
038        /**
039         * 
040         */
041        private static final long serialVersionUID = 1L;
042    
043        private static final class SingletonHolder {
044            private static final LayoutContextImpl INSTANCE = new LayoutContextImpl();
045    
046            private SingletonHolder() {
047            }
048        }
049    
050        private final Map<Parameter, Object> context;
051    
052        // CHECKSTYLE:OFF
053        /**
054         * Default constructor.
055         */
056        protected LayoutContextImpl() {
057            this.context = new TreeMap<Parameter, Object>();
058            this.context.put(Parameter.MATHSIZE, Constants.DEFAULT_FONTSIZE);
059            this.context.put(Parameter.SCRIPTMINSIZE, 8f);
060            this.context.put(Parameter.ANTIALIAS_MINSIZE, 10f);
061            this.context.put(Parameter.SCRIPTSIZEMULTIPLIER,
062                    Constants.DEFAULT_SCIPTSIZEMULTIPLIER);
063            this.context.put(Parameter.SCRIPTLEVEL, 0);
064            this.context.put(Parameter.DISPLAY, Display.BLOCK);
065            this.context.put(Parameter.DEBUG, false);
066            this.context.put(Parameter.ANTIALIAS, true);
067            this.context.put(Parameter.MATHCOLOR, Color.BLACK);
068            this.context.put(Parameter.MATHBACKGROUND, null);
069    
070            final List<String> fontsSanserif = new ArrayList<String>(12);
071            fontsSanserif.add("Verdana");
072            fontsSanserif.add("Helvetica");
073            fontsSanserif.add("Arial");
074            fontsSanserif.add("Arial Unicode MS");
075            fontsSanserif.add("Lucida Sans Unicode");
076            fontsSanserif.add("Lucida Sans");
077            fontsSanserif.add("Lucida Grande");
078            fontsSanserif.add("DejaVu Sans");
079            fontsSanserif.add("DejaVuSans");
080            fontsSanserif.add("Bitstream Vera Sans");
081            fontsSanserif.add("Luxi Sans");
082            fontsSanserif.add("FreeSans");
083            fontsSanserif.add("sansserif");
084            this.context.put(Parameter.FONTS_SANSSERIF, Collections
085                    .unmodifiableList(fontsSanserif));
086    
087            final List<String> fontsSerif = new ArrayList<String>(10);
088            fontsSerif.add("Constantina");
089            fontsSerif.add("Cambria");
090            fontsSerif.add("Times");
091            fontsSerif.add("Times New Roman");
092            fontsSerif.add("Lucida Bright");
093            fontsSerif.add("DejaVu Serif");
094            fontsSerif.add("DejaVuSerif");
095            fontsSerif.add("Bitstream Vera Serif");
096            fontsSerif.add("Luxi Serif");
097            fontsSerif.add("FreeSerif");
098            fontsSerif.add("serif");
099            this.context.put(Parameter.FONTS_SERIF, Collections
100                    .unmodifiableList(fontsSerif));
101    
102            final List<String> fontsMonospaced = new ArrayList<String>(10);
103            fontsMonospaced.add("Andale Mono");
104            fontsMonospaced.add("Courier");
105            fontsMonospaced.add("Courier Mono");
106            fontsMonospaced.add("Courier New");
107            fontsMonospaced.add("Lucida Sans Typewriter");
108            fontsMonospaced.add("DejaVu Sans Mono");
109            fontsMonospaced.add("DejaVuSansMono");
110            fontsMonospaced.add("Bitstream Vera Sans Mono");
111            fontsMonospaced.add("Luxi Mono");
112            fontsMonospaced.add("FreeMono");
113            fontsMonospaced.add("monospaced");
114            this.context.put(Parameter.FONTS_MONOSPACED, Collections
115                    .unmodifiableList(fontsMonospaced));
116    
117            final List<String> fontsScript = new ArrayList<String>(12);
118            fontsScript.add("EUSM10");
119            fontsScript.add("cmsy10");
120            fontsScript.add("Math5");
121            fontsScript.add("Mathematica5");
122            fontsScript.add("Savoye LET");
123            fontsScript.add("Brush Script MT");
124            fontsScript.add("Zapfino");
125            fontsScript.add("Apple Chancery");
126            fontsScript.add("Edwardian Script ITC");
127            fontsScript.add("Lucida Handwriting");
128            fontsScript.add("Monotype Corsiva");
129            fontsScript.add("Santa Fe LET");
130            this.context.put(Parameter.FONTS_SCRIPT, Collections
131                    .unmodifiableList(fontsScript));
132    
133            final List<String> fontsFraktur = new ArrayList<String>(7);
134            fontsFraktur.add("EUFM10");
135            fontsFraktur.add("Mathematica6");
136            fontsFraktur.add("FetteFraktur");
137            fontsFraktur.add("Fette Fraktur");
138            fontsFraktur.add("Euclid Fraktur");
139            fontsFraktur.add("Lucida Blackletter");
140            fontsFraktur.add("Blackmoor LET");
141            this.context.put(Parameter.FONTS_FRAKTUR, Collections
142                    .unmodifiableList(fontsFraktur));
143    
144            final List<String> fontsDoublestruck = new ArrayList<String>(8);
145            fontsDoublestruck.add("MSBM10");
146            fontsDoublestruck.add("Mathematica7");
147            fontsDoublestruck.add("Caslon Open Face");
148            fontsDoublestruck.add("Caslon Openface");
149            fontsDoublestruck.add("Cloister Open Face");
150            fontsDoublestruck.add("Academy Engraved LET");
151            fontsDoublestruck.add("Colonna MT");
152            fontsDoublestruck.add("Imprint MT Shadow");
153            this.context.put(Parameter.FONTS_DOUBLESTRUCK, Collections
154                    .unmodifiableList(fontsDoublestruck));
155    
156            this.context.put(Parameter.MFRAC_KEEP_SCRIPTLEVEL, Boolean.FALSE);
157            // CHECKSTYLE:ON
158        }
159    
160        /**
161         * Default Constructor.
162         * 
163         * @param copyFromContext
164         *            LayoutContext to use for initialization of values
165         */
166        public LayoutContextImpl(final LayoutContext copyFromContext) {
167    
168            if (copyFromContext instanceof LayoutContextImpl) {
169                this.context = new TreeMap<Parameter, Object>(
170                        ((LayoutContextImpl) copyFromContext).getParameters());
171            } else {
172                throw new UnsupportedOperationException("LayoutContextImpl("
173                        + copyFromContext.getClass() + ") not supported.");
174            }
175        }
176    
177        /**
178         * Retrieve the default layout context.
179         * 
180         * @return the default layout context.
181         */
182        public static LayoutContext getDefaultLayoutContext() {
183            return LayoutContextImpl.SingletonHolder.INSTANCE;
184        }
185    
186        /** {@inheritDoc} */
187        public LayoutContext setParameter(final Parameter which,
188                final Object newValue) {
189            if (which.valid(newValue)) {
190                this.context.put(which, newValue);
191            } else {
192                this.context.put(which, which.fromString(newValue.toString()));
193            }
194            return this;
195        }
196    
197        /** {@inheritDoc} */
198        public Object getParameter(final Parameter which) {
199            return this.context.get(which);
200        }
201    
202        /**
203         * Retrieve all parameters set for this LayoutContext. Please note: The
204         * returned map should be treated as read-only.
205         * 
206         * @return all Parameters in this context.
207         */
208        private Map<Parameter, Object> getParameters() {
209            return Collections.unmodifiableMap(this.context);
210        }
211    }