mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			492 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			492 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Java
		
	
	
	
| /* ScrollPaneLayout.java --
 | |
|    Copyright (C) 2002, 2004  Free Software Foundation, Inc.
 | |
| 
 | |
| This file is part of GNU Classpath.
 | |
| 
 | |
| GNU Classpath is free software; you can redistribute it and/or modify
 | |
| it under the terms of the GNU General Public License as published by
 | |
| the Free Software Foundation; either version 2, or (at your option)
 | |
| any later version.
 | |
| 
 | |
| GNU Classpath is distributed in the hope that it will be useful, but
 | |
| WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | |
| General Public License for more details.
 | |
| 
 | |
| You should have received a copy of the GNU General Public License
 | |
| along with GNU Classpath; see the file COPYING.  If not, write to the
 | |
| Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | |
| 02110-1301 USA.
 | |
| 
 | |
| Linking this library statically or dynamically with other modules is
 | |
| making a combined work based on this library.  Thus, the terms and
 | |
| conditions of the GNU General Public License cover the whole
 | |
| combination.
 | |
| 
 | |
| As a special exception, the copyright holders of this library give you
 | |
| permission to link this library with independent modules to produce an
 | |
| executable, regardless of the license terms of these independent
 | |
| modules, and to copy and distribute the resulting executable under
 | |
| terms of your choice, provided that you also meet, for each linked
 | |
| independent module, the terms and conditions of the license of that
 | |
| module.  An independent module is a module which is not derived from
 | |
| or based on this library.  If you modify this library, you may extend
 | |
| this exception to your version of the library, but you are not
 | |
| obligated to do so.  If you do not wish to do so, delete this
 | |
| exception statement from your version. */
 | |
| 
 | |
| 
 | |
| package javax.swing;
 | |
| 
 | |
| 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
 | |
|  * @author      Andrew Selkirk
 | |
|  * @version     1.0
 | |
|  */
 | |
| public class ScrollPaneLayout
 | |
|   implements LayoutManager, ScrollPaneConstants, Serializable
 | |
| {
 | |
|   private static final long serialVersionUID = -4480022884523193743L;
 | |
| 
 | |
|   public static class UIResource extends ScrollPaneLayout
 | |
|     implements javax.swing.plaf.UIResource
 | |
|   {
 | |
|     public UIResource()
 | |
|     {
 | |
|       super();
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   protected JViewport viewport;
 | |
|   protected JScrollBar vsb;
 | |
|   protected JScrollBar hsb;
 | |
|   protected JViewport rowHead;
 | |
|   protected JViewport colHead;
 | |
|   protected Component lowerLeft;
 | |
|   protected Component lowerRight;
 | |
|   protected Component upperLeft;
 | |
|   protected Component upperRight;
 | |
|   protected int vsbPolicy;
 | |
|   protected int hsbPolicy;
 | |
| 
 | |
|   public ScrollPaneLayout()
 | |
|   {
 | |
|         // Nothing to do here.
 | |
|   }
 | |
| 
 | |
|   public void syncWithScrollPane(JScrollPane scrollPane)
 | |
|   {
 | |
|     viewport = scrollPane.getViewport();
 | |
|     rowHead = scrollPane.getRowHeader();
 | |
|     colHead = scrollPane.getColumnHeader();
 | |
|     vsb = scrollPane.getVerticalScrollBar();
 | |
|     hsb = scrollPane.getHorizontalScrollBar();
 | |
|     vsbPolicy = scrollPane.getVerticalScrollBarPolicy();
 | |
|     hsbPolicy = 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);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Removes an existing component.  If oldComponent is not null
 | |
|    * and is not equal to newComponent, oldComponent must be removed
 | |
|    * from its parent.
 | |
|    * @param oldComponent the old Component that may need to be removed.
 | |
|    * @param newComponent the Component to add.
 | |
|    * @return the newComponent
 | |
|    */
 | |
|   protected Component addSingletonComponent(Component oldComponent,
 | |
|                                             Component newComponent)
 | |
|   {
 | |
|     if (oldComponent != null && oldComponent != newComponent)
 | |
|       oldComponent.getParent().remove(oldComponent);
 | |
|     return newComponent;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Add the specified component to the layout.
 | |
|    * @param key must be one of VIEWPORT, VERTICAL_SCROLLBAR,
 | |
|    * HORIZONTAL_SCROLLBAR, ROW_HEADER, COLUMN_HEADER,
 | |
|    * LOWER_RIGHT_CORNER, LOWER_LEFT_CORNER, UPPER_RIGHT_CORNER,
 | |
|    * UPPER_LEFT_CORNER.
 | |
|    * @param component the Component to add
 | |
|    * @throws IllegalArgumentException if key is not as above
 | |
|    */
 | |
|   public void addLayoutComponent(String key, Component component)
 | |
|   {
 | |
|     if (key == VIEWPORT)
 | |
|       viewport = (JViewport) component;
 | |
|     else if (key == VERTICAL_SCROLLBAR)
 | |
|       vsb = (JScrollBar) component;
 | |
|     else if (key == HORIZONTAL_SCROLLBAR)
 | |
|       hsb = (JScrollBar) component;
 | |
|     else if (key == ROW_HEADER)
 | |
|       rowHead = (JViewport) component;
 | |
|     else if (key == COLUMN_HEADER)
 | |
|       colHead = (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;
 | |
|     else
 | |
|       throw new IllegalArgumentException();
 | |
|   }
 | |
| 
 | |
|   public void removeLayoutComponent(Component component)
 | |
|   {
 | |
|     if (component == viewport)
 | |
|       viewport = null;
 | |
|     else if (component == vsb)
 | |
|       vsb = null;
 | |
|     else if (component == hsb)
 | |
|       hsb = null;
 | |
|     else if (component == rowHead)
 | |
|       rowHead = null;
 | |
|     else if (component == colHead)
 | |
|       colHead = 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;
 | |
|   }
 | |
| 
 | |
|   public int getVerticalScrollBarPolicy()
 | |
|   {
 | |
|     return vsbPolicy;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Sets the vertical scrollbar policy.
 | |
|    * @param policy must be one of VERTICAL_SCROLLBAR_AS_NEEDED,
 | |
|    * VERTICAL_SCROLLBAR_NEVER, VERTICAL_SCROLLBAR_ALWAYS.
 | |
|    * @throws IllegalArgumentException if policy is not one of the valid
 | |
|    * JScrollBar policies.
 | |
|    */
 | |
|   public void setVerticalScrollBarPolicy(int policy)
 | |
|   {
 | |
|     if (policy != VERTICAL_SCROLLBAR_AS_NEEDED &&
 | |
|         policy != VERTICAL_SCROLLBAR_NEVER &&
 | |
|         policy != VERTICAL_SCROLLBAR_ALWAYS)
 | |
|       throw new IllegalArgumentException("Illegal Scrollbar Policy");
 | |
|     vsbPolicy = policy;
 | |
|   }
 | |
| 
 | |
|   public int getHorizontalScrollBarPolicy()
 | |
|   {
 | |
|     return hsbPolicy;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Sets the horizontal scrollbar policy.
 | |
|    * @param policy must be one of HORIZONTAL_SCROLLBAR_AS_NEEDED,
 | |
|    * HORIZONTAL_SCROLLBAR_NEVER, HORIZONTAL_SCROLLBAR_ALWAYS.
 | |
|    * @throws IllegalArgumentException if policy is not one of the valid
 | |
|    * JScrollbar policies.
 | |
|    */
 | |
|   public void setHorizontalScrollBarPolicy(int policy)
 | |
|   {
 | |
|     if (policy != HORIZONTAL_SCROLLBAR_AS_NEEDED &&
 | |
|         policy != HORIZONTAL_SCROLLBAR_NEVER &&
 | |
|         policy != HORIZONTAL_SCROLLBAR_ALWAYS)
 | |
|       throw new IllegalArgumentException("Illegal Scrollbar Policy");
 | |
|     hsbPolicy = policy;
 | |
|   }
 | |
| 
 | |
|   public JViewport getViewport()
 | |
|   {
 | |
|     return viewport;
 | |
|   }
 | |
| 
 | |
|   public JScrollBar getHorizontalScrollBar()
 | |
|   {
 | |
|     return hsb;
 | |
|   }
 | |
| 
 | |
|   public JScrollBar getVerticalScrollBar()
 | |
|   {
 | |
|     return vsb;
 | |
|   }
 | |
| 
 | |
|   public JViewport getRowHeader()
 | |
|   {
 | |
|     return rowHead;
 | |
|   }
 | |
| 
 | |
|   public JViewport getColumnHeader()
 | |
|   {
 | |
|     return colHead;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the Component at the specified corner.
 | |
|    * @param key the corner.
 | |
|    * @return the Component at the specified corner, or null if
 | |
|    * key is not one of the four valid corners.
 | |
|    */
 | |
|   public Component getCorner(String key)
 | |
|   {
 | |
|     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 Dimension preferredLayoutSize(Container parent)
 | |
|   {
 | |
|     // Sun's implementation simply throws a ClassCastException if
 | |
|     // parent is no JScrollPane, so do we.
 | |
|     JScrollPane sc = (JScrollPane) parent;
 | |
|     Dimension viewportSize = viewport.getPreferredSize();
 | |
|     Dimension viewSize = viewport.getViewSize();
 | |
|     int width = viewportSize.width;
 | |
|     int height = viewportSize.height;
 | |
| 
 | |
|     // horizontal scrollbar needed if the view's preferred width
 | |
|     // is larger than the viewport's preferred width
 | |
|     if (hsb != null && viewSize.width > viewportSize.width)
 | |
|       height += hsb.getPreferredSize().height;
 | |
| 
 | |
|     // vertical scrollbar needed if the view's preferred height
 | |
|     // is larger than the viewport's preferred height
 | |
|     if (vsb != null && viewSize.height > viewportSize.height)
 | |
|       width += vsb.getPreferredSize().width;
 | |
|     if (rowHead != null && rowHead.isVisible())
 | |
|       width += rowHead.getPreferredSize().width;
 | |
|     if (colHead != null && colHead.isVisible())
 | |
|       height += colHead.getPreferredSize().height;
 | |
| 
 | |
|     // Add insets of viewportBorder if present.
 | |
|     Border vpBorder = sc.getViewportBorder();
 | |
|     if (vpBorder != null)
 | |
|       {
 | |
|         Insets i = vpBorder.getBorderInsets(sc);
 | |
|         width += i.left + i.right;
 | |
|         height += i.top + i.bottom;
 | |
|       }
 | |
| 
 | |
|     Insets i = sc.getInsets();
 | |
|     return new Dimension(width + i.left + i.right,
 | |
|                          height + i.left + i.right);
 | |
|   }
 | |
| 
 | |
|   public Dimension minimumLayoutSize(Container parent)
 | |
|   {
 | |
|     // Sun's implementation simply throws a ClassCastException if
 | |
|     // parent is no JScrollPane, so do we.
 | |
|     JScrollPane sc = (JScrollPane) parent;
 | |
|     Insets i = sc.getInsets();
 | |
|     Dimension viewportMinSize = sc.getViewport().getMinimumSize();
 | |
| 
 | |
|     int width = i.left + i.right + viewportMinSize.width;
 | |
|     if (sc.getVerticalScrollBarPolicy()
 | |
|         != JScrollPane.VERTICAL_SCROLLBAR_NEVER)
 | |
|       width += sc.getVerticalScrollBar().getMinimumSize().width;
 | |
| 
 | |
|     int height = i.top + i.bottom + viewportMinSize.height;
 | |
|     if (sc.getHorizontalScrollBarPolicy()
 | |
|         != JScrollPane.HORIZONTAL_SCROLLBAR_NEVER)
 | |
|       height += sc.getHorizontalScrollBar().getMinimumSize().height;
 | |
| 
 | |
|     // Add insets of viewportBorder if present.
 | |
|     Border vpBorder = sc.getViewportBorder();
 | |
|     if (vpBorder != null)
 | |
|       {
 | |
|         i = vpBorder.getBorderInsets(sc);
 | |
|         width += i.left + i.right;
 | |
|         height += i.top + i.bottom;
 | |
|       }
 | |
| 
 | |
|     return new Dimension(width, height);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    *
 | |
|    *     +----+--------------------+----+ 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 void layoutContainer(Container parent)
 | |
|   {
 | |
|     // Sun's implementation simply throws a ClassCastException if
 | |
|     // parent is no JScrollPane, so do we.
 | |
|     JScrollPane sc = (JScrollPane) parent;
 | |
|     JViewport viewport = sc.getViewport();
 | |
|     Component view = viewport.getView();
 | |
| 
 | |
|     // If there is no view in the viewport, there is no work to be done.
 | |
|     if (view == null)
 | |
|       return;
 | |
| 
 | |
|     Dimension viewSize = viewport.getView().getPreferredSize();
 | |
| 
 | |
|     int x1 = 0, x2 = 0, x3 = 0, x4 = 0;
 | |
|     int y1 = 0, y2 = 0, y3 = 0, y4 = 0;
 | |
|     Rectangle scrollPaneBounds = SwingUtilities.calculateInnerArea(sc, null);
 | |
| 
 | |
|     // If there is a viewportBorder, remove its insets from the available
 | |
|     // space.
 | |
|     Border vpBorder = sc.getViewportBorder();
 | |
|     Insets vpi;
 | |
|     if (vpBorder != null)
 | |
|       vpi = vpBorder.getBorderInsets(sc);
 | |
|     else
 | |
|       vpi = new Insets(0, 0, 0, 0);
 | |
| 
 | |
|     x1 = scrollPaneBounds.x;
 | |
|     y1 = scrollPaneBounds.y;
 | |
|     x4 = scrollPaneBounds.x + scrollPaneBounds.width;
 | |
|     y4 = scrollPaneBounds.y + scrollPaneBounds.height;
 | |
|     if (colHead != null)
 | |
|       y2 = y1 + colHead.getPreferredSize().height;
 | |
|     else
 | |
|       y2 = y1;
 | |
| 
 | |
|     if (rowHead != null)
 | |
|       x2 = x1 + rowHead.getPreferredSize().width;
 | |
|     else
 | |
|       x2 = x1;
 | |
| 
 | |
|     int vsbPolicy = sc.getVerticalScrollBarPolicy();
 | |
|     int hsbPolicy = sc.getHorizontalScrollBarPolicy();
 | |
| 
 | |
|     int vsWidth = 0;
 | |
|     int hsHeight = 0;
 | |
| 
 | |
|     boolean showVsb =
 | |
|       (vsb != null)
 | |
|       && ((vsbPolicy == VERTICAL_SCROLLBAR_ALWAYS)
 | |
|           || (vsbPolicy == VERTICAL_SCROLLBAR_AS_NEEDED
 | |
|               && viewSize.height > (y4 - y2)));
 | |
| 
 | |
|     if (showVsb)
 | |
|       vsWidth = vsb.getPreferredSize().width;
 | |
| 
 | |
|     // The horizontal scroll bar may become necessary if the vertical scroll
 | |
|     // bar appears, reducing the space, left for the component.
 | |
| 
 | |
|     boolean showHsb =
 | |
|       (hsb != null)
 | |
|       && ((hsbPolicy == HORIZONTAL_SCROLLBAR_ALWAYS)
 | |
|           || (hsbPolicy == HORIZONTAL_SCROLLBAR_AS_NEEDED
 | |
|               && viewSize.width > (x4 - x2 - vsWidth)));
 | |
| 
 | |
|     if (showHsb)
 | |
|       hsHeight = hsb.getPreferredSize().height;
 | |
| 
 | |
|     // If the horizontal scroll bar appears, and the vertical scroll bar
 | |
|     // was not necessary assuming that there is no horizontal scroll bar,
 | |
|     // the vertical scroll bar may become necessary because the horizontal
 | |
|     // scroll bar reduces the vertical space for the component.
 | |
|     if (!showVsb)
 | |
|       {
 | |
|         showVsb =
 | |
|           (vsb != null)
 | |
|           && ((vsbPolicy == VERTICAL_SCROLLBAR_ALWAYS)
 | |
|               || (vsbPolicy == VERTICAL_SCROLLBAR_AS_NEEDED
 | |
|                   && viewSize.height > (y4 - y2)));
 | |
| 
 | |
|         if (showVsb)
 | |
|           vsWidth = vsb.getPreferredSize().width;
 | |
|       }
 | |
| 
 | |
|     x3 = x4 - vsWidth;
 | |
|     y3 = y4 - hsHeight;
 | |
| 
 | |
|     // now set the layout
 | |
|     if (viewport != null)
 | |
|       viewport.setBounds(new Rectangle(x2 + vpi.left, y2 + vpi.top,
 | |
|                                        x3 - x2 - vpi.left - vpi.right,
 | |
|                                        y3 - y2 - vpi.top - vpi.bottom));
 | |
| 
 | |
|     if (colHead != null)
 | |
|       colHead.setBounds(new Rectangle(x2, y1, x3 - x2, y2 - y1));
 | |
| 
 | |
|     if (rowHead != null)
 | |
|       rowHead.setBounds(new Rectangle(x1, y2, x2 - x1, y3 - y2));
 | |
| 
 | |
|     if (showVsb)
 | |
|       {
 | |
|         vsb.setVisible(true);
 | |
|         vsb.setBounds(new Rectangle(x3, y2, x4 - x3, y3 - y2 ));
 | |
|       }
 | |
|     else if (vsb != null)
 | |
|       vsb.setVisible(false);
 | |
| 
 | |
|     if (showHsb)
 | |
|       {
 | |
|         hsb.setVisible(true);
 | |
|         hsb.setBounds(new Rectangle(x2 , y3, x3 - x2, y4 - y3));
 | |
|       }
 | |
|     else if (hsb != null)
 | |
|       hsb.setVisible(false);
 | |
| 
 | |
|     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));
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Returns the bounds of the border around a ScrollPane's viewport.
 | |
|    *
 | |
|    * @param scrollPane the ScrollPane for which's viewport the border
 | |
|    *     is requested
 | |
|    *
 | |
|    * @deprecated As of Swing 1.1 replaced by
 | |
|    *     {@link javax.swing.JScrollPane#getViewportBorderBounds}.
 | |
|    */
 | |
|   public Rectangle getViewportBorderBounds(JScrollPane scrollPane)
 | |
|   {
 | |
|     return null;
 | |
|   }
 | |
| 
 | |
| 
 | |
| }
 |