This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[gui][PATCH] implementation of scrollpane and viewport


hi,

this patch implements JScrollPane and JViewport in a preliminary fashion. only the backing store method is used, and the javadocs are incomplete, but it does work. I'm committing it to help with other components which use scrollpanes or viewports internally.

the patch also includes a couple minor fixes and optimizations in different bits of swing, discovered in the last couple weeks.

side note: I will be commencing an initial merge back from java-gui-branch to the gcc trunk today. this isn't the closing of the branch, just a "checkpoint" merge.

-graydon


2004-03-12 Graydon Hoare <graydon@redhat.com>


	* gnu/java/awt/peer/gtk/GdkGraphics2D.java:
        Clipping fixes.
	* javax/swing/JComponent.java (paint):
        Use persistent double buffer.
	* javax/swing/JList.java (ListListener):
        Revalidate on changes.
	* javax/swing/JScrollPane.java: Reimplement.
	* javax/swing/JViewport.java: Reimplement.
	* javax/swing/ScrollPaneLayout.java: Reimplement.
	* javax/swing/ViewportLayout.java: Tidy up.
	* javax/swing/plaf/basic/BasicButtonListener.java:
        Remove printlns.
	* javax/swing/plaf/basic/BasicScrollPaneUI.java:
        Reimplement.
	* javax/swing/plaf/basic/BasicSliderUI.java:
        Handle missing labels.
	* javax/swing/plaf/basic/BasicViewportUI.java:
        Implement in terms of backing store only.

Index: gnu/java/awt/peer/gtk/GdkGraphics2D.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GdkGraphics2D.java,v
retrieving revision 1.7.2.8
diff -u -b -w -r1.7.2.8 GdkGraphics2D.java
--- gnu/java/awt/peer/gtk/GdkGraphics2D.java	5 Mar 2004 18:27:00 -0000	1.7.2.8
+++ gnu/java/awt/peer/gtk/GdkGraphics2D.java	12 Mar 2004 16:02:29 -0000
@@ -613,6 +613,26 @@
     else
       transform.concatenate (tx);
     setTransform (transform);
+    if (clip != null)
+      {
+        // FIXME: this should actuall try to transform the shape
+        // rather than degrade to bounds.
+        Rectangle2D r = clip.getBounds2D();
+        double[] coords = new double[] { r.getX(), r.getY(), 
+                                         r.getX() + r.getWidth(),
+                                         r.getY() + r.getHeight() };
+        try 
+          {
+            tx.createInverse().transform(coords, 0, coords, 0, 2);
+            r.setRect(coords[0], coords[1],
+                      coords[2] - coords[0], 
+                      coords[3] - coords[1]);
+            clip = r;
+          }
+        catch (java.awt.geom.NoninvertibleTransformException e)
+          {
+          }
+      }
   }
 
   public void rotate(double theta)
@@ -740,17 +760,27 @@
 
   public void setClip (int x, int y, int width, int height)
   {
-      cairoNewPath ();
-      cairoRectangle (x, y, width, height);
-      cairoClosePath ();
-      cairoClip ();
       clip = new Rectangle2D.Double ((double)x, (double)y, 
 				     (double)width, (double)height);
+    setClip(clip);
   }
 
   public void setClip (Shape s)
   {
-    clip (s);
+    if (s != null)
+      {
+        cairoNewPath ();
+        if (s instanceof Rectangle2D)
+          {
+            Rectangle2D r = (Rectangle2D)s;
+            cairoRectangle (r.getX (), r.getY (), 
+                            r.getWidth (), r.getHeight ());
+          }
+        else
+          walkPath (s.getPathIterator (null));
+        cairoClosePath ();
+        cairoClip ();
+      }
   }
 
   public void draw3DRect(int x, int y, int width, 
Index: javax/swing/JComponent.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/javax/swing/JComponent.java,v
retrieving revision 1.7.2.1
diff -u -b -w -r1.7.2.1 JComponent.java
--- javax/swing/JComponent.java	18 Feb 2004 14:43:42 -0000	1.7.2.1
+++ javax/swing/JComponent.java	12 Mar 2004 16:02:29 -0000
@@ -89,23 +89,27 @@
 {
   static final long serialVersionUID = -5242478962609715464L;
 
-  protected EventListenerList listenerList = new EventListenerList();
+  EventListenerList listenerList = new EventListenerList();
 
         /**
          * accessibleContext
          */
-        protected AccessibleContext accessibleContext;
+  AccessibleContext accessibleContext;
 
 	Dimension pref,min,max;
 	Border border;
 	JToolTip tooltip;
 	String tool_tip_text;
 	boolean use_double_buffer, opaque;
-	protected ComponentUI ui;
+  Image doubleBuffer;
+  int doubleBufferWidth = -1;
+  int doubleBufferHeight = -1;
+  ComponentUI ui;
 	private SwingPropertyChangeSupport changeSupport;
 
 	Hashtable prop_hash;
 
+
 	/**
 	 * AccessibleJComponent
 	 */
@@ -785,14 +789,21 @@
 	public void paint(Graphics g)
 	{
 		Graphics g2 = g;
-		Image im = null;
 		Rectangle r = getBounds ();
-		// System.err.println(this + ".paint(...), bounds = " + r);
 		
 		if (use_double_buffer)
 		{
-                  im = createImage (r.width, r.height);
-                  g2 = im.getGraphics ();
+
+                  if (doubleBuffer == null 
+                      || doubleBufferWidth != r.width 
+                      || doubleBufferHeight != r.height)
+                    {
+                      doubleBuffer = createImage(r.width, r.height);
+                      doubleBufferWidth = r.width;
+                      doubleBufferHeight = r.height;
+                    }
+
+                  g2 = doubleBuffer.getGraphics ();
                   if (this.getBackground() != null)
                     {
                       Color save = g2.getColor();
@@ -813,7 +824,7 @@
 			// always draw at 0,0, because regardless of your current bounds,
 			// the graphics object you were passed was positioned so the origin
 			// was at the upper left corner of your bounds.
-			g.drawImage (im, 0, 0, (ImageObserver)null);
+			g.drawImage (doubleBuffer, 0, 0, (ImageObserver)null);
 		}
 	}
 
Index: javax/swing/JList.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/javax/swing/JList.java,v
retrieving revision 1.4.2.1
diff -u -b -w -r1.4.2.1 JList.java
--- javax/swing/JList.java	26 Feb 2004 00:34:01 -0000	1.4.2.1
+++ javax/swing/JList.java	12 Mar 2004 16:02:29 -0000
@@ -277,14 +277,17 @@
     // ListDataListener events
     public void contentsChanged(ListDataEvent event)
     {
+      JList.this.revalidate();
       JList.this.repaint();
     }
     public void intervalAdded(ListDataEvent event)
     {
+      JList.this.revalidate();
       JList.this.repaint();
     }
     public void intervalRemoved(ListDataEvent event)
     {
+      JList.this.revalidate();
       JList.this.repaint();
     }
     // ListSelectionListener events
Index: javax/swing/JScrollPane.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/javax/swing/JScrollPane.java,v
retrieving revision 1.3
diff -u -b -w -r1.3 JScrollPane.java
--- javax/swing/JScrollPane.java	12 Feb 2004 00:17:23 -0000	1.3
+++ javax/swing/JScrollPane.java	12 Mar 2004 16:02:29 -0000
@@ -1,5 +1,5 @@
 /* JScrollPane.java -- 
-   Copyright (C) 2002 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2004 Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -39,86 +39,414 @@
 package javax.swing;
 
 import java.awt.Component;
+import java.awt.ComponentOrientation;
+import java.awt.LayoutManager;
+import java.awt.Insets;
+import java.awt.Point;
+import java.awt.Rectangle;
+
+import javax.swing.border.Border;
 import javax.accessibility.Accessible;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 import javax.swing.plaf.ScrollPaneUI;
+import javax.swing.plaf.UIResource;
+
+/**
+ * <table>
+ * <tr><th>Property                    </th><th>Stored in       </th><th>Bound?</th></tr>
+ * <tr><td>columnHeader                </td><td>scrollPane      </td><td>yes   </td></tr>
+ * <tr><td>columnHeaderView            </td><td>columnHeader    </td><td>no    </td></tr>
+ * <tr><td>componentOrientation        </td><td>scrollPane      </td><td>yes   </td></tr>
+ * <tr><td>horizontalScrollBar         </td><td>scrollPane      </td><td>yes   </td></tr>
+ * <tr><td>horizontalScrollBarPolicy   </td><td>scrollPane      </td><td>yes   </td></tr>
+ * <tr><td>layout                      </td><td>scrollPane      </td><td>yes   </td></tr>
+ * <tr><td>rowHeader                   </td><td>scrollPane      </td><td>yes   </td></tr>
+ * <tr><td>rowHeaderView               </td><td>rowHeader       </td><td>no    </td></tr>
+ * <tr><td>validateRoot                </td><td>scrollPane      </td><td>no    </td></tr>
+ * <tr><td>verticalScrollBar           </td><td>scrollPane      </td><td>yes   </td></tr>
+ * <tr><td>verticalScrollBarPolicy     </td><td>scrollPane      </td><td>yes   </td></tr>
+ * <tr><td>viewport                    </td><td>scrollPane      </td><td>yes   </td></tr>
+ * <tr><td>viewportBorder              </td><td>scrollPane      </td><td>yes   </td></tr>
+ * <tr><td>viewportBorderBounds        </td><td>scrollPane      </td><td>no    </td></tr>
+ * <tr><td>viewportView                </td><td>viewport        </td><td>no    </td></tr>
+ * <tr><td>wheelScrollingEnabled       </td><td>scrollPane      </td><td>yes   </td></tr>
+ * </table>
+ */
+public class JScrollPane 
+  extends JComponent 
+  implements Accessible, ScrollPaneConstants
+{
+  JViewport columnHeader;
+  JViewport rowHeader;
+
+  Component lowerLeft;
+  Component lowerRight;
+  Component upperLeft;
+  Component upperRight;
+
+  JScrollBar horizontalScrollBar;
+  int horizontalScrollBarPolicy;
+  JScrollBar verticalScrollBar;
+  int verticalScrollBarPolicy;
+
+  JViewport viewport;
+  Border viewportBorder;
+  boolean wheelScrollingEnabled;
+  ChangeListener scrollListener;  
+
+  public static final String COLUMN_HEADER_CHANGED_PROPERTY = "columnHeader";
+  public static final String COMPONENT_ORIENTATION_CHANGED_PROPERTY = "componentOrientation";
+  public static final String HORIZONTAL_SCROLLBAR_CHANGED_PROPERTY = "horizontalScrollBar";
+  public static final String HORIZONTAL_SCROLLBAR_POLICY_CHANGED_PROPERTY = "horizontalScrollBarPolicy";
+  public static final String LAYOUT_CHANGED_PROPERTY = "layout";
+  public static final String ROW_HEADER_CHANGED_PROPERTY = "rowHeader";
+  public static final String VERTICAL_SCROLLBAR_CHANGED_PROPERTY = "verticalScrollBar";
+  public static final String VERTICAL_SCROLLBAR_POLICY_CHANGED_PROPERTY = "verticalScrollBarPolicy";
+  public static final String VIEWPORT_CHANGED_PROPERTY = "viewport";
+  public static final String VIEWPORT_BORDER_CHANGED_PROPERTY = "viewportBorder";
+  public static final String WHEEL_SCROLLING_ENABLED_CHANGED_PROPERTY = "wheelScrollingEnabled";
+
+  public JViewport getColumnHeader()
+  {
+    return columnHeader;
+  }
+
+  public Component getCorner(String key) {
+    if (getComponentOrientation() 
+        == ComponentOrientation.LEFT_TO_RIGHT)
+      {
+        if (key == LOWER_LEADING_CORNER)
+          key = LOWER_LEFT_CORNER;
+        else if (key == LOWER_TRAILING_CORNER)
+          key = LOWER_RIGHT_CORNER;
+        else if (key == UPPER_LEADING_CORNER)
+          key = UPPER_LEFT_CORNER;
+        else if (key == UPPER_TRAILING_CORNER)
+          key = UPPER_RIGHT_CORNER;
+      }
+    else if (getComponentOrientation() 
+             == ComponentOrientation.RIGHT_TO_LEFT)
+      {
+        if (key == LOWER_LEADING_CORNER)
+          key = LOWER_RIGHT_CORNER;
+        else if (key == LOWER_TRAILING_CORNER)
+          key = LOWER_LEFT_CORNER;
+        else if (key == UPPER_LEADING_CORNER)
+          key = UPPER_RIGHT_CORNER;
+        else if (key == UPPER_TRAILING_CORNER)
+          key = UPPER_LEFT_CORNER;
+      }
+
+    if (key == LOWER_RIGHT_CORNER)
+      return lowerRight;
+    else if (key == UPPER_RIGHT_CORNER)
+      return upperRight;
+    else if (key == LOWER_LEFT_CORNER)
+      return lowerLeft;
+    else if (key == UPPER_LEFT_CORNER)
+      return upperLeft;
+    return null;
+  }
+
+  public JScrollBar getHorizontalScrollBar()
+  {
+    return horizontalScrollBar;
+  }
+
+  public int getHorizontalScrollBarPolicy()
+  {
+    return horizontalScrollBarPolicy;
+  }
+
+  public JViewport getRowHeader()
+  {
+    return rowHeader;
+  }
 
-public class JScrollPane extends JComponent implements Accessible, ScrollPaneConstants
+  public JScrollBar getVerticalScrollBar()
 {
-    protected JViewport  columnHeader;
-    protected JViewport  rowHeader;
+    return verticalScrollBar;
+  }
 
-    protected Component  lowerLeft;
-    protected Component  lowerRight;
-    protected Component  upperLeft;
-    protected Component  upperRight;
-
-    protected JScrollBar horizontalScrollBar;
-    protected int        horizontalScrollBarPolicy;
-    protected JScrollBar verticalScrollBar;
-    protected int        verticalScrollBarPolicy;
+  public int getVerticalScrollBarPolicy()
+  {
+    return verticalScrollBarPolicy;
+  }
 
-    protected JViewport  viewport;
+  public JViewport getViewport()
+  {
+    return viewport;
+  }
 
+  public Border getViewportBorder()
+  {
+    return viewportBorder;
+  }
 
-    public JScrollPane() 
+  public Rectangle getViewportBorderBounds()
+  {
+    if (viewportBorder == null)
+      {
+        if (getViewport() == null)
+          return new Rectangle(0,0,0,0);
+        else
+          return getViewport().getBounds();
+      }
+    else
     {
-	this(null, 0, 0);
+        Insets i = viewportBorder.getBorderInsets(getViewport());
+        if (getViewport() == null)
+          return new Rectangle(0,0,
+                               i.left+i.right, i.top+i.bottom);
+        else
+          {
+            Rectangle b = getViewport().getBounds();
+            return new Rectangle(b.x - i.left, 
+                                 b.y - i.top,
+                                 b.width + i.left + i.right, 
+                                 b.height + i.top + i.bottom);
+          }
+      }
     }
     
-    public JScrollPane(Component view) 
+  public boolean isWheelScrollingEnabled()
     {
-	this(view, 0, 0);
+    return wheelScrollingEnabled;
     }
     
     
-    public JScrollPane(int vsbPolicy, int hsbPolicy) 
+
+  private void sync()
+  {
+    LayoutManager m = super.getLayout();
+    if (m != null && m instanceof ScrollPaneLayout)
     {
-	this(null, 0, 0);
+        ScrollPaneLayout sl = (ScrollPaneLayout) m;
+        sl.syncWithScrollPane(this);
+      }
     }
 
-    public JScrollPane(Component view, int vsbPolicy, int hsbPolicy) 
+  private void removeNonNull(Component c)
     {
-	setViewportView(view);
-        setOpaque(true);
-	updateUI();
+    if (c != null)
+      remove(c);
     }
 
-    public String getUIClassID()
+  private void addNonNull(Component c)
     {
-	//Returns a string that specifies the name of the L&F class that renders this component.  
-	return "ScrollPaneUI";
+    if (c != null)
+      add(c);
     }
 
-    public JViewport getViewport()
+  public void setComponentOrientation(ComponentOrientation co)
     {
-	return viewport;
+    ComponentOrientation old = super.getComponentOrientation();
+    super.setComponentOrientation(co);
+    firePropertyChange(COMPONENT_ORIENTATION_CHANGED_PROPERTY, old, co);
+    sync();
     }
 
-    public JViewport createViewport()
+  public void setColumnHeader(JViewport h)
     {
-	return new JViewport();
+    JViewport old = columnHeader;
+    removeNonNull(old);
+    columnHeader = h;
+    addNonNull(h);
+    firePropertyChange(COLUMN_HEADER_CHANGED_PROPERTY, old, h);
+    sync();
     }
     
-    public void setViewport(JViewport v)
+  public void setColumnHeaderView(Component c)
     {
-	if (viewport != null)
-	    remove(viewport);
+    if (columnHeader == null)
+      setColumnHeader(createViewport());
+    columnHeader.setView(c);
+    sync();
+  }
 
-	viewport = v;	
+  public void setCorner(String key, Component c)
+  {
+    if (getComponentOrientation() 
+        == ComponentOrientation.LEFT_TO_RIGHT)
+      {
+        if (key == LOWER_LEADING_CORNER)
+          key = LOWER_LEFT_CORNER;
+        else if (key == LOWER_TRAILING_CORNER)
+          key = LOWER_RIGHT_CORNER;
+        else if (key == UPPER_LEADING_CORNER)
+          key = UPPER_LEFT_CORNER;
+        else if (key == UPPER_TRAILING_CORNER)
+          key = UPPER_RIGHT_CORNER;
+      }
+    else if (getComponentOrientation() 
+             == ComponentOrientation.RIGHT_TO_LEFT)
+      {
+        if (key == LOWER_LEADING_CORNER)
+          key = LOWER_RIGHT_CORNER;
+        else if (key == LOWER_TRAILING_CORNER)
+          key = LOWER_LEFT_CORNER;
+        else if (key == UPPER_LEADING_CORNER)
+          key = UPPER_RIGHT_CORNER;
+        else if (key == UPPER_TRAILING_CORNER)
+          key = UPPER_LEFT_CORNER;
+      }
+
+    if (key == LOWER_RIGHT_CORNER)
+      {
+        removeNonNull(lowerRight);
+        lowerRight = c;
+        addNonNull(c);
+      }
+    else if (key == UPPER_RIGHT_CORNER)
+      {
+        removeNonNull(upperRight);
+        upperRight = c;
+        addNonNull(c);
+      }
+    else if (key == LOWER_LEFT_CORNER)
+      {
+        removeNonNull(lowerLeft);
+        lowerLeft = c;
+        addNonNull(c);
+      }
+    else if (key == UPPER_LEFT_CORNER)
+      {
+        removeNonNull(upperLeft);
+        upperLeft = c;
+        addNonNull(c);
+      }
+    else
+      throw new IllegalArgumentException("unknown corner " + key);
+    sync();
+  }
+
+  public void setHorizontalScrollBar(JScrollBar h)
+  {
+    JScrollBar old = horizontalScrollBar;
+    removeNonNull(old);
+    horizontalScrollBar = h;
+    addNonNull(h);
+    firePropertyChange(HORIZONTAL_SCROLLBAR_CHANGED_PROPERTY, old, h);
+    sync();
+
+    if (old != null)
+      {
+        BoundedRangeModel model = old.getModel();
+        if (model != null)
+          model.removeChangeListener(scrollListener);
+      }
+    if (h != null)
+      {
+        BoundedRangeModel model = h.getModel();
+        if (model != null)
+          model.addChangeListener(scrollListener);
+      }
+  }
+
+  public void setHorizontalScrollBarPolicy(int h)
+  {    
+    if (h != HORIZONTAL_SCROLLBAR_AS_NEEDED
+        && h != HORIZONTAL_SCROLLBAR_NEVER
+        && h != HORIZONTAL_SCROLLBAR_ALWAYS)
+      throw new IllegalArgumentException("unknown horizontal scrollbar policy");    
+    int old = horizontalScrollBarPolicy;
+    horizontalScrollBarPolicy = h;
+    firePropertyChange(HORIZONTAL_SCROLLBAR_POLICY_CHANGED_PROPERTY, old, h);
+    sync();
+  }
+
+  public void setLayout(LayoutManager l)
+  {
+    LayoutManager old = super.getLayout();
+    ScrollPaneLayout tmp = (ScrollPaneLayout) l;
+    super.setLayout(l);
+    tmp.syncWithScrollPane(this);
+    firePropertyChange(LAYOUT_CHANGED_PROPERTY, old, l);
+    sync();
+  }
+
+  public void setRowHeader(JViewport v)
+  {
+    JViewport old = rowHeader;
+    removeNonNull(old);
+    rowHeader = v;
+    addNonNull(v);
+    firePropertyChange(ROW_HEADER_CHANGED_PROPERTY, old, v);
+    sync();
+  }
 	
-	add(v);
+  public void setRowHeaderView(Component c)
+  {
+    if (rowHeader == null)
+      setRowHeader(createViewport());
+    rowHeader.setView(c);
+    sync();
+  }
+
+  public void setVerticalScrollBar(JScrollBar v)
+  {
+    JScrollBar old = verticalScrollBar;
+    removeNonNull(old);
+    verticalScrollBar = v;
+    addNonNull(v);
+    firePropertyChange(VERTICAL_SCROLLBAR_CHANGED_PROPERTY, old, v);
+    sync();
+
+    if (old != null)
+      {
+        BoundedRangeModel model = old.getModel();
+        if (model != null)
+          model.removeChangeListener(scrollListener);
+      }
+    if (v != null)
+      {
+        BoundedRangeModel model = v.getModel();
+        if (model != null)
+          model.addChangeListener(scrollListener);
+      }
+  }
 	
+  public void setVerticalScrollBarPolicy(int v)
+  {
+    if (v != VERTICAL_SCROLLBAR_AS_NEEDED
+        && v != VERTICAL_SCROLLBAR_NEVER
+        && v != VERTICAL_SCROLLBAR_ALWAYS)
+      throw new IllegalArgumentException("unknown vertical scrollbar policy");    
+    int old = verticalScrollBarPolicy;
+    verticalScrollBarPolicy = v;
+    firePropertyChange(VERTICAL_SCROLLBAR_POLICY_CHANGED_PROPERTY, old, v);
+    sync();
+  }
+
+  public void setWheelScrollingEnabled(boolean b)
+  {
+    boolean old = wheelScrollingEnabled;
+    wheelScrollingEnabled = b;
+    firePropertyChange(WHEEL_SCROLLING_ENABLED_CHANGED_PROPERTY, old, b);
+    sync();
+  }
+
+  public void setViewport(JViewport v)
+  {
+    JViewport old = viewport;
+    removeNonNull(old);
+    viewport = v;
+    addNonNull(v);
 	revalidate();
 	repaint();
+    firePropertyChange(VIEWPORT_CHANGED_PROPERTY, old, v);
+    sync();
     }
     
-   public  void updateUI()
+  public void setViewportBorder(Border b)
     {
-	ScrollPaneUI b = (ScrollPaneUI)UIManager.getUI(this);
-	setUI(b);
+    Border old = viewportBorder;
+    viewportBorder = b;
+    firePropertyChange(VIEWPORT_BORDER_CHANGED_PROPERTY, old, b);
+    sync();
     }
 
-
     public void setViewportView(Component view)
     {
 	if (getViewport() == null)
@@ -130,5 +458,121 @@
 	    {
 		getViewport().setView(view);
 	    }
+    sync();
+  }
+
+  public boolean isValidateRoot()
+  {
+    return true;
+  }
+
+  ChangeListener createScrollListener()
+  {
+    return new ChangeListener() {
+        public void stateChanged(ChangeEvent event)
+        {
+          int xpos = 0;
+          int ypos = 0;
+          JScrollBar vsb = JScrollPane.this.getVerticalScrollBar();
+          JScrollBar hsb = JScrollPane.this.getHorizontalScrollBar();
+          
+          if (vsb != null)
+            {
+              BoundedRangeModel vmod = vsb.getModel();
+              if (vmod != null)
+                ypos = vmod.getValue();
+            }
+
+          if (hsb != null)
+            {
+              BoundedRangeModel hmod = hsb.getModel();
+              if (hmod != null)
+                xpos = hmod.getValue();
+            }
+          if (JScrollPane.this.viewport != null)
+            JScrollPane.this.viewport.setViewPosition(new Point(xpos, ypos));
+        }
+      };
+  }
+
+
+  public JScrollPane() 
+  {
+    this(null);
+  }
+    
+  public JScrollPane(Component view) 
+  {
+    this(view, 
+         VERTICAL_SCROLLBAR_AS_NEEDED, 
+         HORIZONTAL_SCROLLBAR_AS_NEEDED);
+  }
+
+  public JScrollPane(int vsbPolicy, int hsbPolicy) 
+  {
+    this(null, vsbPolicy, hsbPolicy);
     }
+
+  public JScrollPane(Component view, int vsbPolicy, int hsbPolicy) 
+  {
+    scrollListener = createScrollListener();
+    setVerticalScrollBarPolicy(vsbPolicy);
+    setVerticalScrollBar(createVerticalScrollBar());
+    setHorizontalScrollBarPolicy(hsbPolicy);
+    setHorizontalScrollBar(createHorizontalScrollBar());
+    setViewportView(view);
+    setLayout(new ScrollPaneLayout());
+    setOpaque(false);
+    updateUI();
+  }
+
+  
+  public JScrollBar createHorizontalScrollBar()
+  {
+    return new JScrollBar(SwingConstants.HORIZONTAL);
+  }
+
+  public JScrollBar createVerticalScrollBar()
+  {
+    return new JScrollBar(SwingConstants.VERTICAL);
+  }
+    
+  public JViewport createViewport()
+  {
+    return new JViewport();
+  }
+
+
+  public String getUIClassID()
+  {
+    return "ScrollPaneUI";
+  }
+  
+  public void updateUI()
+  {
+    ScrollPaneUI b = (ScrollPaneUI)UIManager.getUI(this);
+    setUI(b);
+  }  
+
+  /*
+  class ScrollBar 
+    extends JScrollBar
+    implements UIResource
+  {
+    public ScrollBar(int orientation)
+    {
+      super(orientation);
+      Component view = this.JScrollPane.getViewportView();
+      if (view == null)
+        return;
+      if (! view instanceof Scrollable)
+        {
+          Scrollable s = (Scrollable) view;
+          s.
+        }
+    }
+
+  }
+  */
+
 }
Index: javax/swing/JViewport.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/javax/swing/JViewport.java,v
retrieving revision 1.3
diff -u -b -w -r1.3 JViewport.java
--- javax/swing/JViewport.java	12 Feb 2004 00:17:23 -0000	1.3
+++ javax/swing/JViewport.java	12 Mar 2004 16:02:29 -0000
@@ -40,16 +40,86 @@
 
 import java.awt.Component;
 import java.awt.Container;
+import java.awt.Dimension;
 import java.awt.Graphics;
 import java.awt.Image;
+import java.awt.Insets;
 import java.awt.Point;
 import java.awt.Rectangle;
+import java.awt.image.ImageObserver;
 import javax.accessibility.Accessible;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 import javax.swing.plaf.ViewportUI;
 
+
+/**
+ *  
+ * <pre>
+ *                                                     _
+ *   +-------------------------------+    ...........Y1 \
+ *   |  view                         |                .  \
+ *   |  (this component's child)     |                .   > VY
+ *   |                               |                .  / = Y2-Y1
+ *   |         +------------------------------+  ....Y2_/
+ *   |         | viewport            |        |       .
+ *   |         | (this component)    |        |       .
+ *   |         |                     |        |       .
+ *   |         |                     |        |       .
+ *   |         |                     |        |       .
+ *   |         |                     |        |       .
+ *   |         +------------------------------+  ....Y3
+ *   |                               |                .
+ *   |         .                     |        .       .
+ *   |         .                     |        .       .
+ *   +---------.---------------------+    ...........Y4
+ *   .         .                     .        .
+ *   .         .                     .        .
+ *   .         .                     .        .
+ *   X1.......X2.....................X3.......X4
+ *   \____  ___/
+ *        \/
+ *        VX = X2-X1
+ *</pre>
+ *  
+ * <p>A viewport is, like all swing components, located at some position in
+ * the swing component tree; that location is exactly the same as any other
+ * components: the viewport's "bounds".</p>
+ *
+ * <p>But in terms of drawing its child, the viewport thinks of itself as
+ * covering a particular position <em>of the view's coordinate space</em>.
+ * For example, the {@link javax.JViewPort.getViewPosition} method returns
+ * the position <code>(VX,VY)</code> shown above, which is an position in
+ * "view space", even though this is <em>implemented</em> by positioning
+ * the underlying child at position <code>(-VX,-VY)</code></p>
+ *
+ */
+
 public class JViewport extends JComponent
 {
-    Component c;
+  public static int BACKINGSTORE_SCROLL_MODE = 1;
+  public static int BLIT_SCROLL_MODE = 2;
+  public static int SIMPLE_SCROLL_MODE = 3;
+
+  ChangeEvent changeEvent = new ChangeEvent(this);
+
+  int scrollMode;
+
+  boolean scrollUnderway;
+  boolean isViewSizeSet;
+
+  /** 
+   * The width and height of the Viewport's area in terms of view
+   * coordinates.  Typically this will be the same as the width and height
+   * of the viewport's bounds, unless the viewport transforms units of
+   * width and height, which it may do, for example if it magnifies or
+   * rotates its view.
+   *
+   * @see #toViewCoordinates
+   */
+  Dimension viewExtent;
+
+  Point lastPaintPosition;
 
     JViewport()
     {
@@ -57,86 +127,153 @@
 	updateUI();
     }
 
-    void setView(Component c)
+  public Dimension getViewSize()
     {
-	if (this.c != null)
-	    remove(c);
-
-	this.c = c;
-
-	add(c);
+    if (viewExtent == null)
+      return getPreferredSize();
+    else
+      return viewExtent;
     }
 
-    public String getUIClassID()
+  public void setViewSize(Dimension newSize)
     {
-	return "ViewportUI";
+    viewExtent = newSize;
+    fireStateChanged();
     }
 
-    public void updateUI()
+  public Point getViewPosition()
+  {
+    Component view = getView();
+    if (view == null)
+      return new Point(0,0);
+    else
     {
-	ViewportUI vp = (ViewportUI) UIManager.getUI(this);
-	setUI(vp);
+        Point p = view.getLocation();
+        p.x = -p.x;
+        p.y = -p.y;
+        return p;
+      }
     }
 
-    Container GetHeavy(Container parent)
+  public void setViewPosition(Point p)
     {
-	if (parent == null)
-	    return null;
+    Component view = getView();
+    if (view != null)
+      {
+        Point q = new Point(-p.x, -p.y);
+        view.setLocation(q);
+        fireStateChanged();
+      }
+  }
 
-	while (isLightweightComponent(parent))
+  public Rectangle getViewRect()
 	    {
-		Container p = parent.getParent();
+    return new Rectangle(getViewPosition(), 
+                         getViewSize());
+  }
 
-		if (p == null)
+  public boolean isBackingStoreEnabled()
 		    {
-			System.out.println("GetHeavy FAILED, no heavy weight component found");
-			return parent;
+    return scrollMode == BACKINGSTORE_SCROLL_MODE;
 		    }
 		
-		parent = p;
+  public void setBackingStoreEnabled(boolean b)
+  {
+    if (b && scrollMode != BACKINGSTORE_SCROLL_MODE)
+      {
+        scrollMode = BACKINGSTORE_SCROLL_MODE;
+        fireStateChanged();
 	    }
-	return parent;
     }
     
-    
-    public void paint(Graphics g)
+  public void setScrollMode(int mode)
     {
-	paintChildren(g);
-
-	System.out.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXX   JViewport -----> paint()");
-
-	Container parent = GetHeavy(getParent());
-	
-	System.out.println("parent = " + parent + ", " + getParent());
+    scrollMode = mode;
+    fireStateChanged();
+  }
 
-	//parent.paint();
+  public int getScrollMode()
+  {
+    return scrollMode;
+  }
 
-	Graphics wg = parent.getGraphics();
+  public Component getView()
+  {
+    if (ncomponents > 0)
+      return component[0];
+    else
+      return null;
+  }
 	
-	int x = 0;
-	int y = 0;
-	int w = getWidth();
-	int h = getHeight();
+  public void setView(Component v)
+  {
+    add(v);
+    fireStateChanged();
+  }
 
-	Rectangle r = new Rectangle(x, y, w, h);
 
-	int ox = 0;
-	int oy = 0;
+  public void addImpl(Component comp, Object constraints, int index)
+  {
+    if (ncomponents > 0)
+      remove(component[0]);
+    super.addImpl(comp, constraints, index);
+  }
 
-	wg.copyArea(r.x,
-		    r.y,
-		    r.width,
-		    r.height,
-		    ox,
-		    oy);
+  public final Insets getInsets() 
+  {
+    return new Insets(0,0,0,0);
+  }
 
-	wg.dispose();
+  public final Insets getInsets(Insets insets)
+  {
+    if (insets == null)
+      return getInsets();
+    insets.top = 0;
+    insets.bottom = 0;
+    insets.left = 0;
+    insets.right = 0;
+    return insets;
     }
+    
+  public boolean isOptimizedDrawingEnabled()
+  {
+    return false;
 }
 
+  public ChangeListener[] getChangeListeners() 
+  {
+    return (ChangeListener[]) getListeners(ChangeListener.class);
+  }
 
+  public void paint(Graphics g)
+  {
+    paintComponent(g);
+  }
 
+  void fireStateChanged()
+  {
+    ChangeListener[] listeners = getChangeListeners();
+    for (int i = 0; i < listeners.length; ++i)
+      listeners[i].stateChanged(changeEvent);
+  }
 
+  public void addChangeListener(ChangeListener listener)
+  {
+    listenerList.add(ChangeListener.class, listener);
+  }
 
+  public void removeChangeListener(ChangeListener listener)
+  {
+    listenerList.remove(ChangeListener.class, listener);
+  }
 
+  public String getUIClassID()
+  {
+    return "ViewportUI";
+  }
 
+  public void updateUI()
+  {
+    setUI((ViewportUI) UIManager.getUI(this));
+  }            
+}
Index: javax/swing/ScrollPaneLayout.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/javax/swing/ScrollPaneLayout.java,v
retrieving revision 1.3
diff -u -b -w -r1.3 ScrollPaneLayout.java
--- javax/swing/ScrollPaneLayout.java	11 Jun 2003 13:20:39 -0000	1.3
+++ javax/swing/ScrollPaneLayout.java	12 Mar 2004 16:02:29 -0000
@@ -41,9 +41,11 @@
 import java.awt.Component;
 import java.awt.Container;
 import java.awt.Dimension;
+import java.awt.Insets;
 import java.awt.LayoutManager;
 import java.awt.Rectangle;
 import java.io.Serializable;
+import javax.swing.border.Border;
 
 /**
  * ScrollPaneLayout
@@ -55,258 +57,368 @@
 {
   static final long serialVersionUID = -4480022884523193743L;
 
-	//-------------------------------------------------------------
-	// Classes ----------------------------------------------------
-	//-------------------------------------------------------------
-
-	/**
-	 * UIResource
-	 */
 	public static class UIResource extends ScrollPaneLayout 
 			implements javax.swing.plaf.UIResource {
-
-		//-------------------------------------------------------------
-		// Initialization ---------------------------------------------
-		//-------------------------------------------------------------
-
-		/**
-		 * Constructor UIResource
-		 */
 		public UIResource() {
-			// TODO
-		} // UIResource()
-
-
-	} // UIResource
-
-
-	//-------------------------------------------------------------
-	// Variables --------------------------------------------------
-	//-------------------------------------------------------------
-
-	/**
-	 * viewport
-	 */
-	protected JViewport viewport;
-
-	/**
-	 * vsb
-	 */
-	protected JScrollBar vsb;
-
-	/**
-	 * hsb
-	 */
-	protected JScrollBar hsb;
+    }
+  }
 
-	/**
-	 * rowHead
-	 */
-	protected JViewport rowHead;
+  JViewport viewport;
+  JScrollBar verticalScrollBar;
+  JScrollBar horizontalScrollBar;
+  JViewport rowHeader;
+  JViewport columnHeader;
+  Component lowerLeft;
+  Component lowerRight;
+  Component upperLeft;
+  Component upperRight;
+  int verticalScrollBarPolicy;
+  int horizontalScrollBarPolicy;
 
-	/**
-	 * colHead
-	 */
-	protected JViewport colHead;
-
-	/**
-	 * lowerLeft
-	 */
-	protected Component lowerLeft;
-
-	/**
-	 * lowerRight
-	 */
-	protected Component lowerRight;
-
-	/**
-	 * upperLeft
-	 */
-	protected Component upperLeft;
-
-	/**
-	 * upperRight
-	 */
-	protected Component upperRight;
-
-	/**
-	 * vsbPolicy
-	 */
-	protected int vsbPolicy;
-
-	/**
-	 * hsbPolicy
-	 */
-	protected int hsbPolicy;
-
-
-	//-------------------------------------------------------------
-	// Initialization ---------------------------------------------
-	//-------------------------------------------------------------
-
-	/**
-	 * Constructor ScrollPaneLayout
-	 */
 	public ScrollPaneLayout() {
-		// TODO
-	} // ScrollPaneLayout()
 
+  }
 
-	//-------------------------------------------------------------
-	// Methods ----------------------------------------------------
-	//-------------------------------------------------------------
-
-	/**
-	 * syncWithScrollPane
-	 * @param scrollPane TODO
-	 */
 	public void syncWithScrollPane(JScrollPane scrollPane) {
-		// TODO
-	} // syncWithScrollPane()
+    viewport = scrollPane.getViewport();
+    verticalScrollBar = scrollPane.getVerticalScrollBar();
+    horizontalScrollBar = scrollPane.getHorizontalScrollBar();
+    verticalScrollBarPolicy = scrollPane.getVerticalScrollBarPolicy();
+    horizontalScrollBarPolicy = scrollPane.getHorizontalScrollBarPolicy();
+    lowerLeft = scrollPane.getCorner(LOWER_LEFT_CORNER);
+    lowerRight = scrollPane.getCorner(LOWER_RIGHT_CORNER);
+    upperLeft = scrollPane.getCorner(UPPER_LEFT_CORNER);
+    upperRight = scrollPane.getCorner(UPPER_RIGHT_CORNER);    
+  }
 
-	/**
-	 * addSingletonComponent
-	 * @param oldComponent TODO
-	 * @param newComponent TODO
-	 * @returns Component
-	 */
 	protected Component addSingletonComponent(Component oldComponent,
 			Component newComponent) {
-		return null; // TODO
-	} // addSingletonComponent()
+    return null;
+  }
 
-	/**
-	 * addLayoutComponent
-	 * @param string TODO
-	 * @param component TODO
-	 */
-	public void addLayoutComponent(String string, Component component) {
-		// TODO
-	} // addLayoutComponent()
+  public void addLayoutComponent(String key, Component component) 
+  {
+    if (key == VIEWPORT)
+      viewport = (JViewport) component;
+    else if (key == VERTICAL_SCROLLBAR)
+      verticalScrollBar = (JScrollBar) component;
+    else if (key == HORIZONTAL_SCROLLBAR)
+      horizontalScrollBar = (JScrollBar) component;
+    else if (key == ROW_HEADER)
+      rowHeader = (JViewport) component;
+    else if (key == COLUMN_HEADER)
+      columnHeader = (JViewport) component;
+    else if (key == LOWER_RIGHT_CORNER)
+      lowerRight = component;
+    else if (key == UPPER_RIGHT_CORNER)
+      upperRight = component;
+    else if (key == LOWER_LEFT_CORNER)
+      lowerLeft = component;
+    else if (key == UPPER_LEFT_CORNER)
+      upperLeft = component;
+  }
 
-	/**
-	 * removeLayoutComponent
-	 * @param component TODO
-	 */
 	public void removeLayoutComponent(Component component) {
-		// TODO
-	} // removeLayoutComponent()
+    if (component == viewport)
+      viewport = null;
+    else if (component == verticalScrollBar)
+      verticalScrollBar = null;
+    else if (component == horizontalScrollBar)
+      horizontalScrollBar = null;
+    else if (component == rowHeader)
+      rowHeader = null;
+    else if (component == columnHeader)
+      columnHeader = null;
+    else if (component == lowerRight)
+      lowerRight = null;
+    else if (component == upperRight)
+      upperRight = null;
+    else if (component == lowerLeft)
+      lowerLeft = null;
+    else if (component == upperLeft)
+      upperLeft = null;
+  }
 
-	/**
-	 * getVerticalScrollBarPolicy
-	 * @returns int
-	 */
 	public int getVerticalScrollBarPolicy() {
-		return 0; // TODO
-	} // getVerticalScrollBarPolicy()
+    return verticalScrollBarPolicy;
+  }
 
-	/**
-	 * setVerticalScrollBarPolicy
-	 * @param policy TODO
-	 */
 	public void setVerticalScrollBarPolicy(int policy) {
-		// TODO
-	} // setVerticalScrollBarPolicy()
+    verticalScrollBarPolicy = policy;
+  }
 
-	/**
-	 * getHorizontalScrollBarPolicy
-	 * @returns int
-	 */
 	public int getHorizontalScrollBarPolicy() {
-		return 0; // TODO
-	} // getHorizontalScrollBarPolicy()
+    return horizontalScrollBarPolicy;
+  }
 
-	/**
-	 * setHorizontalScrollBarPolicy
-	 * @param policy TODO
-	 */
 	public void setHorizontalScrollBarPolicy(int policy) {
-		// TODO
-	} // setHorizontalScrollBarPolicy()
+    horizontalScrollBarPolicy = policy;
+  }
 
-	/**
-	 * getViewport
-	 * @returns JViewport
-	 */
 	public JViewport getViewport() {
-		return null; // TODO
-	} // getViewport()
+    return viewport;
+  }
 
-	/**
-	 * getHorizontalScrollBar
-	 * @returns JScrollBar
-	 */
 	public JScrollBar getHorizontalScrollBar() {
-		return null; // TODO
-	} // getHorizontalScrollBar()
+    return horizontalScrollBar;
+  }
 
-	/**
-	 * getVerticalScrollBar
-	 * @returns JScrollBar
-	 */
 	public JScrollBar getVerticalScrollBar() {
-		return null; // TODO
-	} // getVerticalScrollBar()
+    return verticalScrollBar;
+  }
 
-	/**
-	 * getRowHeader
-	 * @returns JViewport
-	 */
 	public JViewport getRowHeader() {
-		return null; // TODO
-	} // getRowHeader()
+    return rowHeader;
+  }
 
-	/**
-	 * getColumnHeader
-	 * @returns JViewport
-	 */
 	public JViewport getColumnHeader() {
-		return null; // TODO
-	} // getColumnHeader()
+    return columnHeader;
+  }
 
-	/**
-	 * getCorner
-	 * @param key TODO
-	 * @returns Component
-	 */
 	public Component getCorner(String key) {
-		return null; // TODO
-	} // getCorner()
+    if (key == LOWER_RIGHT_CORNER)
+      return lowerRight;
+    else if (key == UPPER_RIGHT_CORNER)
+      return upperRight;
+    else if (key == LOWER_LEFT_CORNER)
+      return lowerLeft;
+    else if (key == UPPER_LEFT_CORNER)
+      return upperLeft;
+    return null;
+  }
 
-	/**
-	 * preferredLayoutSize
-	 * @param parent TODO
-	 * @returns Dimension
-	 */
-	public Dimension preferredLayoutSize(Container parent) {
-		return null; // TODO
-	} // preferredLayoutSize()
+  public Dimension preferredLayoutSize(Container parent) 
+  {
+    if (parent instanceof JScrollPane)
+      {
+        JScrollPane sc = (JScrollPane) parent;
+        synchronized (sc.getTreeLock ())
+          {
+            Dimension insetsSize = new Dimension(0,0); 
+            Dimension viewportSize = new Dimension(0,0); 
+            Dimension viewportInsetsSize = new Dimension(0,0); 
+            Dimension columnHeaderSize = new Dimension(0,0); 
+            Dimension rowHeaderSize = new Dimension(0,0); 
+            Dimension verticalScrollBarSize = new Dimension(0,0); 
+            Dimension horizontalScrollBarSize = new Dimension(0,0); 
+
+            Insets insets = sc.getInsets();
+            Border viewportBorder = sc.getViewportBorder();
+            Insets viewportInsets = null;
+
+            if (viewportBorder != null)
+              viewportInsets = viewportBorder.getBorderInsets(parent);
+
+            if (insets != null)
+              insetsSize.setSize(insets.left + insets.right,
+                                 insets.top + insets.bottom);
+
+            if (viewport != null)
+              viewportSize.setSize(viewport.getPreferredSize());
+
+            if (columnHeader != null)
+              columnHeaderSize.setSize(columnHeader.getPreferredSize());
+            
+            if (rowHeader != null)
+              rowHeaderSize.setSize(rowHeader.getPreferredSize());
+
+            if (verticalScrollBar != null)
+              verticalScrollBarSize.setSize(verticalScrollBar.getPreferredSize());
+
+            if (horizontalScrollBar != null)
+              horizontalScrollBarSize.setSize(horizontalScrollBar.getPreferredSize());
+            
+            return new Dimension(insetsSize.width 
+                                 + viewportSize.width
+                                 + viewportInsetsSize.width
+                                 + rowHeaderSize.width
+                                 + verticalScrollBarSize.width,
+                                 insetsSize.height
+                                 + viewportSize.height
+                                 + viewportInsetsSize.height
+                                 + columnHeaderSize.height
+                                 + horizontalScrollBarSize.height);
+          }
+      }
+    else
+      {
+        return new Dimension(0,0);
+      }
+  }
 
-	/**
-	 * minimumLayoutSize
-	 * @param parent TODO
-	 * @returns Dimension
+  public Dimension minimumLayoutSize(Container parent)
+  {
+    if (parent instanceof JScrollPane)
+      {
+        JScrollPane sc = (JScrollPane) parent;
+        synchronized (sc.getTreeLock ())
+          {
+            Dimension insetsSize = new Dimension(0,0); 
+            Dimension viewportSize = new Dimension(0,0); 
+            Dimension viewportInsetsSize = new Dimension(0,0); 
+            Dimension columnHeaderSize = new Dimension(0,0); 
+            Dimension rowHeaderSize = new Dimension(0,0); 
+            Dimension verticalScrollBarSize = new Dimension(0,0); 
+            Dimension horizontalScrollBarSize = new Dimension(0,0); 
+
+            Insets insets = sc.getInsets();
+            Border viewportBorder = sc.getViewportBorder();
+            Insets viewportInsets = null;
+
+            if (viewportBorder != null)
+              viewportInsets = viewportBorder.getBorderInsets(parent);
+
+            if (insets != null)
+              insetsSize.setSize(insets.left + insets.right,
+                                 insets.top + insets.bottom);
+
+            if (viewport != null)
+              viewportSize.setSize(viewport.getMinimumSize());
+
+            if (columnHeader != null)
+              columnHeaderSize.setSize(columnHeader.getMinimumSize());
+            
+            if (rowHeader != null)
+              rowHeaderSize.setSize(rowHeader.getMinimumSize());
+
+            if (verticalScrollBar != null
+                && verticalScrollBarPolicy != VERTICAL_SCROLLBAR_NEVER)
+              verticalScrollBarSize.setSize(verticalScrollBar.getMinimumSize());
+
+            if (horizontalScrollBar != null 
+                && horizontalScrollBarPolicy != HORIZONTAL_SCROLLBAR_NEVER)
+              horizontalScrollBarSize.setSize(horizontalScrollBar.getMinimumSize());
+            
+            return new Dimension(insetsSize.width 
+                                 + viewportSize.width
+                                 + viewportInsetsSize.width
+                                 + rowHeaderSize.width
+                                 + verticalScrollBarSize.width,
+                                 insetsSize.height
+                                 + viewportSize.height
+                                 + viewportInsetsSize.height
+                                 + columnHeaderSize.height
+                                 + horizontalScrollBarSize.height);
+          }
+      }
+    else
+      {
+        return new Dimension(0,0);
+      }
+  }
+
+  /**
+   *
+   *     +----+--------------------+----+ y1
+   *     | c1 |   column header    | c2 |
+   *     +----+--------------------+----+ y2
+   *     | r  |                    | v  |
+   *     | o  |                    |    |
+   *     | w  |                    | s  |
+   *     |    |                    | r  |
+   *     | h  |                    | o  |
+   *     | e  |      viewport      | l  |
+   *     | a  |                    | l  |
+   *     | d  |                    | b  |
+   *     | e  |                    | a  |
+   *     | r  |                    | r  |
+   *     +----+--------------------+----+ y3
+   *     | c3 |    h scrollbar     | c4 |
+   *     +----+--------------------+----+ y4
+   *    x1   x2                   x3   x4
+   *   
 	 */
-	public Dimension minimumLayoutSize(Container parent) {
-		return null; // TODO
-	} // minimumLayoutSize()
 
-	/**
-	 * layoutContainer
-	 * @param parent TODO
-	 */
 	public void layoutContainer(Container parent) {
-		// TODO
-	} // layoutContainer()
+    if (parent instanceof JScrollPane)
+      {
+        JScrollPane sc = (JScrollPane) parent;
+        synchronized (sc.getTreeLock ())
+          {
+            Rectangle scrollPaneBounds = sc.getBounds();
+            Dimension viewportSize = new Dimension(0,0);
+            Dimension viewSize = new Dimension(0,0);
+            JViewport viewport = sc.getViewport();
+
+            int x1 = 0, x2 = 0, x3 = 0, x4 = 0;
+            int y1 = 0, y2 = 0, y3 = 0, y4 = 0;
+
+            x1 = scrollPaneBounds.x;
+            y1 = scrollPaneBounds.y;
+            x4 = scrollPaneBounds.x + scrollPaneBounds.width;
+            y4 = scrollPaneBounds.y + scrollPaneBounds.height;
+            
+            if (columnHeader != null)
+              y2 = columnHeader.getPreferredSize().height;
+            else
+              y2 = y1;
+
+            if (rowHeader != null)
+              x2 = rowHeader.getPreferredSize().width;
+            else
+              x2 = x1;
+
+            int vsbPolicy = sc.getVerticalScrollBarPolicy();
+            int hsbPolicy = sc.getHorizontalScrollBarPolicy();
+
+            boolean showVsb = 
+              (verticalScrollBar != null)
+              && ((vsbPolicy == VERTICAL_SCROLLBAR_ALWAYS)
+                  || (vsbPolicy == VERTICAL_SCROLLBAR_AS_NEEDED 
+                      && viewSize.height > viewportSize.height));
+
+            boolean showHsb = 
+              (horizontalScrollBar != null)
+              && ((hsbPolicy == HORIZONTAL_SCROLLBAR_ALWAYS)
+                  || (hsbPolicy == HORIZONTAL_SCROLLBAR_AS_NEEDED 
+                      && viewSize.width > viewportSize.width));
+            
+            if (showVsb)
+              x3 = x4 - verticalScrollBar.getPreferredSize().width;
+            else
+              x3 = x4;
+
+            if (showHsb)
+              y3 = y4 - horizontalScrollBar.getPreferredSize().height;
+            else
+              y3 = y4;
+
+            // now set the layout
+
+            if (viewport != null)
+              viewport.setBounds(new Rectangle(x2, y2, x3-x2, y3-y2));
+
+            if (columnHeader != null)
+              columnHeader.setBounds(new Rectangle(x2, y1, x3-x2, y2-y1));
+
+            if (rowHeader != null)
+              rowHeader.setBounds(new Rectangle(x1, y2, x2-x1, y3-y2));
+
+            if (showVsb)
+              verticalScrollBar.setBounds(new Rectangle(x3, y2, x4-x3, y3-y2));
+
+            if (showHsb)
+              horizontalScrollBar.setBounds(new Rectangle(x2, y3, x3-x2, y4-y3));
+
+            if (upperLeft != null)
+              upperLeft.setBounds(new Rectangle(x1, y1, x2-x1, y2-y1));
+
+            if (upperRight != null)
+              upperRight.setBounds(new Rectangle(x3, y1, x4-x3, y2-y1));
+
+            if (lowerLeft != null)
+              lowerLeft.setBounds(new Rectangle(x1, y3, x2-x1, y4-y3));
+
+            if (lowerRight != null)
+              lowerRight.setBounds(new Rectangle(x3, y3, x4-x3, y4-y3));
+
+          }
+      }
+  }
 
-	/**
-	 * getViewportBorderBounds
-	 * @param value0 TODO
-	 * @returns Rectangle
-	 */
 	public Rectangle getViewportBorderBounds(JScrollPane scrollPane) {
-		return null; // TODO
-	} // getViewportBorderBounds()
+    return null;
+  }
 
 
-} // ScrollPaneLayout
+}
Index: javax/swing/ViewportLayout.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/javax/swing/ViewportLayout.java,v
retrieving revision 1.3
diff -u -b -w -r1.3 ViewportLayout.java
--- javax/swing/ViewportLayout.java	10 Jan 2004 21:07:43 -0000	1.3
+++ javax/swing/ViewportLayout.java	12 Mar 2004 16:02:29 -0000
@@ -52,64 +52,26 @@
 {
   static final long serialVersionUID = -788225906076097229L;
 
-	//-------------------------------------------------------------
-	// Initialization ---------------------------------------------
-	//-------------------------------------------------------------
-
-	/**
-	 * Constructor ViewportLayout
-	 */
 	public ViewportLayout() {
-		// TODO
-	} // ViewportLayout()
-
-
-	//-------------------------------------------------------------
-	// Methods ----------------------------------------------------
-	//-------------------------------------------------------------
-
-	/**
-	 * addLayoutComponent
-	 * @param name TODO
-	 * @param c TODO
-	 */
+	}
 	public void addLayoutComponent(String name, Component c) {
-		// TODO
-	} // addLayoutComponent()
-
-	/**
-	 * removeLayoutComponent
-	 * @param c TODO
-	 */
+          // ignore
+	}
 	public void removeLayoutComponent(Component c) {
-		// TODO
-	} // removeLayoutComponent()
-
-	/**
-	 * preferredLayoutSize
-	 * @param parent TODO
-	 * @returns Dimension
-	 */
+          // ignore
+	}
 	public Dimension preferredLayoutSize(Container parent) {
-		return null; // TODO
-	} // preferredLayoutSize()
-
-	/**
-	 * minimumLayoutSize
-	 * @param parent TODO
-	 * @returns Dimension
-	 */
+          return null;
+	}
 	public Dimension minimumLayoutSize(Container parent) {
-		return null; // TODO
-	} // minimumLayoutSize()
-
-	/**
-	 * layoutContainer
-	 * @param parent TODO
-	 */
+          return null;
+	}
 	public void layoutContainer(Container parent) {
-		// TODO
-	} // layoutContainer()
-
-
-} // ViewportLayout
+          if (parent.countComponents() == 1)
+            {
+              // This should usually be true, but if it's not it is
+              // probably nicer if we do not panic.
+              Component c = parent.getComponent(0);
+            }
+	}
+}
Index: javax/swing/plaf/basic/BasicButtonListener.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/javax/swing/plaf/basic/BasicButtonListener.java,v
retrieving revision 1.1
diff -u -b -w -r1.1 BasicButtonListener.java
--- javax/swing/plaf/basic/BasicButtonListener.java	12 Feb 2004 06:26:06 -0000	1.1
+++ javax/swing/plaf/basic/BasicButtonListener.java	12 Mar 2004 16:02:29 -0000
@@ -87,15 +87,12 @@
   }
   public void mouseMoved(MouseEvent e)
   {
-    System.err.println("button got mouse move");
   }
   public void mouseDragged(MouseEvent e)
   {
-    System.err.println("button got mouse drag");
   }
   public void mouseClicked(MouseEvent e)
   {
-    System.err.println("button got mouse click");
   }
 
   /**
Index: javax/swing/plaf/basic/BasicScrollPaneUI.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/javax/swing/plaf/basic/BasicScrollPaneUI.java,v
retrieving revision 1.3
diff -u -b -w -r1.3 BasicScrollPaneUI.java
--- javax/swing/plaf/basic/BasicScrollPaneUI.java	10 Jan 2004 21:59:30 -0000	1.3
+++ javax/swing/plaf/basic/BasicScrollPaneUI.java	12 Mar 2004 16:02:29 -0000
@@ -41,14 +41,14 @@
 import java.awt.Dimension;
 import java.awt.Graphics;
 import javax.swing.JComponent;
+import javax.swing.JScrollBar;
 import javax.swing.JScrollPane;
+import javax.swing.ScrollPaneLayout;
 import javax.swing.plaf.ComponentUI;
 import javax.swing.plaf.ScrollPaneUI;
 
 public class BasicScrollPaneUI extends ScrollPaneUI
 {
-    int min_w = 50;
-    int min_h = 50;
 
     public static ComponentUI createUI(final JComponent c) 
     {
@@ -61,33 +61,25 @@
 	super.installUI(c);
     }
     
-
-    public Dimension getPreferredSize(JComponent c) 
+    public Dimension getMinimumSize(JComponent c) 
     {
 	JScrollPane p = (JScrollPane ) c;
+        ScrollPaneLayout sl = (ScrollPaneLayout) p.getLayout();
+        return sl.minimumLayoutSize(c);
+    }
 	
-	Dimension d = new Dimension(min_w,
-				    min_h);
-	
-	Dimension a = p.getViewport().getPreferredSize();
-
-	if (a != null)
+    public Dimension getPreferredSize(JComponent c) 
 	    {
-		d.width = Math.max(d.width, a.width);
-		d.height = Math.max(d.height, a.height);
+	JScrollPane p = (JScrollPane ) c;
+        ScrollPaneLayout sl = (ScrollPaneLayout) p.getLayout();
+        return sl.preferredLayoutSize(c);
 	    }
 			   
 
-	System.out.println("BasicScrollPaneUI->preff->"+d);
-	return d;
-    }
-
     public void paint(Graphics g, JComponent c)
     {      
-	System.out.println("BasicScrollPaneUI->paint()->"+c);
-
-	JScrollPane p = (JScrollPane ) c;
-	p.getViewport().paint(g);
+      // do nothing; the normal painting-of-children algorithm, along with
+      // ScrollPaneLayout, does all the relevant work.
     }
 }
 
Index: javax/swing/plaf/basic/BasicSliderUI.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/javax/swing/plaf/basic/Attic/BasicSliderUI.java,v
retrieving revision 1.1.2.6
diff -u -b -w -r1.1.2.6 BasicSliderUI.java
--- javax/swing/plaf/basic/BasicSliderUI.java	9 Mar 2004 16:38:13 -0000	1.1.2.6
+++ javax/swing/plaf/basic/BasicSliderUI.java	12 Mar 2004 16:02:29 -0000
@@ -871,7 +871,8 @@
     
     // The width should cover all the labels (which are usually the
     // deciding factor of the width)
-    int width = getWidthOfWidestLabel() * slider.getLabelTable().size();
+    int width = getWidthOfWidestLabel() * (slider.getLabelTable() == null ? 
+                                           0 : slider.getLabelTable().size());
     
     // If there are not enough labels.
     // This number is pretty much arbitrary, but it looks nice.
@@ -909,7 +910,8 @@
   {
     Insets insets = slider.getInsets();
     
-    int height = getHeightOfTallestLabel() * slider.getLabelTable().size();
+    int height = getHeightOfTallestLabel() * (slider.getLabelTable() == null ? 
+                                              0 : slider.getLabelTable().size());
     
     if (height < 200)
       height = 200;
Index: javax/swing/plaf/basic/BasicViewportUI.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/javax/swing/plaf/basic/BasicViewportUI.java,v
retrieving revision 1.3
diff -u -b -w -r1.3 BasicViewportUI.java
--- javax/swing/plaf/basic/BasicViewportUI.java	10 Jan 2004 21:59:30 -0000	1.3
+++ javax/swing/plaf/basic/BasicViewportUI.java	12 Mar 2004 16:02:29 -0000
@@ -38,36 +38,110 @@
 
 package javax.swing.plaf.basic;
 
+import java.awt.Component;
 import java.awt.Dimension;
 import java.awt.Graphics;
+import java.awt.Image;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.image.ImageObserver;
 import javax.swing.JComponent;
+import javax.swing.JViewport;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 import javax.swing.plaf.ComponentUI;
 import javax.swing.plaf.ViewportUI;
 
 public class BasicViewportUI extends ViewportUI 
 {
 
-    public static ComponentUI createUI(final JComponent c)
+  ChangeListener changeListener;
+  Image backingStoreImage;
+  int backingStoreWidth = -1;
+  int backingStoreHeight = -1;
+  
+  class ChangeHandler implements ChangeListener
     {
-	return new BasicViewportUI();
+    public void stateChanged(ChangeEvent event)
+    {
+      JViewport v = (JViewport)event.source;
+      v.repaint();
+    }
+  }
+
+  void installDefaults(JComponent c)
+  {
+  }
+
+  void uninstallDefaults(JComponent c)
+  {
+  }
+
+  void installListeners(JComponent c)
+  {
+    ((JViewport)c).addChangeListener(changeListener);
+  }
+
+  void uninstallListeners(JComponent c)
+  {
+    ((JViewport)c).removeChangeListener(changeListener);
     }
 
+  public BasicViewportUI()
+  {
+    changeListener = new ChangeHandler();
+  }
+
+  public static ComponentUI createUI(JComponent c)
+  {
+    return new BasicViewportUI();
+  }
     
-    public void installUI(final JComponent c) 
+  public void installUI(JComponent c) 
     {
 	super.installUI(c);
+    installListeners(c);
+  }
+
+  public void uninstallUI(JComponent c) 
+  {
+    uninstallListeners(c);
     }
     
 
     public Dimension getPreferredSize(JComponent c) 
     {
+    // FIXME: integrate with Scrollable
 	Dimension d = new Dimension(100,100);
-	System.out.println("BasicViewportUI->preff->"+d);
 	return d;
     }
 
     public void paint(Graphics g, JComponent c)
     {      
-	System.out.println("BasicViewportUI->paint->"+c);
+
+    JViewport v = (JViewport)c;
+    Component view = v.getView();
+
+    if (view == null)
+      return;
+
+    Point pos = v.getViewPosition();
+    Rectangle viewBounds = view.getBounds();
+
+    if (backingStoreImage == null 
+        || backingStoreWidth != viewBounds.width
+        || backingStoreHeight != viewBounds.height)
+      {
+        backingStoreImage = v.createImage(viewBounds.width, viewBounds.height);
+        backingStoreWidth = viewBounds.width;
+        backingStoreHeight = viewBounds.height;
+      }
+
+    Graphics g2 = backingStoreImage.getGraphics();
+    view.paint(g2);
+    g2 = null;
+    g.drawImage(backingStoreImage, 
+                -pos.x, -pos.y, 
+                (ImageObserver)null);
     }
 }

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]