The attached patch adds support for CSS borders. This implementation is
actually much better than Sun's because it not only recognizes the
border-width attribute (which Sun doesn't, except for 0 and 1 borders),
it also recognizes the border-top-width, etc for installing different
borders on different edges. I also added support for border-XYZ-color
and border-XYZ-style (both of which Sun doesn't support yet). I am
missing most border styles though (Sun too btw).
This is an example of how it might look:
http://kennke.org/~roman/css-border.png
2006-11-07 Roman Kennke <[EMAIL PROTECTED]>
* gnu/javax/swing/text/html/css/BorderWidth.java:
New class. Handles CSS border width values.
* gnu/javax/swing/text/html/css/Length.java
(floatValue): Made protected so that BorderWidth can access it.
* javax/swing/text/html/CSS.java
(Attribute.BORDER_BOTTOM_COLOR): New static field.
(Attribute.BORDER_BOTTOM_STYLE): New static field.
(Attribute.BORDER_LEFT_COLOR): New static field.
(Attribute.BORDER_LEFT_STYLE): New static field.
(Attribute.BORDER_RIGHT_COLOR): New static field.
(Attribute.BORDER_RIGHT_STYLE): New static field.
(Attribute.BORDER_TOP_COLOR): New static field.
(Attribute.BORDER_TOP_STYLE): New static field.
(getValue): Added some mappings for the border color and
border width values.
* javax/swing/text/html/CSSBorder.java: New class. Implements
CSS borders.
* javax/swing/text/html/StyleSheet.java
(BoxPainter.background): New field.
(BoxPainter.border): New field.
(BoxPainter.bottomInset): Documented.
(BoxPainter.leftInset): Documented.
(BoxPainter.rightInset): Documented.
(BoxPainter.topInset): Documented.
(BoxPainter.BoxPainter): Added support for borders and
background.
(BoxPainter.getInset): Add border insets.
(BoxPainter.paint): Implemented. Paints the background and the
CSS border.
(addRule): Be less picky about parse and IO exceptions.
(getBoxPainter): Adjust to new BoxPainter constructor.
/Roman
Index: gnu/javax/swing/text/html/css/BorderWidth.java
===================================================================
RCS file: gnu/javax/swing/text/html/css/BorderWidth.java
diff -N gnu/javax/swing/text/html/css/BorderWidth.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ gnu/javax/swing/text/html/css/BorderWidth.java 7 Nov 2006 12:56:25 -0000
@@ -0,0 +1,66 @@
+/* BorderWidth.java -- A CSS metric for border widths
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath 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 for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package gnu.javax.swing.text.html.css;
+
+/**
+ * A special CSS metric for border widths. It basically understands everything
+ * as Length, and in addition to that provides a mapping for the border-width's
+ * thin, medium and think values.
+ */
+public class BorderWidth
+ extends Length
+{
+
+ /**
+ * Creates a new BorderWidth instance.
+ *
+ * @param val the CSS value to be interpreted
+ */
+ public BorderWidth(String val)
+ {
+ super(val);
+ if (val.equals("thin"))
+ floatValue = 1.F;
+ else if (val.equals("medium"))
+ floatValue = 2.F;
+ else if (val.equals("thick"))
+ floatValue = 3.F;
+ }
+
+}
Index: gnu/javax/swing/text/html/css/Length.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/javax/swing/text/html/css/Length.java,v
retrieving revision 1.2
diff -u -1 -5 -r1.2 Length.java
--- gnu/javax/swing/text/html/css/Length.java 5 Nov 2006 20:23:12 -0000 1.2
+++ gnu/javax/swing/text/html/css/Length.java 7 Nov 2006 12:56:25 -0000
@@ -42,31 +42,31 @@
* Converts CSS length values to usable length values.
*
* @author Roman Kennke ([EMAIL PROTECTED])
*/
public class Length
{
/**
* The original value.
*/
private String value;
/**
* The converted value.
*/
- private float floatValue;
+ protected float floatValue;
/**
* Indicates when the value is a percentage value.
*/
private boolean isPercentage;
/**
* Creates a new length converter instance.
*
* @param val the CSS value
*/
public Length(String val)
{
value = val;
int i = value.indexOf("px");
Index: javax/swing/text/html/CSS.java
===================================================================
RCS file: /cvsroot/classpath/classpath/javax/swing/text/html/CSS.java,v
retrieving revision 1.7
diff -u -1 -5 -r1.7 CSS.java
--- javax/swing/text/html/CSS.java 5 Nov 2006 20:23:12 -0000 1.7
+++ javax/swing/text/html/CSS.java 7 Nov 2006 12:56:25 -0000
@@ -25,30 +25,31 @@
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package javax.swing.text.html;
+import gnu.javax.swing.text.html.css.BorderWidth;
import gnu.javax.swing.text.html.css.CSSColor;
import gnu.javax.swing.text.html.css.FontSize;
import gnu.javax.swing.text.html.css.FontStyle;
import gnu.javax.swing.text.html.css.FontWeight;
import gnu.javax.swing.text.html.css.Length;
import java.io.Serializable;
import java.util.HashMap;
/**
* Provides CSS attributes to be used by the HTML view classes. The constants
* defined here are used as keys for text attributes for use in
* [EMAIL PROTECTED] javax.swing.text.AttributeSet}s of [EMAIL PROTECTED] javax.swing.text.Element}s.
*
* @author Roman Kennke ([EMAIL PROTECTED])
@@ -382,30 +383,48 @@
public static final Attribute WHITE_SPACE =
new Attribute("white-space", true, "normal");
/**
* The CSS attribute 'width'.
*/
public static final Attribute WIDTH =
new Attribute("width", false, "auto");
/**
* The CSS attribute 'word-spacing'.
*/
public static final Attribute WORD_SPACING =
new Attribute("word-spacing", true, "normal");
+ // Some GNU Classpath specific extensions.
+ static final Attribute BORDER_TOP_STYLE =
+ new Attribute("border-top-style", false, null);
+ static final Attribute BORDER_BOTTOM_STYLE =
+ new Attribute("border-bottom-style", false, null);
+ static final Attribute BORDER_LEFT_STYLE =
+ new Attribute("border-left-style", false, null);
+ static final Attribute BORDER_RIGHT_STYLE =
+ new Attribute("border-right-style", false, null);
+ static final Attribute BORDER_TOP_COLOR =
+ new Attribute("border-top-color", false, null);
+ static final Attribute BORDER_BOTTOM_COLOR =
+ new Attribute("border-bottom-color", false, null);
+ static final Attribute BORDER_LEFT_COLOR =
+ new Attribute("border-left-color", false, null);
+ static final Attribute BORDER_RIGHT_COLOR =
+ new Attribute("border-right-color", false, null);
+
/**
* The attribute string.
*/
String attStr;
/**
* Indicates if this attribute should be inherited from it's parent or
* not.
*/
boolean isInherited;
/**
* A default value for this attribute if one exists, otherwise null.
*/
String defaultValue;
@@ -472,27 +491,37 @@
*
* @param att the key
* @param v the value
*
* @return the wrapped value
*/
static Object getValue(Attribute att, String v)
{
Object o;
if (att == Attribute.FONT_SIZE)
o = new FontSize(v);
else if (att == Attribute.FONT_WEIGHT)
o = new FontWeight(v);
else if (att == Attribute.FONT_STYLE)
o = new FontStyle(v);
- else if (att == Attribute.COLOR || att == Attribute.BACKGROUND_COLOR)
+ else if (att == Attribute.COLOR || att == Attribute.BACKGROUND_COLOR
+ || att == Attribute.BORDER_COLOR
+ || att == Attribute.BORDER_TOP_COLOR
+ || att == Attribute.BORDER_BOTTOM_COLOR
+ || att == Attribute.BORDER_LEFT_COLOR
+ || att == Attribute.BORDER_RIGHT_COLOR)
o = new CSSColor(v);
else if (att == Attribute.MARGIN || att == Attribute.MARGIN_BOTTOM
|| att == Attribute.MARGIN_LEFT || att == Attribute.MARGIN_RIGHT
|| att == Attribute.MARGIN_TOP || att == Attribute.WIDTH
|| att == Attribute.HEIGHT)
o = new Length(v);
+ else if (att == Attribute.BORDER_WIDTH || att == Attribute.BORDER_TOP_WIDTH
+ || att == Attribute.BORDER_LEFT_WIDTH
+ || att == Attribute.BORDER_RIGHT_WIDTH
+ || att == Attribute.BORDER_BOTTOM_WIDTH)
+ o = new BorderWidth(v);
else
o = v;
return o;
}
}
Index: javax/swing/text/html/CSSBorder.java
===================================================================
RCS file: javax/swing/text/html/CSSBorder.java
diff -N javax/swing/text/html/CSSBorder.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ javax/swing/text/html/CSSBorder.java 7 Nov 2006 12:56:25 -0000
@@ -0,0 +1,420 @@
+/* CSSBorder.java -- A border for rendering CSS border styles
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath 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 for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING. If not, write to the
+Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library. Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module. An independent module is a module which is not derived from
+or based on this library. If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so. If you do not wish to do so, delete this
+exception statement from your version. */
+
+
+package javax.swing.text.html;
+
+import gnu.javax.swing.text.html.css.BorderWidth;
+import gnu.javax.swing.text.html.css.CSSColor;
+import gnu.javax.swing.text.html.css.Length;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Insets;
+
+import javax.swing.border.Border;
+import javax.swing.text.AttributeSet;
+
+/**
+ * A border implementation to render CSS border styles.
+ */
+class CSSBorder
+ implements Border
+{
+
+ /**
+ * The CSS border styles.
+ */
+
+ private static final int STYLE_NOT_SET = -1;
+ private static final int STYLE_NONE = 0;
+ private static final int STYLE_HIDDEN = 1;
+ private static final int STYLE_DOTTED = 2;
+ private static final int STYLE_DASHED = 3;
+ private static final int STYLE_SOLID = 4;
+ private static final int STYLE_DOUBLE = 5;
+ private static final int STYLE_GROOVE = 6;
+ private static final int STYLE_RIDGE = 7;
+ private static final int STYLE_INSET = 8;
+ private static final int STYLE_OUTSET = 9;
+
+ /**
+ * The left insets.
+ */
+ private int left;
+
+ /**
+ * The right insets.
+ */
+ private int right;
+
+ /**
+ * The top insets.
+ */
+ private int top;
+
+ /**
+ * The bottom insets.
+ */
+ private int bottom;
+
+ /**
+ * The border style on the left.
+ */
+ private int leftStyle;
+
+ /**
+ * The border style on the right.
+ */
+ private int rightStyle;
+
+ /**
+ * The border style on the top.
+ */
+ private int topStyle;
+
+ /**
+ * The color for the top border.
+ */
+ private Color topColor;
+
+ /**
+ * The color for the bottom border.
+ */
+ private Color bottomColor;
+
+ /**
+ * The color for the left border.
+ */
+ private Color leftColor;
+
+ /**
+ * The color for the right border.
+ */
+ private Color rightColor;
+
+ /**
+ * The border style on the bottom.
+ */
+ private int bottomStyle;
+
+ /**
+ * Creates a new CSS border and fetches its attributes from the specified
+ * attribute set.
+ *
+ * @param atts the attribute set that contains the border spec
+ */
+ CSSBorder(AttributeSet atts)
+ {
+ // Determine the border styles.
+ int style = getBorderStyle(atts, CSS.Attribute.BORDER_STYLE);
+ if (style == STYLE_NOT_SET)
+ style = STYLE_NONE; // Default to none.
+ topStyle = bottomStyle = leftStyle = rightStyle = style;
+ style = getBorderStyle(atts, CSS.Attribute.BORDER_TOP_STYLE);
+ if (style != STYLE_NOT_SET)
+ topStyle = style;
+ style = getBorderStyle(atts, CSS.Attribute.BORDER_BOTTOM_STYLE);
+ if (style != STYLE_NOT_SET)
+ bottomStyle = style;
+ style = getBorderStyle(atts, CSS.Attribute.BORDER_LEFT_STYLE);
+ if (style != STYLE_NOT_SET)
+ leftStyle = style;
+ style = getBorderStyle(atts, CSS.Attribute.BORDER_RIGHT_STYLE);
+ if (style != STYLE_NOT_SET)
+ rightStyle = style;
+
+ // Determine the border colors.
+ Color color = getBorderColor(atts, CSS.Attribute.BORDER_COLOR);
+ if (color == null)
+ color = Color.BLACK;
+ topColor = bottomColor = leftColor = rightColor = color;
+ color = getBorderColor(atts, CSS.Attribute.BORDER_TOP_COLOR);
+ if (color != null)
+ topColor = color;
+ color = getBorderColor(atts, CSS.Attribute.BORDER_BOTTOM_COLOR);
+ if (color != null)
+ bottomColor = color;
+ color = getBorderColor(atts, CSS.Attribute.BORDER_LEFT_COLOR);
+ if (color != null)
+ leftColor = color;
+ color = getBorderColor(atts, CSS.Attribute.BORDER_RIGHT_COLOR);
+ if (color != null)
+ rightColor = color;
+
+ // Determine the border widths.
+ int width = getBorderWidth(atts, CSS.Attribute.BORDER_WIDTH);
+ if (width == -1)
+ width = 0;
+ top = bottom = left = right = width;
+ width = getBorderWidth(atts, CSS.Attribute.BORDER_TOP_WIDTH);
+ if (width >= 0)
+ top = width;
+ width = getBorderWidth(atts, CSS.Attribute.BORDER_BOTTOM_WIDTH);
+ if (width >= 0)
+ bottom = width;
+ width = getBorderWidth(atts, CSS.Attribute.BORDER_LEFT_WIDTH);
+ if (width >= 0)
+ left = width;
+ width = getBorderWidth(atts, CSS.Attribute.BORDER_RIGHT_WIDTH);
+ if (width >= 0)
+ right = width;
+ }
+
+ /**
+ * Determines the border style for a given CSS attribute.
+ *
+ * @param atts the attribute set
+ * @param key the CSS key
+ *
+ * @return the border style according to the constants defined in this class
+ */
+ private int getBorderStyle(AttributeSet atts, CSS.Attribute key)
+ {
+ int style = STYLE_NOT_SET;
+ Object o = atts.getAttribute(key);
+ if (o != null)
+ {
+ String cssStyle = o.toString();
+ if (cssStyle.equals("none"))
+ style = STYLE_NONE;
+ else if (cssStyle.equals("hidden"))
+ style = STYLE_HIDDEN;
+ else if (cssStyle.equals("dotted"))
+ style = STYLE_DOTTED;
+ else if (cssStyle.equals("dashed"))
+ style = STYLE_DASHED;
+ else if (cssStyle.equals("solid"))
+ style = STYLE_SOLID;
+ else if (cssStyle.equals("double"))
+ style = STYLE_DOUBLE;
+ else if (cssStyle.equals("groove"))
+ style = STYLE_GROOVE;
+ else if (cssStyle.equals("ridge"))
+ style = STYLE_RIDGE;
+ else if (cssStyle.equals("inset"))
+ style = STYLE_INSET;
+ else if (cssStyle.equals("outset"))
+ style = STYLE_OUTSET;
+ }
+ return style;
+ }
+
+ /**
+ * Determines the border color for the specified key.
+ *
+ * @param atts the attribute set from which to fetch the color
+ * @param key the CSS key
+ *
+ * @return the border color
+ */
+ private Color getBorderColor(AttributeSet atts, CSS.Attribute key)
+ {
+ Object o = atts.getAttribute(key);
+ Color color = null;
+ if (o instanceof CSSColor)
+ {
+ CSSColor cssColor = (CSSColor) o;
+ color = cssColor.getValue();
+ }
+ return color;
+ }
+
+ /**
+ * Returns the width for the specified key.
+ *
+ * @param atts the attributes to fetch the width from
+ * @param key the CSS key
+ *
+ * @return the width, or -1 of none has been set
+ */
+ private int getBorderWidth(AttributeSet atts, CSS.Attribute key)
+ {
+ int width = -1;
+ Object o = atts.getAttribute(key);
+ if (o instanceof BorderWidth)
+ {
+ width = (int) ((BorderWidth) o).getValue();
+ }
+ return width;
+ }
+
+ /**
+ * Returns the border insets.
+ */
+ public Insets getBorderInsets(Component c)
+ {
+ return new Insets(top, left, bottom, right);
+ }
+
+ /**
+ * CSS borders are generally opaque so return true here.
+ */
+ public boolean isBorderOpaque()
+ {
+ return true;
+ }
+
+ public void paintBorder(Component c, Graphics g, int x, int y, int width,
+ int height)
+ {
+ // Top border.
+ paintBorderLine(g, x, y + top / 2, x + width, y + top / 2, topStyle, top,
+ topColor, false);
+ // Left border.
+ paintBorderLine(g, x + left / 2, y, x + left / 2, y + height, leftStyle,
+ left, leftColor, true);
+ // Bottom border.
+ paintBorderLine(g, x, y + height - bottom / 2, x + width,
+ y + height - bottom / 2, topStyle, bottom, bottomColor,
+ false);
+ // Right border.
+ paintBorderLine(g, x + width - right / 2, y, x + width - right / 2,
+ y + height, topStyle, right, rightColor, true);
+
+ }
+
+ private void paintBorderLine(Graphics g, int x1, int y1, int x2, int y2,
+ int style, int width, Color color,
+ boolean vertical)
+ {
+ switch (style)
+ {
+ case STYLE_DOTTED:
+ paintDottedLine(g, x1, y1, x2, y2, width, color, vertical);
+ break;
+ case STYLE_DASHED:
+ paintDashedLine(g, x1, y1, x2, y2, width, color, vertical);
+ break;
+ case STYLE_SOLID:
+ paintSolidLine(g, x1, y1, x2, y2, width, color, vertical);
+ break;
+ case STYLE_DOUBLE:
+ paintDoubleLine(g, x1, y1, x2, y2, width, color, vertical);
+ break;
+ case STYLE_GROOVE:
+ paintGrooveLine(g, x1, y1, x2, y2, width, color, vertical);
+ break;
+ case STYLE_RIDGE:
+ paintRidgeLine(g, x1, y1, x2, y2, width, color, vertical);
+ break;
+ case STYLE_OUTSET:
+ paintOutsetLine(g, x1, y1, x2, y2, width, color, vertical);
+ break;
+ case STYLE_INSET:
+ paintInsetLine(g, x1, y1, x2, y2, width, color, vertical);
+ break;
+ case STYLE_NONE:
+ case STYLE_HIDDEN:
+ default:
+ // Nothing to do in these cases.
+ }
+ }
+
+ private void paintDottedLine(Graphics g, int x1, int y1, int x2, int y2,
+ int width, Color color, boolean vertical)
+ {
+ // FIXME: Implement this.
+ paintSolidLine(g, x1, y1, x2, y2, width, color, vertical);
+ }
+
+ private void paintDashedLine(Graphics g, int x1, int y1, int x2, int y2,
+ int width, Color color, boolean vertical)
+ {
+ // FIXME: Implement this.
+ paintSolidLine(g, x1, y1, x2, y2, width, color, vertical);
+ }
+
+ private void paintSolidLine(Graphics g, int x1, int y1, int x2, int y2,
+ int width, Color color, boolean vertical)
+ {
+ int x = Math.min(x1, x2);
+ int y = Math.min(y1, y1);
+ int w = Math.abs(x2 - x1);
+ int h = Math.abs(y2 - y1);
+ if (vertical)
+ {
+ w = width;
+ x -= width / 2;
+ }
+ else
+ {
+ h = width;
+ y -= width / 2;
+ }
+ g.setColor(color);
+ g.fillRect(x, y, w, h);
+ }
+
+ private void paintDoubleLine(Graphics g, int x1, int y1, int x2, int y2,
+ int width, Color color, boolean vertical)
+ {
+ // FIXME: Implement this.
+ paintSolidLine(g, x1, y1, x2, y2, width, color, vertical);
+ }
+
+ private void paintGrooveLine(Graphics g, int x1, int y1, int x2, int y2,
+ int width, Color color, boolean vertical)
+ {
+ // FIXME: Implement this.
+ paintSolidLine(g, x1, y1, x2, y2, width, color, vertical);
+ }
+
+ private void paintRidgeLine(Graphics g, int x1, int y1, int x2, int y2,
+ int width, Color color, boolean vertical)
+ {
+ // FIXME: Implement this.
+ paintSolidLine(g, x1, y1, x2, y2, width, color, vertical);
+ }
+
+ private void paintOutsetLine(Graphics g, int x1, int y1, int x2, int y2,
+ int width, Color color, boolean vertical)
+ {
+ // FIXME: Implement this.
+ paintSolidLine(g, x1, y1, x2, y2, width, color, vertical);
+ }
+
+ private void paintInsetLine(Graphics g, int x1, int y1, int x2, int y2,
+ int width, Color color, boolean vertical)
+ {
+ // FIXME: Implement this.
+ paintSolidLine(g, x1, y1, x2, y2, width, color, vertical);
+ }
+
+}
Index: javax/swing/text/html/StyleSheet.java
===================================================================
RCS file: /cvsroot/classpath/classpath/javax/swing/text/html/StyleSheet.java,v
retrieving revision 1.10
diff -u -1 -5 -r1.10 StyleSheet.java
--- javax/swing/text/html/StyleSheet.java 3 Nov 2006 11:24:05 -0000 1.10
+++ javax/swing/text/html/StyleSheet.java 7 Nov 2006 12:56:25 -0000
@@ -48,30 +48,33 @@
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.io.IOException;
import java.io.Reader;
import java.io.Serializable;
import java.io.StringReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.StringTokenizer;
+import javax.swing.border.BevelBorder;
+import javax.swing.border.Border;
+import javax.swing.border.LineBorder;
import javax.swing.event.ChangeListener;
import javax.swing.text.AttributeSet;
import javax.swing.text.Element;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;
import javax.swing.text.View;
/**
* This class adds support for defining the visual characteristics of HTML views
* being rendered. This enables views to be customized by a look-and-feel, mulitple
* views over the same model can be rendered differently. Each EditorPane has its
@@ -407,31 +410,31 @@
* @param rule - the rule to add to the sheet
*/
public void addRule(String rule)
{
CSSStyleSheetParserCallback cb = new CSSStyleSheetParserCallback();
// FIXME: Handle ref.
StringReader in = new StringReader(rule);
CSSParser parser = new CSSParser(in, cb);
try
{
parser.parse();
}
catch (IOException ex)
{
// Shouldn't happen. And if, then we
- assert false;
+ System.err.println("IOException while parsing stylesheet: " + ex.getMessage());
}
}
/**
* Translates a CSS declaration into an AttributeSet. This is called
* as a result of encountering an HTML style attribute.
*
* @param decl - the declaration to get
* @return the AttributeSet representing the declaration
*/
public AttributeSet getDeclaration(String decl)
{
if (decl == null)
return SimpleAttributeSet.EMPTY;
// FIXME: Not implemented.
@@ -790,31 +793,31 @@
CSSColor c = (CSSColor) a.getAttribute(CSS.Attribute.BACKGROUND_COLOR);
Color color = null;
if (c != null)
color = c.getValue();
return color;
}
/**
* Gets the box formatter to use for the given set of CSS attributes.
*
* @param a - the given set
* @return the box formatter
*/
public BoxPainter getBoxPainter(AttributeSet a)
{
- return new BoxPainter(a);
+ return new BoxPainter(a, this);
}
/**
* Gets the list formatter to use for the given set of CSS attributes.
*
* @param a - the given set
* @return the list formatter
*/
public ListPainter getListPainter(AttributeSet a)
{
return new ListPainter(a);
}
/**
* Sets the base font size between 1 and 7.
@@ -908,118 +911,167 @@
return CSSColor.convertValue(colorName);
}
/**
* This class carries out some of the duties of CSS formatting. This enables views
* to present the CSS formatting while not knowing how the CSS values are cached.
*
* This object is reponsible for the insets of a View and making sure
* the background is maintained according to the CSS attributes.
*
* @author Lillian Angel ([EMAIL PROTECTED])
*/
public static class BoxPainter extends Object implements Serializable
{
+ /**
+ * The left inset.
+ */
private float leftInset;
+
+ /**
+ * The right inset.
+ */
private float rightInset;
+
+ /**
+ * The top inset.
+ */
private float topInset;
+
+ /**
+ * The bottom inset.
+ */
private float bottomInset;
/**
+ * The border of the box.
+ */
+ private Border border;
+
+ /**
+ * The background color.
+ */
+ private Color background;
+
+ /**
* Package-private constructor.
*
* @param as - AttributeSet for painter
*/
- BoxPainter(AttributeSet as)
+ BoxPainter(AttributeSet as, StyleSheet ss)
{
Length l = (Length) as.getAttribute(CSS.Attribute.MARGIN_LEFT);
if (l != null)
leftInset = l.getValue();
l = (Length) as.getAttribute(CSS.Attribute.MARGIN_RIGHT);
if (l != null)
rightInset = l.getValue();
l = (Length) as.getAttribute(CSS.Attribute.MARGIN_TOP);
if (l != null)
topInset = l.getValue();
l = (Length) as.getAttribute(CSS.Attribute.MARGIN_BOTTOM);
if (l != null)
bottomInset = l.getValue();
+
+ // Determine border.
+ border = new CSSBorder(as);
+
+ // Determine background.
+ background = ss.getBackground(as);
+
}
/**
* Gets the inset needed on a given side to account for the margin, border
* and padding.
*
* @param size - the size of the box to get the inset for. View.TOP, View.LEFT,
* View.BOTTOM or View.RIGHT.
* @param v - the view making the request. This is used to get the AttributeSet,
* amd may be used to resolve percentage arguments.
* @return the inset
* @throws IllegalArgumentException - for an invalid direction.
*/
public float getInset(int size, View v)
{
float inset;
switch (size)
{
case View.TOP:
inset = topInset;
+ if (border != null)
+ inset += border.getBorderInsets(null).top;
break;
case View.BOTTOM:
inset = bottomInset;
+ if (border != null)
+ inset += border.getBorderInsets(null).bottom;
break;
case View.LEFT:
inset = leftInset;
+ if (border != null)
+ inset += border.getBorderInsets(null).left;
break;
case View.RIGHT:
inset = rightInset;
+ if (border != null)
+ inset += border.getBorderInsets(null).right;
break;
default:
inset = 0.0F;
}
return inset;
}
/**
* Paints the CSS box according to the attributes given. This should
* paint the border, padding and background.
*
* @param g - the graphics configuration
* @param x - the x coordinate
* @param y - the y coordinate
* @param w - the width of the allocated area
* @param h - the height of the allocated area
* @param v - the view making the request
*/
public void paint(Graphics g, float x, float y, float w, float h, View v)
{
- // FIXME: Not implemented.
+
+ if (background != null)
+ {
+ g.setColor(background);
+ g.fillRect((int) x, (int) y, (int) w, (int) h);
+ }
+ if (border != null)
+ {
+ border.paintBorder(null, g, (int) x, (int) y, (int) w, (int) h);
+ }
}
}
/**
* This class carries out some of the CSS list formatting duties. Implementations
* of this class enable views to present the CSS formatting while not knowing anything
* about how the CSS values are being cached.
*
* @author Lillian Angel ([EMAIL PROTECTED])
*/
- public static class ListPainter extends Object implements Serializable
+ public static class ListPainter implements Serializable
{
-
+
/**
* Attribute set for painter
*/
AttributeSet as;
/**
* Package-private constructor.
*
* @param as - AttributeSet for painter
*/
ListPainter(AttributeSet as)
{
this.as = as;
}