ScrollPaneLayout.java [plain text]
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.Point;
import java.awt.Rectangle;
import java.io.Serializable;
import javax.swing.border.Border;
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() {
}
}
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() {
}
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);
}
protected Component addSingletonComponent(Component oldComponent,
Component newComponent) {
return null;
}
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;
}
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;
}
public void setVerticalScrollBarPolicy(int policy)
{
vsbPolicy = policy;
}
public int getHorizontalScrollBarPolicy()
{
return hsbPolicy;
}
public void setHorizontalScrollBarPolicy(int 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;
}
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;
}
private static void maybeSetPreferredSize(JComponent src, Dimension dim)
{
Dimension tmp = null;
if (src != null)
tmp = src.getPreferredSize();
if (tmp != null)
dim.setSize(tmp);
}
private static void maybeSetMinimumSize(JComponent src, Dimension dim)
{
Dimension tmp = null;
if (src != null)
tmp = src.getMinimumSize();
if (tmp != null)
dim.setSize(tmp);
}
public Dimension preferredLayoutSize(Container parent)
{
if (parent != null && 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 (viewportInsets != null)
viewportInsetsSize.setSize(viewportInsets.left + viewportInsets.right,
viewportInsets.top + viewportInsets.bottom);
}
if (insets != null)
insetsSize.setSize(insets.left + insets.right,
insets.top + insets.bottom);
if (viewport != null)
{
Component view = null;
Scrollable scr = null;
Dimension pref = null;
view = viewport.getView();
if (view != null && view instanceof Scrollable)
scr = (Scrollable) view;
if (scr != null)
pref = scr.getPreferredScrollableViewportSize();
if (pref == null)
pref = viewport.getPreferredSize();
if (pref != null)
viewportSize.setSize(pref);
}
maybeSetPreferredSize(colHead, columnHeaderSize);
maybeSetPreferredSize(rowHead, rowHeaderSize);
maybeSetPreferredSize(vsb, verticalScrollBarSize);
maybeSetPreferredSize(hsb, horizontalScrollBarSize);
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);
}
}
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 (viewportInsets != null)
viewportInsetsSize.setSize(viewportInsets.left + viewportInsets.right,
viewportInsets.top + viewportInsets.bottom);
}
if (insets != null)
insetsSize.setSize(insets.left + insets.right,
insets.top + insets.bottom);
maybeSetMinimumSize(colHead, columnHeaderSize);
maybeSetMinimumSize(rowHead, rowHeaderSize);
if (vsbPolicy != VERTICAL_SCROLLBAR_NEVER)
maybeSetMinimumSize(vsb, verticalScrollBarSize);
if (hsbPolicy != HORIZONTAL_SCROLLBAR_NEVER)
maybeSetMinimumSize(hsb, horizontalScrollBarSize);
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);
}
}
public void layoutContainer(Container parent)
{
if (parent instanceof JScrollPane)
{
JScrollPane sc = (JScrollPane) parent;
synchronized (sc.getTreeLock ())
{
JViewport viewport = sc.getViewport();
Dimension viewSize = viewport.getViewSize();
Point viewPos = viewport.getViewPosition();
int x1 = 0, x2 = 0, x3 = 0, x4 = 0;
int y1 = 0, y2 = 0, y3 = 0, y4 = 0;
Rectangle scrollPaneBounds = SwingUtilities.calculateInnerArea(sc, null);
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();
x3 = x4 - vsb.getPreferredSize().width;
y3 = y4 - hsb.getPreferredSize().height;
boolean showVsb =
(vsb != null)
&& ((vsbPolicy == VERTICAL_SCROLLBAR_ALWAYS)
|| (vsbPolicy == VERTICAL_SCROLLBAR_AS_NEEDED
&& viewSize.height > (y3 - y2)));
boolean showHsb =
(hsb != null)
&& ((hsbPolicy == HORIZONTAL_SCROLLBAR_ALWAYS)
|| (hsbPolicy == HORIZONTAL_SCROLLBAR_AS_NEEDED
&& viewSize.width > (x3 - x2)));
if (!showVsb)
x3 = x4;
if (!showHsb)
y3 = y4;
if (viewport != null)
viewport.setBounds(new Rectangle(x2, y2, x3-x2, y3-y2));
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));
}
}
}
public Rectangle getViewportBorderBounds(JScrollPane scrollPane) {
return null;
}
}