/*
* Copyright (c) 1998, 2014, 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.html;
import java.awt.Color;
import java.awt.Font;
import java.awt.GraphicsEnvironment;
import java.awt.Toolkit;
import java.awt.HeadlessException;
import java.awt.Image;
import java.io.*;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.MalformedURLException;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;
import java.util.Locale;
import javax.swing.ImageIcon;
import javax.swing.SizeRequirements;
import javax.swing.text.*;
/**
* Defines a set of
* CSS attributes
* as a typesafe enumeration. The HTML View implementations use
* CSS attributes to determine how they will render. This also defines
* methods to map between CSS/HTML/StyleConstants. Any shorthand
* properties, such as font, are mapped to the intrinsic properties.
*
The following describes the CSS properties that are supported by the
* rendering engine:
*
font-family
*
font-style
*
font-size (supports relative units)
*
font-weight
*
font
*
color
*
background-color (with the exception of transparent)
*
background-image
*
background-repeat
*
background-position
*
background
*
text-decoration (with the exception of blink and overline)
*
vertical-align (only sup and super)
*
text-align (justify is treated as center)
*
margin-top
*
margin-right
*
margin-bottom
*
margin-left
*
margin
*
padding-top
*
padding-right
*
padding-bottom
*
padding-left
*
padding
*
border-top-style
*
border-right-style
*
border-bottom-style
*
border-left-style
*
border-style (only supports inset, outset and none)
*
border-top-color
*
border-right-color
*
border-bottom-color
*
border-left-color
*
border-color
*
list-style-image
*
list-style-type
*
list-style-position
*
* The following are modeled, but currently not rendered.
*
font-variant
*
background-attachment (background always treated as scroll)
*
word-spacing
*
letter-spacing
*
text-indent
*
text-transform
*
line-height
*
border-top-width (this is used to indicate if a border should be used)
*
border-right-width
*
border-bottom-width
*
border-left-width
*
border-width
*
border-top
*
border-right
*
border-bottom
*
border-left
*
border
*
width
*
height
*
float
*
clear
*
display
*
white-space
*
list-style
*
*
Note: for the time being we do not fully support relative units,
* unless noted, so that
* p { margin-top: 10% } will be treated as if no margin-top was specified.
*
* @author Timothy Prinzing
* @author Scott Violet
* @see StyleSheet
*/
@SuppressWarnings("serial") // Same-version serialization only
public class CSS implements Serializable {
/**
* Definitions to be used as a key on AttributeSet's
* that might hold CSS attributes. Since this is a
* closed set (i.e. defined exactly by the specification),
* it is final and cannot be extended.
*/
public static final class Attribute {
private Attribute(String name, String defaultValue, boolean inherited) {
this.name = name;
this.defaultValue = defaultValue;
this.inherited = inherited;
}
/**
* The string representation of the attribute. This
* should exactly match the string specified in the
* CSS specification.
*/
public String toString() {
return name;
}
/**
* Fetch the default value for the attribute.
* If there is no default value (such as for
* composite attributes), null will be returned.
*
* @return default value for the attribute
*/
public String getDefaultValue() {
return defaultValue;
}
/**
* Indicates if the attribute should be inherited
* from the parent or not.
*
* @return true if the attribute should be inherited from the parent
*/
public boolean isInherited() {
return inherited;
}
private String name;
private String defaultValue;
private boolean inherited;
/**
* CSS attribute "background".
*/
public static final Attribute BACKGROUND =
new Attribute("background", null, false);
/**
* CSS attribute "background-attachment".
*/
public static final Attribute BACKGROUND_ATTACHMENT =
new Attribute("background-attachment", "scroll", false);
/**
* CSS attribute "background-color".
*/
public static final Attribute BACKGROUND_COLOR =
new Attribute("background-color", "transparent", false);
/**
* CSS attribute "background-image".
*/
public static final Attribute BACKGROUND_IMAGE =
new Attribute("background-image", "none", false);
/**
* CSS attribute "background-position".
*/
public static final Attribute BACKGROUND_POSITION =
new Attribute("background-position", null, false);
/**
* CSS attribute "background-repeat".
*/
public static final Attribute BACKGROUND_REPEAT =
new Attribute("background-repeat", "repeat", false);
/**
* CSS attribute "border".
*/
public static final Attribute BORDER =
new Attribute("border", null, false);
/**
* CSS attribute "border-bottom".
*/
public static final Attribute BORDER_BOTTOM =
new Attribute("border-bottom", null, false);
/**
* CSS attribute "border-bottom-color".
*/
public static final Attribute BORDER_BOTTOM_COLOR =
new Attribute("border-bottom-color", null, false);
/**
* CSS attribute "border-bottom-style".
*/
public static final Attribute BORDER_BOTTOM_STYLE =
new Attribute("border-bottom-style", "none", false);
/**
* CSS attribute "border-bottom-width".
*/
public static final Attribute BORDER_BOTTOM_WIDTH =
new Attribute("border-bottom-width", "medium", false);
/**
* CSS attribute "border-color".
*/
public static final Attribute BORDER_COLOR =
new Attribute("border-color", null, false);
/**
* CSS attribute "border-left".
*/
public static final Attribute BORDER_LEFT =
new Attribute("border-left", null, false);
/**
* CSS attribute "margin-right".
*/
public static final Attribute BORDER_LEFT_COLOR =
new Attribute("border-left-color", null, false);
/**
* CSS attribute "border-left-style".
*/
public static final Attribute BORDER_LEFT_STYLE =
new Attribute("border-left-style", "none", false);
/**
* CSS attribute "border-left-width".
*/
public static final Attribute BORDER_LEFT_WIDTH =
new Attribute("border-left-width", "medium", false);
/**
* CSS attribute "border-right".
*/
public static final Attribute BORDER_RIGHT =
new Attribute("border-right", null, false);
/**
* CSS attribute "border-right-color".
*/
public static final Attribute BORDER_RIGHT_COLOR =
new Attribute("border-right-color", null, false);
/**
* CSS attribute "border-right-style".
*/
public static final Attribute BORDER_RIGHT_STYLE =
new Attribute("border-right-style", "none", false);
/**
* CSS attribute "border-right-width".
*/
public static final Attribute BORDER_RIGHT_WIDTH =
new Attribute("border-right-width", "medium", false);
/**
* CSS attribute "border-style".
*/
public static final Attribute BORDER_STYLE =
new Attribute("border-style", "none", false);
/**
* CSS attribute "border-top".
*/
public static final Attribute BORDER_TOP =
new Attribute("border-top", null, false);
/**
* CSS attribute "border-top-color".
*/
public static final Attribute BORDER_TOP_COLOR =
new Attribute("border-top-color", null, false);
/**
* CSS attribute "border-top-style".
*/
public static final Attribute BORDER_TOP_STYLE =
new Attribute("border-top-style", "none", false);
/**
* CSS attribute "border-top-width".
*/
public static final Attribute BORDER_TOP_WIDTH =
new Attribute("border-top-width", "medium", false);
/**
* CSS attribute "border-width".
*/
public static final Attribute BORDER_WIDTH =
new Attribute("border-width", "medium", false);
/**
* CSS attribute "clear".
*/
public static final Attribute CLEAR =
new Attribute("clear", "none", false);
/**
* CSS attribute "color".
*/
public static final Attribute COLOR =
new Attribute("color", "black", true);
/**
* CSS attribute "display".
*/
public static final Attribute DISPLAY =
new Attribute("display", "block", false);
/**
* CSS attribute "float".
*/
public static final Attribute FLOAT =
new Attribute("float", "none", false);
/**
* CSS attribute "font".
*/
public static final Attribute FONT =
new Attribute("font", null, true);
/**
* CSS attribute "font-family".
*/
public static final Attribute FONT_FAMILY =
new Attribute("font-family", null, true);
/**
* CSS attribute "font-size".
*/
public static final Attribute FONT_SIZE =
new Attribute("font-size", "medium", true);
/**
* CSS attribute "font-style".
*/
public static final Attribute FONT_STYLE =
new Attribute("font-style", "normal", true);
/**
* CSS attribute "font-variant".
*/
public static final Attribute FONT_VARIANT =
new Attribute("font-variant", "normal", true);
/**
* CSS attribute "font-weight".
*/
public static final Attribute FONT_WEIGHT =
new Attribute("font-weight", "normal", true);
/**
* CSS attribute "height".
*/
public static final Attribute HEIGHT =
new Attribute("height", "auto", false);
/**
* CSS attribute "letter-spacing".
*/
public static final Attribute LETTER_SPACING =
new Attribute("letter-spacing", "normal", true);
/**
* CSS attribute "line-height".
*/
public static final Attribute LINE_HEIGHT =
new Attribute("line-height", "normal", true);
/**
* CSS attribute "list-style".
*/
public static final Attribute LIST_STYLE =
new Attribute("list-style", null, true);
/**
* CSS attribute "list-style-image".
*/
public static final Attribute LIST_STYLE_IMAGE =
new Attribute("list-style-image", "none", true);
/**
* CSS attribute "list-style-position".
*/
public static final Attribute LIST_STYLE_POSITION =
new Attribute("list-style-position", "outside", true);
/**
* CSS attribute "list-style-type".
*/
public static final Attribute LIST_STYLE_TYPE =
new Attribute("list-style-type", "disc", true);
/**
* CSS attribute "margin".
*/
public static final Attribute MARGIN =
new Attribute("margin", null, false);
/**
* CSS attribute "margin-bottom".
*/
public static final Attribute MARGIN_BOTTOM =
new Attribute("margin-bottom", "0", false);
/**
* CSS attribute "margin-left".
*/
public static final Attribute MARGIN_LEFT =
new Attribute("margin-left", "0", false);
/**
* CSS attribute "margin-right".
*/
public static final Attribute MARGIN_RIGHT =
new Attribute("margin-right", "0", false);
/*
* made up css attributes to describe orientation depended
* margins. used for
,
etc. see
* 5088268 for more details
*/
static final Attribute MARGIN_LEFT_LTR =
new Attribute("margin-left-ltr",
Integer.toString(Integer.MIN_VALUE), false);
static final Attribute MARGIN_LEFT_RTL =
new Attribute("margin-left-rtl",
Integer.toString(Integer.MIN_VALUE), false);
static final Attribute MARGIN_RIGHT_LTR =
new Attribute("margin-right-ltr",
Integer.toString(Integer.MIN_VALUE), false);
static final Attribute MARGIN_RIGHT_RTL =
new Attribute("margin-right-rtl",
Integer.toString(Integer.MIN_VALUE), false);
/**
* CSS attribute "margin-top".
*/
public static final Attribute MARGIN_TOP =
new Attribute("margin-top", "0", false);
/**
* CSS attribute "padding".
*/
public static final Attribute PADDING =
new Attribute("padding", null, false);
/**
* CSS attribute "padding-bottom".
*/
public static final Attribute PADDING_BOTTOM =
new Attribute("padding-bottom", "0", false);
/**
* CSS attribute "padding-left".
*/
public static final Attribute PADDING_LEFT =
new Attribute("padding-left", "0", false);
/**
* CSS attribute "padding-right".
*/
public static final Attribute PADDING_RIGHT =
new Attribute("padding-right", "0", false);
/**
* CSS attribute "padding-top".
*/
public static final Attribute PADDING_TOP =
new Attribute("padding-top", "0", false);
/**
* CSS attribute "text-align".
*/
public static final Attribute TEXT_ALIGN =
new Attribute("text-align", null, true);
/**
* CSS attribute "text-decoration".
*/
public static final Attribute TEXT_DECORATION =
new Attribute("text-decoration", "none", true);
/**
* CSS attribute "text-indent".
*/
public static final Attribute TEXT_INDENT =
new Attribute("text-indent", "0", true);
/**
* CSS attribute "text-transform".
*/
public static final Attribute TEXT_TRANSFORM =
new Attribute("text-transform", "none", true);
/**
* CSS attribute "vertical-align".
*/
public static final Attribute VERTICAL_ALIGN =
new Attribute("vertical-align", "baseline", false);
/**
* CSS attribute "word-spacing".
*/
public static final Attribute WORD_SPACING =
new Attribute("word-spacing", "normal", true);
/**
* CSS attribute "white-space".
*/
public static final Attribute WHITE_SPACE =
new Attribute("white-space", "normal", true);
/**
* CSS attribute "width".
*/
public static final Attribute WIDTH =
new Attribute("width", "auto", false);
/*public*/ static final Attribute BORDER_SPACING =
new Attribute("border-spacing", "0", true);
/*public*/ static final Attribute CAPTION_SIDE =
new Attribute("caption-side", "left", true);
// All possible CSS attribute keys.
static final Attribute[] allAttributes = {
BACKGROUND, BACKGROUND_ATTACHMENT, BACKGROUND_COLOR,
BACKGROUND_IMAGE, BACKGROUND_POSITION, BACKGROUND_REPEAT,
BORDER, BORDER_BOTTOM, BORDER_BOTTOM_WIDTH, BORDER_COLOR,
BORDER_LEFT, BORDER_LEFT_WIDTH, BORDER_RIGHT, BORDER_RIGHT_WIDTH,
BORDER_STYLE, BORDER_TOP, BORDER_TOP_WIDTH, BORDER_WIDTH,
BORDER_TOP_STYLE, BORDER_RIGHT_STYLE, BORDER_BOTTOM_STYLE,
BORDER_LEFT_STYLE,
BORDER_TOP_COLOR, BORDER_RIGHT_COLOR, BORDER_BOTTOM_COLOR,
BORDER_LEFT_COLOR,
CLEAR, COLOR, DISPLAY, FLOAT, FONT, FONT_FAMILY, FONT_SIZE,
FONT_STYLE, FONT_VARIANT, FONT_WEIGHT, HEIGHT, LETTER_SPACING,
LINE_HEIGHT, LIST_STYLE, LIST_STYLE_IMAGE, LIST_STYLE_POSITION,
LIST_STYLE_TYPE, MARGIN, MARGIN_BOTTOM, MARGIN_LEFT, MARGIN_RIGHT,
MARGIN_TOP, PADDING, PADDING_BOTTOM, PADDING_LEFT, PADDING_RIGHT,
PADDING_TOP, TEXT_ALIGN, TEXT_DECORATION, TEXT_INDENT, TEXT_TRANSFORM,
VERTICAL_ALIGN, WORD_SPACING, WHITE_SPACE, WIDTH,
BORDER_SPACING, CAPTION_SIDE,
MARGIN_LEFT_LTR, MARGIN_LEFT_RTL, MARGIN_RIGHT_LTR, MARGIN_RIGHT_RTL
};
private static final Attribute[] ALL_MARGINS =
{ MARGIN_TOP, MARGIN_RIGHT, MARGIN_BOTTOM, MARGIN_LEFT };
private static final Attribute[] ALL_PADDING =
{ PADDING_TOP, PADDING_RIGHT, PADDING_BOTTOM, PADDING_LEFT };
private static final Attribute[] ALL_BORDER_WIDTHS =
{ BORDER_TOP_WIDTH, BORDER_RIGHT_WIDTH, BORDER_BOTTOM_WIDTH,
BORDER_LEFT_WIDTH };
private static final Attribute[] ALL_BORDER_STYLES =
{ BORDER_TOP_STYLE, BORDER_RIGHT_STYLE, BORDER_BOTTOM_STYLE,
BORDER_LEFT_STYLE };
private static final Attribute[] ALL_BORDER_COLORS =
{ BORDER_TOP_COLOR, BORDER_RIGHT_COLOR, BORDER_BOTTOM_COLOR,
BORDER_LEFT_COLOR };
}
static final class Value {
private Value(String name) {
this.name = name;
}
/**
* The string representation of the attribute. This
* should exactly match the string specified in the
* CSS specification.
*/
public String toString() {
return name;
}
static final Value INHERITED = new Value("inherited");
static final Value NONE = new Value("none");
static final Value HIDDEN = new Value("hidden");
static final Value DOTTED = new Value("dotted");
static final Value DASHED = new Value("dashed");
static final Value SOLID = new Value("solid");
static final Value DOUBLE = new Value("double");
static final Value GROOVE = new Value("groove");
static final Value RIDGE = new Value("ridge");
static final Value INSET = new Value("inset");
static final Value OUTSET = new Value("outset");
// Lists.
static final Value DISC = new Value("disc");
static final Value CIRCLE = new Value("circle");
static final Value SQUARE = new Value("square");
static final Value DECIMAL = new Value("decimal");
static final Value LOWER_ROMAN = new Value("lower-roman");
static final Value UPPER_ROMAN = new Value("upper-roman");
static final Value LOWER_ALPHA = new Value("lower-alpha");
static final Value UPPER_ALPHA = new Value("upper-alpha");
// background-repeat
static final Value BACKGROUND_NO_REPEAT = new Value("no-repeat");
static final Value BACKGROUND_REPEAT = new Value("repeat");
static final Value BACKGROUND_REPEAT_X = new Value("repeat-x");
static final Value BACKGROUND_REPEAT_Y = new Value("repeat-y");
// background-attachment
static final Value BACKGROUND_SCROLL = new Value("scroll");
static final Value BACKGROUND_FIXED = new Value("fixed");
private String name;
static final Value[] allValues = {
INHERITED, NONE, DOTTED, DASHED, SOLID, DOUBLE, GROOVE,
RIDGE, INSET, OUTSET, DISC, CIRCLE, SQUARE, DECIMAL,
LOWER_ROMAN, UPPER_ROMAN, LOWER_ALPHA, UPPER_ALPHA,
BACKGROUND_NO_REPEAT, BACKGROUND_REPEAT,
BACKGROUND_REPEAT_X, BACKGROUND_REPEAT_Y,
BACKGROUND_FIXED, BACKGROUND_FIXED
};
}
/**
* Constructs a CSS object.
*/
public CSS() {
baseFontSize = baseFontSizeIndex + 1;
// setup the css conversion table
valueConvertor = new Hashtable