Support for defining the visual characteristics of
HTML views being rendered. The StyleSheet is used to
translate the HTML model into visual characteristics.
This enables views to be customized by a look-and-feel,
multiple views over the same model can be rendered
differently, etc. This can be thought of as a CSS
rule repository. The key for CSS attributes is an
object of type CSS.Attribute. The type of the value
is up to the StyleSheet implementation, but the
toString
method is required
to return a string representation of CSS value.
The primary entry point for HTML View implementations
to get their attributes is the
getViewAttributes
method. This should be implemented to establish the
desired policy used to associate attributes with the view.
Each HTMLEditorKit (i.e. and therefore each associated
JEditorPane) can have its own StyleSheet, but by default one
sheet will be shared by all of the HTMLEditorKit instances.
HTMLDocument instance can also have a StyleSheet, which
holds the document-specific CSS specifications.
In order for Views to store less state and therefore be
more lightweight, the StyleSheet can act as a factory for
painters that handle some of the rendering tasks. This allows
implementations to determine what they want to cache
and have the sharing potentially at the level that a
selector is common to multiple views. Since the StyleSheet
may be used by views over multiple documents and typically
the HTML attributes don't effect the selector being used,
the potential for sharing is significant.
The rules are stored as named styles, and other information
is stored to translate the context of an element to a
rule quickly. The following code fragment will display
the named styles, and therefore the CSS rules contained.
import java.util.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
public class ShowStyles {
public static void main(String[] args) {
HTMLEditorKit kit = new HTMLEditorKit();
HTMLDocument doc = (HTMLDocument) kit.createDefaultDocument();
StyleSheet styles = doc.getStyleSheet();
Enumeration rules = styles.getStyleNames();
while (rules.hasMoreElements()) {
String name = (String) rules.nextElement();
Style rule = styles.getStyle(name);
System.out.println(rule.toString());
}
System.exit(0);
}
}
The semantics for when a CSS style should overide visual attributes
defined by an element are not well defined. For example, the html
<body bgcolor=red>
makes the body have a red
background. But if the html file also contains the CSS rule
body { background: blue }
it becomes less clear as to
what color the background of the body should be. The current
implemention gives visual attributes defined in the element the
highest precedence, that is they are always checked before any styles.
Therefore, in the previous example the background would have a
red color as the body element defines the background color to be red.
As already mentioned this supports CSS. We don't support the full CSS
spec. Refer to the javadoc of the CSS class to see what properties
we support. The two major CSS parsing related
concepts we do not currently
support are pseudo selectors, such as A:link { color: red }
,
and the important
modifier.
Note: This implementation is currently
incomplete. It can be replaced with alternative implementations
that are complete. Future versions of this class will provide
better CSS support.