I fixed the BasicHTML to embed the create HTML View inside a HTMLRootView
which is similar in purpose and implementation like the
BasicTextUI.RootView.

2006-03-03  Roman Kennke  <[EMAIL PROTECTED]>

        * javax/swing/plaf/basic/BasicHTML.java
        (HTMLRootView): New inner class.
        (createHTMLView): Embed view inside a HTMLRootView.

/Roman
Index: javax/swing/plaf/basic/BasicHTML.java
===================================================================
RCS file: /cvsroot/classpath/classpath/javax/swing/plaf/basic/BasicHTML.java,v
retrieving revision 1.2
diff -u -r1.2 BasicHTML.java
--- javax/swing/plaf/basic/BasicHTML.java	14 Feb 2006 22:44:53 -0000	1.2
+++ javax/swing/plaf/basic/BasicHTML.java	3 Mar 2006 10:13:11 -0000
@@ -38,12 +38,21 @@
 
 package javax.swing.plaf.basic;
 
+import java.awt.Container;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.awt.Shape;
 import java.io.IOException;
 import java.io.StringReader;
 
 import javax.swing.JComponent;
+import javax.swing.SwingConstants;
+import javax.swing.event.DocumentEvent;
 import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.EditorKit;
 import javax.swing.text.Element;
+import javax.swing.text.Position;
 import javax.swing.text.View;
 import javax.swing.text.ViewFactory;
 import javax.swing.text.html.HTMLDocument;
@@ -59,6 +68,287 @@
 {
 
   /**
+   * This class serves as the root view for HTML rendering components.
+   * Its purpose and implementation is similar to the BasicTextUI.RootView
+   * class, only that is implements some stuff differently due to the nature
+   * of not beeing inside a JTextComponent.
+   *
+   * @author Roman Kennke ([EMAIL PROTECTED])
+   */
+  private static class HTMLRootView extends View
+  {
+    /**
+     * The real root view.
+     */
+    private View view;
+
+    /**
+     * The component on which to render the view.
+     */
+    private JComponent component;
+
+    /**
+     * The EditorKit.
+     */
+    private EditorKit editorKit;
+
+    /**
+     * The document to use.
+     */
+    private Document document;
+
+    /**
+     * Creates a new RootView.
+     */
+    public HTMLRootView(JComponent c, View view, EditorKit kit, Document doc)
+    {
+      super(null);
+      component = c;
+      editorKit = kit;
+      document = doc;
+      setView(view);
+    }
+
+    /**
+     * Returns the ViewFactory for this RootView. If the current EditorKit
+     * provides a ViewFactory, this is used. Otherwise the TextUI itself
+     * is returned as a ViewFactory.
+     *
+     * @return the ViewFactory for this RootView
+     */
+    public ViewFactory getViewFactory()
+    {
+      return editorKit.getViewFactory();
+    }
+
+    /**
+     * Indicates that the preferences of one of the child view has changed.
+     * This calls revalidate on the text component.
+     *
+     * @param v the child view which's preference has changed
+     * @param width <code>true</code> if the width preference has changed
+     * @param height <code>true</code> if the height preference has changed
+     */
+    public void preferenceChanged(View v, boolean width, boolean height)
+    {
+      component.revalidate();
+    }
+
+    /**
+     * Sets the real root view.
+     *
+     * @param v the root view to set
+     */
+    public void setView(View v)
+    {
+      if (view != null)
+        view.setParent(null);
+      
+      if (v != null)
+        v.setParent(this);
+
+      view = v;
+    }
+
+    /**
+     * Returns the real root view, regardless of the index.
+     *
+     * @param index not used here
+     *
+     * @return the real root view, regardless of the index.
+     */
+    public View getView(int index)
+    {
+      return view;
+    }
+
+    /**
+     * Returns <code>1</code> since the RootView always contains one
+     * child, that is the real root of the View hierarchy.
+     *
+     * @return <code>1</code> since the RootView always contains one
+     *         child, that is the real root of the View hierarchy
+     */
+    public int getViewCount()
+    {
+      int count = 0;
+      if (view != null)
+        count = 1;
+      return count;
+    }
+
+    /**
+     * Returns the <code>Container</code> that contains this view. This
+     * normally will be the text component that is managed by this TextUI.
+     *
+     * @return the <code>Container</code> that contains this view
+     */
+    public Container getContainer()
+    {
+      return component;
+    }
+
+    /**
+     * Returns the preferred span along the specified <code>axis</code>.
+     * This is delegated to the real root view.
+     *
+     * @param axis the axis for which the preferred span is queried
+     *
+     * @return the preferred span along the axis
+     */
+    public float getPreferredSpan(int axis)
+    {
+      if (view != null)
+        return view.getPreferredSpan(axis);
+
+      return Integer.MAX_VALUE;
+    }
+
+    /**
+     * Paints the view. This is delegated to the real root view.
+     *
+     * @param g the <code>Graphics</code> context to paint to
+     * @param s the allocation for the View
+     */
+    public void paint(Graphics g, Shape s)
+    {
+      if (view != null)
+        {
+          Rectangle b = s.getBounds();
+          view.setSize(b.width, b.height);
+          view.paint(g, s);
+        }
+    }
+
+
+    /**
+     * Maps a position in the document into the coordinate space of the View.
+     * The output rectangle usually reflects the font height but has a width
+     * of zero.
+     *
+     * This is delegated to the real root view.
+     *
+     * @param position the position of the character in the model
+     * @param a the area that is occupied by the view
+     * @param bias either [EMAIL PROTECTED] Position.Bias#Forward} or
+     *        [EMAIL PROTECTED] Position.Bias#Backward} depending on the preferred
+     *        direction bias. If <code>null</code> this defaults to
+     *        <code>Position.Bias.Forward</code>
+     *
+     * @return a rectangle that gives the location of the document position
+     *         inside the view coordinate space
+     *
+     * @throws BadLocationException if <code>pos</code> is invalid
+     * @throws IllegalArgumentException if b is not one of the above listed
+     *         valid values
+     */
+    public Shape modelToView(int position, Shape a, Position.Bias bias)
+      throws BadLocationException
+    {
+      return view.modelToView(position, a, bias);
+    }
+
+    /**
+     * Maps coordinates from the <code>View</code>'s space into a position
+     * in the document model.
+     *
+     * @param x the x coordinate in the view space
+     * @param y the y coordinate in the view space
+     * @param a the allocation of this <code>View</code>
+     * @param b the bias to use
+     *
+     * @return the position in the document that corresponds to the screen
+     *         coordinates <code>x, y</code>
+     */
+    public int viewToModel(float x, float y, Shape a, Position.Bias[] b)
+    {
+      return view.viewToModel(x, y, a, b);
+    }
+
+    /**
+     * Notification about text insertions. These are forwarded to the
+     * real root view.
+     *
+     * @param ev the DocumentEvent describing the change
+     * @param shape the current allocation of the view's display
+     * @param vf the ViewFactory to use for creating new Views
+     */
+    public void insertUpdate(DocumentEvent ev, Shape shape, ViewFactory vf)
+    {
+      view.insertUpdate(ev, shape, vf);
+    }
+
+    /**
+     * Notification about text removals. These are forwarded to the
+     * real root view.
+     *
+     * @param ev the DocumentEvent describing the change
+     * @param shape the current allocation of the view's display
+     * @param vf the ViewFactory to use for creating new Views
+     */
+    public void removeUpdate(DocumentEvent ev, Shape shape, ViewFactory vf)
+    {
+      view.removeUpdate(ev, shape, vf);
+    }
+
+    /**
+     * Notification about text changes. These are forwarded to the
+     * real root view.
+     *
+     * @param ev the DocumentEvent describing the change
+     * @param shape the current allocation of the view's display
+     * @param vf the ViewFactory to use for creating new Views
+     */
+    public void changedUpdate(DocumentEvent ev, Shape shape, ViewFactory vf)
+    {
+      view.changedUpdate(ev, shape, vf);
+    }
+
+    /**
+     * Returns the document position that is (visually) nearest to the given
+     * document position <code>pos</code> in the given direction <code>d</code>.
+     *
+     * @param pos the document position
+     * @param b the bias for <code>pos</code>
+     * @param a the allocation for the view
+     * @param d the direction, must be either [EMAIL PROTECTED] SwingConstants#NORTH},
+     *        [EMAIL PROTECTED] SwingConstants#SOUTH}, [EMAIL PROTECTED] SwingConstants#WEST} or
+     *        [EMAIL PROTECTED] SwingConstants#EAST}
+     * @param biasRet an array of [EMAIL PROTECTED] Position.Bias} that can hold at least
+     *        one element, which is filled with the bias of the return position
+     *        on method exit
+     *
+     * @return the document position that is (visually) nearest to the given
+     *         document position <code>pos</code> in the given direction
+     *         <code>d</code>
+     *
+     * @throws BadLocationException if <code>pos</code> is not a valid offset in
+     *         the document model
+     */
+    public int getNextVisualPositionFrom(int pos, Position.Bias b, Shape a,
+                                         int d, Position.Bias[] biasRet)
+      throws BadLocationException
+    {
+      return view.getNextVisualPositionFrom(pos, b, a, d, biasRet);
+    }
+
+    public int getStartOffset()
+    {
+      return 0;
+    }
+
+    public int getEndOffset()
+    {
+      return getDocument().getLength();
+    }
+
+    public Document getDocument()
+    {
+      return document;
+    }
+  }
+
+  /**
    * The key that is used to store a HTML view in a JComponent's client
    * properties.
    */
@@ -116,7 +406,8 @@
     ViewFactory vf = kit.getViewFactory();
     Element root = doc.getDefaultRootElement();
     View view = vf.create(root);
-    return view;
+    HTMLRootView rootView = new HTMLRootView(c, view, kit, doc);
+    return rootView;
   }
 
   /**

Reply via email to