421 lines · 15.3 KB · Java
RawDownload
/* * Copyright (c) 1997, 2008, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.  Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */package javax.swing.text.rtf; import javax.swing.text.StyleConstants;import javax.swing.text.AttributeSet;import javax.swing.text.MutableAttributeSet;import javax.swing.text.TabStop;import java.util.*;import java.io.IOException; class RTFAttributes{    static RTFAttribute attributes[];     static {        Vector<RTFAttribute> a = new Vector<RTFAttribute>();        int CHR = RTFAttribute.D_CHARACTER;        int PGF = RTFAttribute.D_PARAGRAPH;        int SEC = RTFAttribute.D_SECTION;        int DOC = RTFAttribute.D_DOCUMENT;        int PST = RTFAttribute.D_META;        Boolean True = Boolean.valueOf(true);        Boolean False = Boolean.valueOf(false);         a.addElement(new BooleanAttribute(CHR, StyleConstants.Italic, "i"));        a.addElement(new BooleanAttribute(CHR, StyleConstants.Bold, "b"));        a.addElement(new BooleanAttribute(CHR, StyleConstants.Underline, "ul"));        a.addElement(NumericAttribute.NewTwips(PGF, StyleConstants.LeftIndent, "li",                                        0f, 0));        a.addElement(NumericAttribute.NewTwips(PGF, StyleConstants.RightIndent, "ri",                                        0f, 0));        a.addElement(NumericAttribute.NewTwips(PGF, StyleConstants.FirstLineIndent, "fi",                                        0f, 0));         a.addElement(new AssertiveAttribute(PGF, StyleConstants.Alignment,                                            "ql", StyleConstants.ALIGN_LEFT));        a.addElement(new AssertiveAttribute(PGF, StyleConstants.Alignment,                                            "qr", StyleConstants.ALIGN_RIGHT));        a.addElement(new AssertiveAttribute(PGF, StyleConstants.Alignment,                                            "qc", StyleConstants.ALIGN_CENTER));        a.addElement(new AssertiveAttribute(PGF, StyleConstants.Alignment,                                            "qj", StyleConstants.ALIGN_JUSTIFIED));        a.addElement(NumericAttribute.NewTwips(PGF, StyleConstants.SpaceAbove,                                        "sa", 0));        a.addElement(NumericAttribute.NewTwips(PGF, StyleConstants.SpaceBelow,                                        "sb", 0));         a.addElement(new AssertiveAttribute(PST, RTFReader.TabAlignmentKey,                                            "tqr", TabStop.ALIGN_RIGHT));        a.addElement(new AssertiveAttribute(PST, RTFReader.TabAlignmentKey,                                            "tqc", TabStop.ALIGN_CENTER));        a.addElement(new AssertiveAttribute(PST, RTFReader.TabAlignmentKey,                                            "tqdec", TabStop.ALIGN_DECIMAL));          a.addElement(new AssertiveAttribute(PST, RTFReader.TabLeaderKey,                                            "tldot", TabStop.LEAD_DOTS));        a.addElement(new AssertiveAttribute(PST, RTFReader.TabLeaderKey,                                            "tlhyph", TabStop.LEAD_HYPHENS));        a.addElement(new AssertiveAttribute(PST, RTFReader.TabLeaderKey,                                            "tlul", TabStop.LEAD_UNDERLINE));        a.addElement(new AssertiveAttribute(PST, RTFReader.TabLeaderKey,                                            "tlth", TabStop.LEAD_THICKLINE));        a.addElement(new AssertiveAttribute(PST, RTFReader.TabLeaderKey,                                            "tleq", TabStop.LEAD_EQUALS));         /* The following aren't actually recognized by Swing */        a.addElement(new BooleanAttribute(CHR, Constants.Caps,      "caps"));        a.addElement(new BooleanAttribute(CHR, Constants.Outline,   "outl"));        a.addElement(new BooleanAttribute(CHR, Constants.SmallCaps, "scaps"));        a.addElement(new BooleanAttribute(CHR, Constants.Shadow,    "shad"));        a.addElement(new BooleanAttribute(CHR, Constants.Hidden,    "v"));        a.addElement(new BooleanAttribute(CHR, Constants.Strikethrough,                                               "strike"));        a.addElement(new BooleanAttribute(CHR, Constants.Deleted,                                               "deleted"));           a.addElement(new AssertiveAttribute(DOC, "saveformat", "defformat", "RTF"));        a.addElement(new AssertiveAttribute(DOC, "landscape", "landscape"));         a.addElement(NumericAttribute.NewTwips(DOC, Constants.PaperWidth,                                               "paperw", 12240));        a.addElement(NumericAttribute.NewTwips(DOC, Constants.PaperHeight,                                               "paperh", 15840));        a.addElement(NumericAttribute.NewTwips(DOC, Constants.MarginLeft,                                               "margl",  1800));        a.addElement(NumericAttribute.NewTwips(DOC, Constants.MarginRight,                                               "margr",  1800));        a.addElement(NumericAttribute.NewTwips(DOC, Constants.MarginTop,                                               "margt",  1440));        a.addElement(NumericAttribute.NewTwips(DOC, Constants.MarginBottom,                                               "margb",  1440));        a.addElement(NumericAttribute.NewTwips(DOC, Constants.GutterWidth,                                               "gutter", 0));         a.addElement(new AssertiveAttribute(PGF, Constants.WidowControl,                                            "nowidctlpar", False));        a.addElement(new AssertiveAttribute(PGF, Constants.WidowControl,                                            "widctlpar", True));        a.addElement(new AssertiveAttribute(DOC, Constants.WidowControl,                                            "widowctrl", True));          RTFAttribute[] attrs = new RTFAttribute[a.size()];        a.copyInto(attrs);        attributes = attrs;    }     static Dictionary<String, RTFAttribute> attributesByKeyword()    {        Dictionary<String, RTFAttribute> d = new Hashtable<String, RTFAttribute>(attributes.length);         for (RTFAttribute attribute : attributes) {            d.put(attribute.rtfName(), attribute);        }         return d;    }     /************************************************************************/    /************************************************************************/     static abstract class GenericAttribute    {        int domain;        Object swingName;        String rtfName;         protected GenericAttribute(int d,Object s, String r)        {            domain = d;            swingName = s;            rtfName = r;        }         public int domain() { return domain; }        public Object swingName() { return swingName; }        public String rtfName() { return rtfName; }         abstract boolean set(MutableAttributeSet target);        abstract boolean set(MutableAttributeSet target, int parameter);        abstract boolean setDefault(MutableAttributeSet target);         public boolean write(AttributeSet source,                             RTFGenerator target,                             boolean force)            throws IOException        {            return writeValue(source.getAttribute(swingName), target, force);        }         public boolean writeValue(Object value, RTFGenerator target,                                  boolean force)            throws IOException        {            return false;        }    }     static class BooleanAttribute        extends GenericAttribute        implements RTFAttribute    {        boolean rtfDefault;        boolean swingDefault;         protected static final Boolean True = Boolean.valueOf(true);        protected static final Boolean False = Boolean.valueOf(false);         public BooleanAttribute(int d, Object s,                                String r, boolean ds, boolean dr)        {            super(d, s, r);            swingDefault = ds;            rtfDefault = dr;        }         public BooleanAttribute(int d, Object s, String r)        {            super(d, s, r);             swingDefault = false;            rtfDefault = false;        }         public boolean set(MutableAttributeSet target)        {            /* TODO: There's some ambiguity about whether this should               *set* or *toggle* the attribute. */            target.addAttribute(swingName, True);             return true;  /* true indicates we were successful */        }         public boolean set(MutableAttributeSet target, int parameter)        {            /* See above note in the case that parameter==1 */            Boolean value = ( parameter != 0 ? True : False );             target.addAttribute(swingName, value);             return true; /* true indicates we were successful */        }         public boolean setDefault(MutableAttributeSet target)        {            if (swingDefault != rtfDefault ||                ( target.getAttribute(swingName) != null ) )              target.addAttribute(swingName, Boolean.valueOf(rtfDefault));            return true;        }         public boolean writeValue(Object o_value,                                  RTFGenerator target,                                  boolean force)            throws IOException        {            Boolean val;             if (o_value == null)              val = Boolean.valueOf(swingDefault);            else              val = (Boolean)o_value;             if (force || (val.booleanValue() != rtfDefault)) {                if (val.booleanValue()) {                    target.writeControlWord(rtfName);                } else {                    target.writeControlWord(rtfName, 0);                }            }            return true;        }    }      static class AssertiveAttribute        extends GenericAttribute        implements RTFAttribute    {        Object swingValue;         public AssertiveAttribute(int d, Object s, String r)        {            super(d, s, r);            swingValue = Boolean.valueOf(true);        }         public AssertiveAttribute(int d, Object s, String r, Object v)        {            super(d, s, r);            swingValue = v;        }         public AssertiveAttribute(int d, Object s, String r, int v)        {            super(d, s, r);            swingValue = Integer.valueOf(v);        }         public boolean set(MutableAttributeSet target)        {            if (swingValue == null)                target.removeAttribute(swingName);            else                target.addAttribute(swingName, swingValue);             return true;        }         public boolean set(MutableAttributeSet target, int parameter)        {            return false;        }         public boolean setDefault(MutableAttributeSet target)        {            target.removeAttribute(swingName);            return true;        }         public boolean writeValue(Object value,                                  RTFGenerator target,                                  boolean force)            throws IOException        {            if (value == null) {                return ! force;            }             if (value.equals(swingValue)) {                target.writeControlWord(rtfName);                return true;            }             return ! force;        }    }      static class NumericAttribute        extends GenericAttribute        implements RTFAttribute    {        int rtfDefault;        Number swingDefault;        float scale;         protected NumericAttribute(int d, Object s, String r)        {            super(d, s, r);            rtfDefault = 0;            swingDefault = null;            scale = 1f;        }         public NumericAttribute(int d, Object s,                                String r, int ds, int dr)        {            this(d, s, r, Integer.valueOf(ds), dr, 1f);        }         public NumericAttribute(int d, Object s,                                String r, Number ds, int dr, float sc)        {            super(d, s, r);            swingDefault = ds;            rtfDefault = dr;            scale = sc;        }         public static NumericAttribute NewTwips(int d, Object s, String r,                                                float ds, int dr)        {            return new NumericAttribute(d, s, r, new Float(ds), dr, 20f);        }         public static NumericAttribute NewTwips(int d, Object s, String r,                                                int dr)        {            return new NumericAttribute(d, s, r, null, dr, 20f);        }         public boolean set(MutableAttributeSet target)        {            return false;        }         public boolean set(MutableAttributeSet target, int parameter)        {            Number swingValue;             if (scale == 1f)                swingValue = Integer.valueOf(parameter);            else                swingValue = new Float(parameter / scale);            target.addAttribute(swingName, swingValue);            return true;        }         public boolean setDefault(MutableAttributeSet target)        {            Number old = (Number)target.getAttribute(swingName);            if (old == null)                old = swingDefault;            if (old != null && (                    (scale == 1f && old.intValue() == rtfDefault) ||                    (Math.round(old.floatValue() * scale) == rtfDefault)               ))                return true;            set(target, rtfDefault);            return true;        }         public boolean writeValue(Object o_value,                                  RTFGenerator target,                                  boolean force)            throws IOException        {            Number value = (Number)o_value;            if (value == null)                value = swingDefault;            if (value == null) {                /* TODO: What is the proper behavior if the Swing object does                   not specify a value, and we don't know its default value?                   Currently we pretend that the RTF default value is                   equivalent (probably a workable assumption) */                return true;            }            int int_value = Math.round(value.floatValue() * scale);            if (force || (int_value != rtfDefault))                target.writeControlWord(rtfName, int_value);            return true;        }    }}