aboutsummaryrefslogtreecommitdiff
path: root/libjava/javax/swing/JScrollPane.java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/javax/swing/JScrollPane.java')
-rw-r--r--libjava/javax/swing/JScrollPane.java588
1 files changed, 516 insertions, 72 deletions
diff --git a/libjava/javax/swing/JScrollPane.java b/libjava/javax/swing/JScrollPane.java
index 6a63be5..f31da04 100644
--- a/libjava/javax/swing/JScrollPane.java
+++ b/libjava/javax/swing/JScrollPane.java
@@ -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,96 +39,540 @@ exception statement from your version. */
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;
-public class JScrollPane extends JComponent implements Accessible, ScrollPaneConstants
+/**
+ * <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
{
- protected JViewport columnHeader;
- protected JViewport rowHeader;
+ JViewport columnHeader;
+ JViewport rowHeader;
- protected Component lowerLeft;
- protected Component lowerRight;
- protected Component upperLeft;
- protected Component upperRight;
+ Component lowerLeft;
+ Component lowerRight;
+ Component upperLeft;
+ Component upperRight;
- protected JScrollBar horizontalScrollBar;
- protected int horizontalScrollBarPolicy;
- protected JScrollBar verticalScrollBar;
- protected int verticalScrollBarPolicy;
+ JScrollBar horizontalScrollBar;
+ int horizontalScrollBarPolicy;
+ JScrollBar verticalScrollBar;
+ int verticalScrollBarPolicy;
- protected JViewport viewport;
+ 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 JScrollPane()
- {
- this(null, 0, 0);
- }
-
- public JScrollPane(Component view)
- {
- this(view, 0, 0);
- }
-
+ 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 JScrollBar getVerticalScrollBar()
+ {
+ return verticalScrollBar;
+ }
+
+ public int getVerticalScrollBarPolicy()
+ {
+ return verticalScrollBarPolicy;
+ }
+
+ public JViewport getViewport()
+ {
+ return viewport;
+ }
+
+ public Border getViewportBorder()
+ {
+ return viewportBorder;
+ }
+
+ public Rectangle getViewportBorderBounds()
+ {
+ if (viewportBorder == null)
+ {
+ if (getViewport() == null)
+ return new Rectangle(0,0,0,0);
+ else
+ return getViewport().getBounds();
+ }
+ else
+ {
+ 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 boolean isWheelScrollingEnabled()
+ {
+ return wheelScrollingEnabled;
+ }
+
+
+
+ private void sync()
+ {
+ LayoutManager m = super.getLayout();
+ if (m != null && m instanceof ScrollPaneLayout)
+ {
+ ScrollPaneLayout sl = (ScrollPaneLayout) m;
+ sl.syncWithScrollPane(this);
+ }
+ }
+
+ private void removeNonNull(Component c)
+ {
+ if (c != null)
+ remove(c);
+ }
+
+ private void addNonNull(Component c)
+ {
+ if (c != null)
+ add(c);
+ }
+
+ public void setComponentOrientation(ComponentOrientation co)
+ {
+ ComponentOrientation old = super.getComponentOrientation();
+ super.setComponentOrientation(co);
+ firePropertyChange(COMPONENT_ORIENTATION_CHANGED_PROPERTY, old, co);
+ sync();
+ }
+
+ public void setColumnHeader(JViewport h)
+ {
+ JViewport old = columnHeader;
+ removeNonNull(old);
+ columnHeader = h;
+ addNonNull(h);
+ firePropertyChange(COLUMN_HEADER_CHANGED_PROPERTY, old, h);
+ sync();
+ }
+
+ public void setColumnHeaderView(Component c)
+ {
+ if (columnHeader == null)
+ setColumnHeader(createViewport());
+ columnHeader.setView(c);
+ sync();
+ }
+
+ 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();
+ }
+
+ 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 setViewportBorder(Border b)
+ {
+ Border old = viewportBorder;
+ viewportBorder = b;
+ firePropertyChange(VIEWPORT_BORDER_CHANGED_PROPERTY, old, b);
+ sync();
+ }
- public JScrollPane(int vsbPolicy, int hsbPolicy)
- {
- this(null, 0, 0);
- }
+ public void setViewportView(Component view)
+ {
+ if (getViewport() == null)
+ {
+ setViewport(createViewport());
+ }
+
+ if (view != null)
+ {
+ getViewport().setView(view);
+ }
+ sync();
+ }
- public JScrollPane(Component view, int vsbPolicy, int hsbPolicy)
- {
- setViewportView(view);
- setOpaque(true);
- updateUI();
- }
+ public boolean isValidateRoot()
+ {
+ return true;
+ }
- public String getUIClassID()
- {
- //Returns a string that specifies the name of the L&F class that renders this component.
- return "ScrollPaneUI";
- }
+ 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();
+ }
- public JViewport getViewport()
- {
- return viewport;
- }
+ 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 JViewport createViewport()
- {
- return new JViewport();
- }
+
+ public JScrollPane()
+ {
+ this(null);
+ }
- public void setViewport(JViewport v)
- {
- if (viewport != null)
- remove(viewport);
+ public JScrollPane(Component view)
+ {
+ this(view,
+ VERTICAL_SCROLLBAR_AS_NEEDED,
+ HORIZONTAL_SCROLLBAR_AS_NEEDED);
+ }
- viewport = v;
-
- add(v);
-
- revalidate();
- repaint();
- }
+ 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 void updateUI()
- {
- ScrollPaneUI b = (ScrollPaneUI)UIManager.getUI(this);
- setUI(b);
- }
+ public JViewport createViewport()
+ {
+ return new JViewport();
+ }
- public void setViewportView(Component view)
+ 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)
{
- if (getViewport() == null)
- {
- setViewport(createViewport());
- }
-
- if (view != null)
- {
- getViewport().setView(view);
- }
+ super(orientation);
+ Component view = this.JScrollPane.getViewportView();
+ if (view == null)
+ return;
+ if (! view instanceof Scrollable)
+ {
+ Scrollable s = (Scrollable) view;
+ s.
+ }
}
+
+ }
+ */
+
}