You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ml...@apache.org on 2006/07/31 16:08:55 UTC

svn commit: r427121 [5/29] - in /incubator/harmony/enhanced/classlib/trunk/modules/swing: make/ src/main/java/common/javax/swing/ src/main/java/common/javax/swing/text/ src/main/java/common/javax/swing/text/html/ src/main/java/common/javax/swing/text/h...

Added: incubator/harmony/enhanced/classlib/trunk/modules/swing/src/main/java/common/javax/swing/text/html/FrameTagView.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/swing/src/main/java/common/javax/swing/text/html/FrameTagView.java?rev=427121&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/swing/src/main/java/common/javax/swing/text/html/FrameTagView.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/modules/swing/src/main/java/common/javax/swing/text/html/FrameTagView.java Mon Jul 31 07:08:47 2006
@@ -0,0 +1,151 @@
+/*
+ *  Copyright 2005 - 2006 The Apache Software Software Foundation or its licensors, as applicable.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+/**
+ * @author Vadim L. Bogdanov
+ * @version $Revision$
+ */
+package javax.swing.text.html;
+
+import java.awt.Component;
+import java.awt.Insets;
+import java.awt.Shape;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import javax.swing.JEditorPane;
+import javax.swing.JScrollPane;
+import javax.swing.ScrollPaneConstants;
+import javax.swing.border.Border;
+import javax.swing.event.DocumentEvent;
+import javax.swing.text.ComponentView;
+import javax.swing.text.Element;
+import javax.swing.text.JTextComponent;
+import javax.swing.text.ViewFactory;
+
+
+class FrameTagView extends ComponentView {
+    private JEditorPane editorPane;
+    private JScrollPane scrollPane;
+    private Border scrollPaneBorder;
+
+    public FrameTagView(final Element elem) {
+        super(elem);
+    }
+
+    protected Component createComponent() {
+        editorPane = new JEditorPane();
+        scrollPane = new JScrollPane(editorPane);
+
+        loadContent(editorPane);
+        updateAttributes();
+
+        return scrollPane;
+    }
+
+    public void changedUpdate(final DocumentEvent e, final Shape s,
+                              final ViewFactory f) {
+        super.changedUpdate(e, s, f);
+
+        updateAttributes();
+    }
+
+    private void updateAttributes() {
+        if (scrollPane == null) {
+            return;
+        }
+
+        installBorder();
+        installMargin();
+        installScrollBarPolicy();
+
+        editorPane.setEditable(((JTextComponent)getContainer()).isEditable());
+    }
+
+    private void installBorder() {
+        if (getFrameBorderAttr()) {
+            if (scrollPane.getBorder() == null && scrollPaneBorder != null) {
+                scrollPane.setBorder(scrollPaneBorder);
+            }
+        } else {
+            scrollPaneBorder = scrollPane.getBorder();
+            scrollPane.setBorder(null);
+        }
+    }
+
+    private void installMargin() {
+        int marginWidth = getMarginWidthAttr();
+        int marginHeight = getMarginHeightAttr();
+        editorPane.setMargin(new Insets(marginHeight, marginWidth,
+                                        marginHeight, marginWidth));
+    }
+
+    private void installScrollBarPolicy() {
+        String scrolling = getScrollingAttr();
+        if ("yes".equals(scrolling)) {
+            scrollPane.setHorizontalScrollBarPolicy(
+                    ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
+            scrollPane.setVerticalScrollBarPolicy(
+                    ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
+        } else if ("no".equals(scrolling)) {
+            scrollPane.setHorizontalScrollBarPolicy(
+                    ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
+            scrollPane.setVerticalScrollBarPolicy(
+                    ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
+        }
+    }
+
+    private void loadContent(final JEditorPane pane) {
+        try {
+            pane.setPage(getSourceURL());
+        } catch (final IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    private URL getSourceURL() {
+        try {
+            return new URL(((HTMLDocument)getDocument()).getBase(), getSrcAttr());
+        } catch (final MalformedURLException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    private String getSrcAttr() {
+        return getAttributes().getAttribute(HTML.Attribute.SRC).toString();
+    }
+
+    private String getScrollingAttr() {
+        Object value = getAttributes().getAttribute(HTML.Attribute.SCROLLING);
+        return value == null ? "auto" : value.toString();
+    }
+
+    private boolean getFrameBorderAttr() {
+        Object value = getAttributes().getAttribute(HTML.Attribute.FRAMEBORDER);
+        return !"0".equals(value);
+    }
+
+    private int getMarginWidthAttr() {
+        Object value = getAttributes().getAttribute(HTML.Attribute.MARGINWIDTH);
+        return value == null ? 2 : ((Integer)value).intValue();
+    }
+
+    private int getMarginHeightAttr() {
+        Object value = getAttributes().getAttribute(HTML.Attribute.MARGINHEIGHT);
+        return value == null ? 0 : ((Integer)value).intValue();
+    }
+}

Added: incubator/harmony/enhanced/classlib/trunk/modules/swing/src/main/java/common/javax/swing/text/html/HRuleTagView.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/swing/src/main/java/common/javax/swing/text/html/HRuleTagView.java?rev=427121&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/swing/src/main/java/common/javax/swing/text/html/HRuleTagView.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/modules/swing/src/main/java/common/javax/swing/text/html/HRuleTagView.java Mon Jul 31 07:08:47 2006
@@ -0,0 +1,162 @@
+/*
+ *  Copyright 2005 - 2006 The Apache Software Software Foundation or its licensors, as applicable.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+/**
+ * @author Vadim L. Bogdanov
+ * @version $Revision$
+ */
+package javax.swing.text.html;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.awt.Shape;
+
+import javax.swing.event.DocumentEvent;
+import javax.swing.text.AttributeSet;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.BoxView;
+import javax.swing.text.Element;
+import javax.swing.text.Position;
+import javax.swing.text.StyleConstants;
+import javax.swing.text.View;
+import javax.swing.text.ViewFactory;
+import javax.swing.text.Position.Bias;
+
+import org.apache.harmony.awt.text.TextUtils;
+
+class HRuleTagView extends View {
+    private static final int INSET = 3;
+    private static final int MINIMUM_SIZE = 2;
+    private static final Color SHADOW = Color.BLACK;
+    private static final Color LIGHT_SHADOW = Color.LIGHT_GRAY;
+
+    private AttributeSet attrs;
+
+    HRuleTagView(final Element elem) {
+        super(elem);
+    }
+
+    public float getPreferredSpan(final int axis) {
+        if (axis == Y_AXIS) {
+            return getSizeAttr() + 2 * INSET;
+        } else {
+            return Integer.MAX_VALUE;
+        }
+    }
+
+    public void paint(final Graphics g, final Shape allocation) {
+        Rectangle r = allocation.getBounds();
+        int totalWidth = r.width;
+        r.grow(0, -INSET);
+        r.width = getWidthAttr();
+        calculatePosition(r, totalWidth);
+
+        if (getNoshadeAttr()) {
+            g.setColor(SHADOW);
+            g.fillRect(r.x, r.y, r.width, r.height);
+        } else {
+            g.setColor(SHADOW);
+            g.drawLine(r.x, r.y, r.x + r.width, r.y);
+            int size = getSizeAttr() - 1;
+            g.drawLine(r.x, r.y, r.x, r.y + size);
+            g.setColor(LIGHT_SHADOW);
+            g.drawLine(r.x + 1, r.y + size, r.x + r.width, r.y + size);
+            g.drawLine(r.x + r.width, r.y + 1, r.x + r.width, r.y + size);
+        }
+    }
+
+    public int viewToModel(final float x, final float y,
+                           final Shape shape, final Bias[] biasReturn) {
+        final Rectangle bounds = shape.getBounds();
+        if (x > bounds.width / 2 + bounds.x - 1) {
+            biasReturn[0] = Position.Bias.Backward;
+            return getEndOffset();
+        }
+        biasReturn[0] = Position.Bias.Forward;
+        return getStartOffset();
+    }
+
+    public Shape modelToView(final int pos, final Shape shape,
+                             final Bias bias) throws BadLocationException {
+        return TextUtils.modelToIconOrComponentView(this, pos, shape, bias);
+    }
+
+    public int getBreakWeight(final int axis, final float pos, final float len) {
+        return ForcedBreakWeight;
+    }
+
+    public int getResizeWeight(final int axis) {
+        return axis == X_AXIS ? 1 : 0;
+    }
+
+    public AttributeSet getAttributes() {
+        if (attrs == null) {
+            attrs = ((HTMLDocument)getDocument()).getStyleSheet()
+                .getViewAttributes(this);
+        }
+        return attrs;
+    }
+
+    public void changedUpdate(final DocumentEvent event,
+                              final Shape shape,
+                              final ViewFactory factory) {
+        attrs = ((HTMLDocument)getDocument()).getStyleSheet()
+            .getViewAttributes(this);
+        super.changedUpdate(event, shape, factory);
+    }
+
+    private int getSizeAttr() {
+        Object value = getElement().getAttributes()
+            .getAttribute(HTML.Attribute.SIZE);
+
+        if (value != null) {
+            int size = Integer.parseInt((String)value);
+            if (size > MINIMUM_SIZE) {
+                return size;
+            }
+        }
+        return MINIMUM_SIZE;
+    }
+
+    private boolean getNoshadeAttr() {
+        Object value = getElement().getAttributes()
+            .getAttribute(HTML.Attribute.NOSHADE);
+        return value != null;
+    }
+
+    private int getWidthAttr() {
+        Object value = getAttributes().getAttribute(CSS.Attribute.WIDTH);
+        return value != null
+            ? ((CSS.FloatValue)value).intValue(this)
+            : ((BoxView)getParent().getParent()).getWidth();
+    }
+
+    private int getAlignAttr() {
+        Object value = getAttributes().getAttribute(StyleConstants.Alignment);
+        return value != null
+            ? ((Integer)value).intValue()
+            : StyleConstants.ALIGN_CENTER;
+    }
+
+    private void calculatePosition(final Rectangle r, final int totalWidth) {
+        int align = getAlignAttr();
+        if (align == StyleConstants.ALIGN_CENTER) {
+            r.x += (totalWidth - r.width) / 2;
+        } else if (align == StyleConstants.ALIGN_RIGHT) {
+            r.x += totalWidth - r.width;
+        }
+    }
+}

Added: incubator/harmony/enhanced/classlib/trunk/modules/swing/src/main/java/common/javax/swing/text/html/HTML.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/swing/src/main/java/common/javax/swing/text/html/HTML.java?rev=427121&view=auto
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/swing/src/main/java/common/javax/swing/text/html/HTML.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/modules/swing/src/main/java/common/javax/swing/text/html/HTML.java Mon Jul 31 07:08:47 2006
@@ -0,0 +1,590 @@
+/*
+ *  Copyright 2005 - 2006 The Apache Software Software Foundation or its licensors, as applicable.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+/**
+ * @author Alexey A. Ivanov
+ * @version $Revision$
+*/
+package javax.swing.text.html;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.swing.text.AttributeSet;
+import javax.swing.text.StyleContext;
+
+import org.apache.harmony.x.swing.Utilities;
+
+/**
+ * Attributes and Tags of this class are defined by HTML 4.01 specification,
+ * see <a href="http://www.w3.org/TR/html401/">HTML 4.01 Specification</a>.
+ */
+public class HTML {
+
+    public static final class Attribute {
+        public static final Attribute ACTION = new Attribute("action");
+        public static final Attribute ALIGN = new Attribute("align");
+        public static final Attribute ALINK = new Attribute("alink");
+        public static final Attribute ALT = new Attribute("alt");
+        public static final Attribute ARCHIVE = new Attribute("archive");
+        public static final Attribute BACKGROUND = new Attribute("background");
+        public static final Attribute BGCOLOR = new Attribute("bgcolor");
+        public static final Attribute BORDER = new Attribute("border");
+        public static final Attribute CELLPADDING =
+                                            new Attribute("cellpadding");
+        public static final Attribute CELLSPACING =
+                                            new Attribute("cellspacing");
+        public static final Attribute CHECKED = new Attribute("checked");
+        public static final Attribute CLASS = new Attribute("class");
+        public static final Attribute CLASSID = new Attribute("classid");
+        public static final Attribute CLEAR = new Attribute("clear");
+        public static final Attribute CODE = new Attribute("code");
+        public static final Attribute CODEBASE = new Attribute("codebase");
+        public static final Attribute CODETYPE = new Attribute("codetype");
+        public static final Attribute COLOR = new Attribute("color");
+        public static final Attribute COLS = new Attribute("cols");
+        public static final Attribute COLSPAN = new Attribute("colspan");
+        public static final Attribute COMMENT = new Attribute("comment");
+        public static final Attribute COMPACT = new Attribute("compact");
+        public static final Attribute CONTENT = new Attribute("content");
+        public static final Attribute COORDS = new Attribute("coords");
+        public static final Attribute DATA = new Attribute("data");
+        public static final Attribute DECLARE = new Attribute("declare");
+        public static final Attribute DIR = new Attribute("dir");
+        public static final Attribute DUMMY = new Attribute("dummy");
+        public static final Attribute ENCTYPE = new Attribute("enctype");
+        public static final Attribute ENDTAG = new Attribute("endtag");
+        public static final Attribute FACE = new Attribute("face");
+        public static final Attribute FRAMEBORDER =
+                                            new Attribute("frameborder");
+        public static final Attribute HALIGN = new Attribute("halign");
+        public static final Attribute HEIGHT = new Attribute("height");
+        public static final Attribute HREF = new Attribute("href");
+        public static final Attribute HSPACE = new Attribute("hspace");
+        public static final Attribute HTTPEQUIV = new Attribute("http-equiv");
+        public static final Attribute ID = new Attribute("id");
+        public static final Attribute ISMAP = new Attribute("ismap");
+        public static final Attribute LANG = new Attribute("lang");
+        public static final Attribute LANGUAGE = new Attribute("language");
+        public static final Attribute LINK = new Attribute("link");
+        public static final Attribute LOWSRC = new Attribute("lowsrc");
+        public static final Attribute MARGINHEIGHT =
+                                            new Attribute("marginheight");
+        public static final Attribute MARGINWIDTH =
+                                            new Attribute("marginwidth");
+        public static final Attribute MAXLENGTH = new Attribute("maxlength");
+        public static final Attribute METHOD = new Attribute("method");
+        public static final Attribute MULTIPLE = new Attribute("multiple");
+        public static final Attribute N = new Attribute("n");
+        public static final Attribute NAME = new Attribute("name");
+        public static final Attribute NOHREF = new Attribute("nohref");
+        public static final Attribute NORESIZE = new Attribute("noresize");
+        public static final Attribute NOSHADE = new Attribute("noshade");
+        public static final Attribute NOWRAP = new Attribute("nowrap");
+        public static final Attribute PROMPT = new Attribute("prompt");
+        public static final Attribute REL = new Attribute("rel");
+        public static final Attribute REV = new Attribute("rev");
+        public static final Attribute ROWS = new Attribute("rows");
+        public static final Attribute ROWSPAN = new Attribute("rowspan");
+        public static final Attribute SCROLLING = new Attribute("scrolling");
+        public static final Attribute SELECTED = new Attribute("selected");
+        public static final Attribute SHAPE = new Attribute("shape");
+        public static final Attribute SHAPES = new Attribute("shapes");
+        public static final Attribute SIZE = new Attribute("size");
+        public static final Attribute SRC = new Attribute("src");
+        public static final Attribute STANDBY = new Attribute("standby");
+        public static final Attribute START = new Attribute("start");
+        public static final Attribute STYLE = new Attribute("style");
+        public static final Attribute TARGET = new Attribute("target");
+        public static final Attribute TEXT = new Attribute("text");
+        public static final Attribute TITLE = new Attribute("title");
+        public static final Attribute TYPE = new Attribute("type");
+        public static final Attribute USEMAP = new Attribute("usemap");
+        public static final Attribute VALIGN = new Attribute("valign");
+        public static final Attribute VALUE = new Attribute("value");
+        public static final Attribute VALUETYPE = new Attribute("valuetype");
+        public static final Attribute VERSION = new Attribute("version");
+        public static final Attribute VLINK = new Attribute("vlink");
+        public static final Attribute VSPACE = new Attribute("vspace");
+        public static final Attribute WIDTH = new Attribute("width");
+
+        static final Attribute ACCESSKEY = new Attribute("accesskey");
+        static final Attribute DISABLED = new Attribute("disabled");
+        static final Attribute LABEL = new Attribute("label");
+        static final Attribute READONLY = new Attribute("readonly");
+
+        static final String IMPLIED_NEW_LINE = "CR";
+
+        private final String id;
+
+        private Attribute(final String id) {
+            this.id = id;
+        }
+
+        public String toString() {
+            return id;
+        }
+    }
+
+    public static class Tag {
+        public static final Tag A = new Tag("a", false, false);
+        public static final Tag ADDRESS = new Tag("address", false, false);
+        public static final Tag APPLET = new Tag("applet", false, false);
+        public static final Tag AREA = new Tag("area", false, false);
+        public static final Tag B = new Tag("b", false, false);
+        public static final Tag BASE = new Tag("base", false, false);
+        public static final Tag BASEFONT = new Tag("basefont", false, false);
+        public static final Tag BIG = new Tag("big", false, false);
+        public static final Tag BLOCKQUOTE = new Tag("blockquote", true, true);
+        public static final Tag BODY = new Tag("body", true, true);
+        public static final Tag BR = new Tag("br", true, false);
+        public static final Tag CAPTION = new Tag("caption", false, false);
+        public static final Tag CENTER = new Tag("center", true, false);
+        public static final Tag CITE = new Tag("cite", false, false);
+        public static final Tag CODE = new Tag("code", false, false);
+        public static final Tag COMMENT = new Tag("comment", false, false);
+        public static final Tag CONTENT = new Tag("content", false, false);
+        public static final Tag DD = new Tag("dd", true, true);
+        public static final Tag DFN = new Tag("dfn", false, false);
+        public static final Tag DIR = new Tag("dir", true, true);
+        public static final Tag DIV = new Tag("div", true, true);
+        public static final Tag DL = new Tag("dl", true, true);
+        public static final Tag DT = new Tag("dt", true, true);
+        public static final Tag EM = new Tag("em", false, false);
+        public static final Tag FONT = new Tag("font", false, false);
+        public static final Tag FORM = new Tag("form", true, false);
+        public static final Tag FRAME = new Tag("frame", false, false);
+        public static final Tag FRAMESET = new Tag("frameset", false, false);
+        public static final Tag H1 = new Tag("h1", true, true);
+        public static final Tag H2 = new Tag("h2", true, true);
+        public static final Tag H3 = new Tag("h3", true, true);
+        public static final Tag H4 = new Tag("h4", true, true);
+        public static final Tag H5 = new Tag("h5", true, true);
+        public static final Tag H6 = new Tag("h6", true, true);
+        public static final Tag HEAD = new Tag("head", true, true);
+        public static final Tag HR = new Tag("hr", true, false);
+        public static final Tag HTML = new Tag("html", true, false);
+        public static final Tag I = new Tag("i", false, false);
+        public static final Tag IMG = new Tag("img", false, false);
+        public static final Tag IMPLIED = new Tag("p-implied", false, false);
+        public static final Tag INPUT = new Tag("input", false, false);
+        public static final Tag ISINDEX = new Tag("isindex", true, false);
+        public static final Tag KBD = new Tag("kbd", false, false);
+        public static final Tag LI = new Tag("li", true, true);
+        public static final Tag LINK = new Tag("link", false, false);
+        public static final Tag MAP = new Tag("map", false, false);
+        public static final Tag MENU = new Tag("menu", true, true);
+        public static final Tag META = new Tag("meta", false, false);
+        public static final Tag NOFRAMES = new Tag("noframes", true, true);
+        public static final Tag OBJECT = new Tag("object", false, false);
+        public static final Tag OL = new Tag("ol", true, true);
+        public static final Tag OPTION = new Tag("option", false, false);
+        public static final Tag P = new Tag("p", true, true);
+        public static final Tag PARAM = new Tag("param", false, false);
+        public static final Tag PRE = new Tag("pre", true, true);
+        public static final Tag S = new Tag("s", false, false);
+        public static final Tag SAMP = new Tag("samp", false, false);
+        public static final Tag SCRIPT = new Tag("script", false, false);
+        public static final Tag SELECT = new Tag("select", false, false);
+        public static final Tag SMALL = new Tag("small", false, false);
+        public static final Tag SPAN = new Tag("span", false, false);
+        public static final Tag STRIKE = new Tag("strike", false, false);
+        public static final Tag STRONG = new Tag("strong", false, false);
+        public static final Tag STYLE = new Tag("style", false, false);
+        public static final Tag SUB = new Tag("sub", false, false);
+        public static final Tag SUP = new Tag("sup", false, false);
+        public static final Tag TABLE = new Tag("table", false, true);
+        public static final Tag TD = new Tag("td", true, true);
+        public static final Tag TEXTAREA = new Tag("textarea", false, false);
+        public static final Tag TH = new Tag("th", true, true);
+        public static final Tag TITLE = new Tag("title", true, true);
+        public static final Tag TR = new Tag("tr", false, true);
+        public static final Tag TT = new Tag("tt", false, false);
+        public static final Tag U = new Tag("u", false, false);
+        public static final Tag UL = new Tag("ul", true, true);
+        public static final Tag VAR = new Tag("var", false, false);
+
+        static final Tag ABBR = new Tag("abbr", false, false);
+        static final Tag ACRONYM = new Tag("acronym", false, false);
+        static final Tag BDO = new Tag("bdo", false, false);
+        static final Tag BUTTON = new Tag("button", false, false);
+        static final Tag COL = new Tag("col", false, false);
+        static final Tag COLGROUP = new Tag("colgroup", false, false);
+        static final Tag DEL = new Tag("del", false, false);
+        static final Tag FIELDSET = new Tag("fieldset", false, false);
+        static final Tag IFRAME = new Tag("iframe", true, true);
+        static final Tag INS = new Tag("ins", false, false);
+        static final Tag LABEL = new Tag("label", false, false);
+        static final Tag LEGEND = new Tag("legend", false, false);
+        static final Tag NOSCRIPT = new Tag("noscript", true, true);
+        static final Tag OPTGROUP = new Tag("optgroup", false, false);
+        static final Tag Q = new Tag("q", false, false);
+        static final Tag TBODY = new Tag("tbody", true, true);
+        static final Tag TFOOT = new Tag("tfoot", true, true);
+        static final Tag THEAD = new Tag("thead", true, true);
+
+        String id;
+        boolean causesBreak;
+        boolean isBlock;
+
+        public Tag() {
+            this(null, false, false);
+        }
+
+        protected Tag(final String id) {
+            this(id, false, false);
+        }
+
+        protected Tag(final String id, final boolean causesBreak,
+                      final boolean isBlock) {
+            this.id = id;
+            this.causesBreak = causesBreak;
+            this.isBlock = isBlock;
+        }
+
+        public boolean breaksFlow() {
+            return causesBreak;
+        }
+
+        public boolean isBlock() {
+            return isBlock;
+        }
+
+        public boolean isPreformatted() {
+            return this == PRE || this == TEXTAREA;
+        }
+
+        public String toString() {
+            return id;
+        }
+    }
+
+    public static class UnknownTag extends Tag implements Serializable {
+        public UnknownTag(final String id) {
+            super(id);
+        }
+
+        public boolean equals(final Object obj) {
+            return obj instanceof UnknownTag
+                   && toString().equals(obj.toString());
+        }
+
+        public int hashCode() {
+            return toString().hashCode();
+        }
+
+        private void writeObject(final ObjectOutputStream out)
+            throws IOException {
+
+            out.defaultWriteObject();
+            out.writeObject(toString());
+            out.writeBoolean(breaksFlow());
+            out.writeBoolean(isBlock());
+        }
+
+        private void readObject(final ObjectInputStream in)
+            throws IOException, ClassNotFoundException {
+
+            in.defaultReadObject();
+            id = (String)in.readObject();
+            causesBreak = in.readBoolean();
+            isBlock = in.readBoolean();
+        }
+    }
+
+    public static final String NULL_ATTRIBUTE_VALUE = "#DEFAULT";
+
+    private static final Map attrMap = new HashMap();
+    private static final Map tagMap = new HashMap();
+
+    private static final Attribute[] attrs = {
+        Attribute.ACTION,
+        Attribute.ALIGN,
+        Attribute.ALINK,
+        Attribute.ALT,
+        Attribute.ARCHIVE,
+        Attribute.BACKGROUND,
+        Attribute.BGCOLOR,
+        Attribute.BORDER,
+        Attribute.CELLPADDING,
+        Attribute.CELLSPACING,
+        Attribute.CHECKED,
+        Attribute.CLASS,
+        Attribute.CLASSID,
+        Attribute.CLEAR,
+        Attribute.CODE,
+        Attribute.CODEBASE,
+        Attribute.CODETYPE,
+        Attribute.COLOR,
+        Attribute.COLS,
+        Attribute.COLSPAN,
+        Attribute.COMMENT,
+        Attribute.COMPACT,
+        Attribute.CONTENT,
+        Attribute.COORDS,
+        Attribute.DATA,
+        Attribute.DECLARE,
+        Attribute.DIR,
+        Attribute.DUMMY,
+        Attribute.ENCTYPE,
+        Attribute.ENDTAG,
+        Attribute.FACE,
+        Attribute.FRAMEBORDER,
+        Attribute.HALIGN,
+        Attribute.HEIGHT,
+        Attribute.HREF,
+        Attribute.HSPACE,
+        Attribute.HTTPEQUIV,
+        Attribute.ID,
+        Attribute.ISMAP,
+        Attribute.LANG,
+        Attribute.LANGUAGE,
+        Attribute.LINK,
+        Attribute.LOWSRC,
+        Attribute.MARGINHEIGHT,
+        Attribute.MARGINWIDTH,
+        Attribute.MAXLENGTH,
+        Attribute.METHOD,
+        Attribute.MULTIPLE,
+        Attribute.N,
+        Attribute.NAME,
+        Attribute.NOHREF,
+        Attribute.NORESIZE,
+        Attribute.NOSHADE,
+        Attribute.NOWRAP,
+        Attribute.PROMPT,
+        Attribute.REL,
+        Attribute.REV,
+        Attribute.ROWS,
+        Attribute.ROWSPAN,
+        Attribute.SCROLLING,
+        Attribute.SELECTED,
+        Attribute.SHAPE,
+        Attribute.SHAPES,
+        Attribute.SIZE,
+        Attribute.SRC,
+        Attribute.STANDBY,
+        Attribute.START,
+        Attribute.STYLE,
+        Attribute.TARGET,
+        Attribute.TEXT,
+        Attribute.TITLE,
+        Attribute.TYPE,
+        Attribute.USEMAP,
+        Attribute.VALIGN,
+        Attribute.VALUE,
+        Attribute.VALUETYPE,
+        Attribute.VERSION,
+        Attribute.VLINK,
+        Attribute.VSPACE,
+        Attribute.WIDTH,
+
+        // HTML 4.01-specific attributes
+        Attribute.ACCESSKEY,
+        Attribute.DISABLED,
+        Attribute.LABEL,
+        Attribute.READONLY
+    };
+
+    private static final Tag[] tags = {
+        Tag.A,
+        Tag.ADDRESS,
+        Tag.APPLET,
+        Tag.AREA,
+        Tag.B,
+        Tag.BASE,
+        Tag.BASEFONT,
+        Tag.BIG,
+        Tag.BLOCKQUOTE,
+        Tag.BODY,
+        Tag.BR,
+        Tag.CAPTION,
+        Tag.CENTER,
+        Tag.CITE,
+        Tag.CODE,
+        //Tag.COMMENT,
+        //Tag.CONTENT,
+        Tag.DD,
+        Tag.DFN,
+        Tag.DIR,
+        Tag.DIV,
+        Tag.DL,
+        Tag.DT,
+        Tag.EM,
+        Tag.FONT,
+        Tag.FORM,
+        Tag.FRAME,
+        Tag.FRAMESET,
+        Tag.H1,
+        Tag.H2,
+        Tag.H3,
+        Tag.H4,
+        Tag.H5,
+        Tag.H6,
+        Tag.HEAD,
+        Tag.HR,
+        Tag.HTML,
+        Tag.I,
+        Tag.IMG,
+        //Tag.IMPLIED,
+        Tag.INPUT,
+        Tag.ISINDEX,
+        Tag.KBD,
+        Tag.LI,
+        Tag.LINK,
+        Tag.MAP,
+        Tag.MENU,
+        Tag.META,
+        Tag.NOFRAMES,
+        Tag.OBJECT,
+        Tag.OL,
+        Tag.OPTION,
+        Tag.P,
+        Tag.PARAM,
+        Tag.PRE,
+        Tag.S,
+        Tag.SAMP,
+        Tag.SCRIPT,
+        Tag.SELECT,
+        Tag.SMALL,
+        Tag.SPAN,
+        Tag.STRIKE,
+        Tag.STRONG,
+        Tag.STYLE,
+        Tag.SUB,
+        Tag.SUP,
+        Tag.TABLE,
+        Tag.TD,
+        Tag.TEXTAREA,
+        Tag.TH,
+        Tag.TITLE,
+        Tag.TR,
+        Tag.TT,
+        Tag.U,
+        Tag.UL,
+        Tag.VAR,
+        // HTML 4.01-specific tags
+        Tag.ABBR,
+        Tag.ACRONYM,
+        Tag.BDO,
+        Tag.BUTTON,
+        Tag.COL,
+        Tag.COLGROUP,
+        Tag.DEL,
+        Tag.FIELDSET,
+        Tag.IFRAME,
+        Tag.INS,
+        Tag.LABEL,
+        Tag.LEGEND,
+        Tag.NOSCRIPT,
+        Tag.OPTGROUP,
+        Tag.Q,
+        Tag.TBODY,
+        Tag.TFOOT,
+        Tag.THEAD
+    };
+
+    static {
+        for (int i = 0; i < attrs.length; i++) {
+            attrMap.put(attrs[i].toString(), attrs[i]);
+            StyleContext.registerStaticAttributeKey(attrs[i]);
+        }
+
+        for (int i = 0; i < tags.length; i++) {
+            tagMap.put(tags[i].toString(), tags[i]);
+            StyleContext.registerStaticAttributeKey(tags[i]);
+        }
+    }
+
+    public HTML() {
+    }
+
+    public static Tag[] getAllTags() {
+        return tags;
+    }
+
+    public static Tag getTag(final String tagName) {
+        return (Tag)tagMap.get(tagName);
+    }
+
+    public static Attribute[] getAllAttributeKeys() {
+        return attrs;
+    }
+
+    public static Attribute getAttributeKey(final String attrName) {
+        return (Attribute)attrMap.get(attrName);
+    }
+
+    public static int getIntegerAttributeValue(final AttributeSet attr,
+                                               final Attribute key,
+                                               final int def) {
+        final Object value = attr.getAttribute(key);
+        if (value != null) {
+            try {
+                return Integer.parseInt((String)value);
+            } catch (NumberFormatException e) {
+                return def;
+            }
+        }
+        return def;
+    }
+
+    static URL resolveURL(final URL url, final URL base) {
+        if (url == null) {
+            return null;
+        }
+        return resolveURL(url.toString(), base != null ? base.toString() : null);
+    }
+
+    static URL resolveURL(final String url, final URL base) {
+        if (Utilities.isEmptyString(url)) {
+            return null;
+        }
+        return resolveURL(url, base != null ? base.toString() : null);
+    }
+
+    static URL resolveURL(final String url, final String base) {
+        if (Utilities.isEmptyString(url)) {
+            return null;
+        }
+
+        URI uri = null;
+        if (base != null) {
+            try {
+                uri = new URI(base).resolve(url);
+            } catch (URISyntaxException e) { }
+        }
+
+        URL result = null;
+        try {
+            if (uri != null) {
+                result = uri.toURL();
+            } else {
+                result = new URL(url);
+            }
+        } catch (final MalformedURLException e) { }
+
+        return result;
+    }
+}
+