diff options
Diffstat (limited to 'javax/swing')
-rw-r--r-- | javax/swing/JScrollBar.java | 113 | ||||
-rw-r--r-- | javax/swing/JViewport.java | 77 | ||||
-rw-r--r-- | javax/swing/plaf/basic/BasicScrollPaneUI.java | 36 |
3 files changed, 112 insertions, 114 deletions
diff --git a/javax/swing/JScrollBar.java b/javax/swing/JScrollBar.java index bf0803ab5..1f21aa13f 100644 --- a/javax/swing/JScrollBar.java +++ b/javax/swing/JScrollBar.java @@ -50,6 +50,8 @@ import javax.accessibility.AccessibleRole; import javax.accessibility.AccessibleState; import javax.accessibility.AccessibleStateSet; import javax.accessibility.AccessibleValue; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; import javax.swing.plaf.ScrollBarUI; /** @@ -172,6 +174,28 @@ public class JScrollBar extends JComponent implements Adjustable, Accessible } } + /** + * Listens for changes on the model and fires them to interested + * listeners on the JScrollBar, after re-sourcing them. + */ + private class ScrollBarChangeListener + implements ChangeListener + { + + public void stateChanged(ChangeEvent event) + { + Object o = event.getSource(); + if (o instanceof BoundedRangeModel) + { + BoundedRangeModel m = (BoundedRangeModel) o; + fireAdjustmentValueChanged(AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED, + AdjustmentEvent.TRACK, m.getValue(), + m.getValueIsAdjusting()); + } + } + + } + private static final long serialVersionUID = -8195169869225066566L; /** How much the thumb moves when moving in a block. */ @@ -186,6 +210,12 @@ public class JScrollBar extends JComponent implements Adjustable, Accessible /** How much the thumb moves when moving in a unit. */ protected int unitIncrement = 1; + /** + * This ChangeListener forwards events fired from the model and re-sources + * them to originate from this JScrollBar. + */ + private ChangeListener sbChangeListener; + /** * Creates a new horizontal JScrollBar object with a minimum * of 0, a maxmium of 100, a value of 0 and an extent of 10. @@ -220,6 +250,8 @@ public class JScrollBar extends JComponent implements Adjustable, Accessible public JScrollBar(int orientation, int value, int extent, int min, int max) { model = new DefaultBoundedRangeModel(value, extent, min, max); + sbChangeListener = new ScrollBarChangeListener(); + model.addChangeListener(sbChangeListener); if (orientation != SwingConstants.HORIZONTAL && orientation != SwingConstants.VERTICAL) throw new IllegalArgumentException(orientation @@ -319,12 +351,13 @@ public class JScrollBar extends JComponent implements Adjustable, Accessible */ public void setModel(BoundedRangeModel newModel) { - if (model != newModel) - { - BoundedRangeModel oldModel = model; - model = newModel; - firePropertyChange("model", oldModel, model); - } + BoundedRangeModel oldModel = model; + if (oldModel != null) + oldModel.removeChangeListener(sbChangeListener); + model = newModel; + if (model != null) + model.addChangeListener(sbChangeListener); + firePropertyChange("model", oldModel, model); } /** @@ -424,12 +457,7 @@ public class JScrollBar extends JComponent implements Adjustable, Accessible */ public void setValue(int value) { - if (isEnabled() && value != getValue()) - { - model.setValue(value); - fireAdjustmentValueChanged(AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED, - AdjustmentEvent.TRACK, value); - } + model.setValue(value); } /** @@ -451,12 +479,7 @@ public class JScrollBar extends JComponent implements Adjustable, Accessible */ public void setVisibleAmount(int extent) { - if (extent != getVisibleAmount()) - { - model.setExtent(extent); - fireAdjustmentValueChanged(AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED, - AdjustmentEvent.TRACK, extent); - } + model.setExtent(extent); } /** @@ -476,12 +499,7 @@ public class JScrollBar extends JComponent implements Adjustable, Accessible */ public void setMinimum(int minimum) { - if (minimum != getMinimum()) - { - model.setMinimum(minimum); - fireAdjustmentValueChanged(AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED, - AdjustmentEvent.TRACK, minimum); - } + model.setMinimum(minimum); } /** @@ -501,12 +519,7 @@ public class JScrollBar extends JComponent implements Adjustable, Accessible */ public void setMaximum(int maximum) { - if (maximum != getMaximum()) - { - model.setMaximum(maximum); - fireAdjustmentValueChanged(AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED, - AdjustmentEvent.TRACK, maximum); - } + model.setMaximum(maximum); } /** @@ -540,17 +553,8 @@ public class JScrollBar extends JComponent implements Adjustable, Accessible */ public void setValues(int newValue, int newExtent, int newMin, int newMax) { - if (!isEnabled()) - newValue = model.getValue(); - // It seems to be that on any change the value is fired. - if (newValue != getValue() || newExtent != getVisibleAmount() || - newMin != getMinimum() || newMax != getMaximum()) - { - model.setRangeProperties(newValue, newExtent, newMin, newMax, - model.getValueIsAdjusting()); - fireAdjustmentValueChanged(AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED, - AdjustmentEvent.TRACK, newValue); - } + model.setRangeProperties(newValue, newExtent, newMin, newMax, + model.getValueIsAdjusting()); } /** @@ -596,15 +600,30 @@ public class JScrollBar extends JComponent implements Adjustable, Accessible */ protected void fireAdjustmentValueChanged(int id, int type, int value) { + fireAdjustmentValueChanged(id, type, value, getValueIsAdjusting()); + } + + /** + * Helper method for firing adjustment events that can have their + * isAdjusting field modified. + * + * This is package private to avoid an accessor method. + * + * @param id the ID of the event + * @param type the type of the event + * @param value the value + * @param isAdjusting if the scrollbar is adjusting or not + */ + void fireAdjustmentValueChanged(int id, int type, int value, + boolean isAdjusting) + { Object[] adjustmentListeners = listenerList.getListenerList(); - AdjustmentEvent adjustmentEvent = new AdjustmentEvent(this, - AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED, - AdjustmentEvent.TRACK, - value); + AdjustmentEvent adjustmentEvent = new AdjustmentEvent(this, id, type, + value, isAdjusting); for (int i = adjustmentListeners.length - 2; i >= 0; i -= 2) { - if (adjustmentListeners[i] == AdjustmentListener.class) - ((AdjustmentListener) adjustmentListeners[i + 1]).adjustmentValueChanged(adjustmentEvent); + if (adjustmentListeners[i] == AdjustmentListener.class) + ((AdjustmentListener) adjustmentListeners[i + 1]).adjustmentValueChanged(adjustmentEvent); } } diff --git a/javax/swing/JViewport.java b/javax/swing/JViewport.java index babffb7ce..ae0bee27d 100644 --- a/javax/swing/JViewport.java +++ b/javax/swing/JViewport.java @@ -157,6 +157,9 @@ public class JViewport extends JComponent implements Accessible */ public void componentResized(ComponentEvent ev) { + // Fire state change, because resizing the view means changing the + // extentSize. + fireStateChanged(); revalidate(); } } @@ -198,22 +201,6 @@ public class JViewport extends JComponent implements Accessible int scrollMode; - /** - * 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) - */ - Dimension extentSize; - - /** - * The width and height of the view in its own coordinate space. - */ - Dimension viewSize; - /** * The ViewListener instance. */ @@ -290,10 +277,7 @@ public class JViewport extends JComponent implements Accessible public Dimension getExtentSize() { - if (extentSize == null) - return toViewCoordinates(getSize()); - else - return extentSize; + return getSize(); } public Dimension toViewCoordinates(Dimension size) @@ -310,8 +294,12 @@ public class JViewport extends JComponent implements Accessible public void setExtentSize(Dimension newSize) { - extentSize = newSize; - fireStateChanged(); + Dimension oldExtent = getExtentSize(); + if (! newSize.equals(oldExtent)) + { + setSize(newSize); + fireStateChanged(); + } } /** @@ -321,32 +309,34 @@ public class JViewport extends JComponent implements Accessible */ public Dimension getViewSize() { - if (isViewSizeSet) - return viewSize; - else + Dimension size; + Component view = getView(); + if (view != null) { - Component view = getView(); - if (view != null) - return view.getPreferredSize(); - else - return new Dimension(); + if (isViewSizeSet) + size = view.getSize(); + else + size = view.getPreferredSize(); } + else + size = new Dimension(0, 0); + return size; } public void setViewSize(Dimension newSize) { - viewSize = newSize; Component view = getView(); if (view != null) { - if (newSize != view.getSize()) + if (! newSize.equals(view.getSize())) { - view.setSize(viewSize); + scrollUnderway = false; + view.setSize(newSize); + isViewSizeSet = true; fireStateChanged(); } } - isViewSizeSet = true; } /** @@ -371,23 +361,18 @@ public class JViewport extends JComponent implements Accessible public void setViewPosition(Point p) { - if (getViewPosition().equals(p)) - return; Component view = getView(); - if (view != null) + if (view != null && ! p.equals(getViewPosition())) { - Point q = new Point(-p.x, -p.y); - view.setLocation(q); - isViewSizeSet = false; + scrollUnderway = true; + view.setLocation(-p.x, -p.y); fireStateChanged(); } - repaint(); } public Rectangle getViewRect() { - return new Rectangle(getViewPosition(), - getExtentSize()); + return new Rectangle(getViewPosition(), getExtentSize()); } /** @@ -495,7 +480,6 @@ public class JViewport extends JComponent implements Accessible if (view == null) return; - Point pos = getViewPosition(); Rectangle viewBounds = view.getBounds(); Rectangle portBounds = getBounds(); @@ -940,7 +924,10 @@ public class JViewport extends JComponent implements Accessible /** * Overridden from JComponent to set the {@link #isPaintRoot} flag. * - * @param r the rectangle to paint + * @param x the rectangle to paint, X coordinate + * @param y the rectangle to paint, Y coordinate + * @param w the rectangle to paint, width + * @param h the rectangle to paint, height */ void paintImmediately2(int x, int y, int w, int h) { diff --git a/javax/swing/plaf/basic/BasicScrollPaneUI.java b/javax/swing/plaf/basic/BasicScrollPaneUI.java index 0b26ea6b9..236eac073 100644 --- a/javax/swing/plaf/basic/BasicScrollPaneUI.java +++ b/javax/swing/plaf/basic/BasicScrollPaneUI.java @@ -101,13 +101,8 @@ public class BasicScrollPaneUI extends ScrollPaneUI JScrollBar hsb = scrollpane.getHorizontalScrollBar(); JViewport vp = scrollpane.getViewport(); Point viewPosition = vp.getViewPosition(); - int xpos = hsb.getValue(); - - if (xpos != viewPosition.x) - { - viewPosition.x = xpos; - vp.setViewPosition(viewPosition); - } + viewPosition.x = hsb.getValue(); + vp.setViewPosition(viewPosition); } } @@ -132,12 +127,8 @@ public class BasicScrollPaneUI extends ScrollPaneUI JScrollBar vsb = scrollpane.getVerticalScrollBar(); JViewport vp = scrollpane.getViewport(); Point viewPosition = vp.getViewPosition(); - int ypos = vsb.getValue(); - if (ypos != viewPosition.y) - { - viewPosition.y = ypos; - vp.setViewPosition(viewPosition); - } + viewPosition.y = vsb.getValue(); + vp.setViewPosition(viewPosition); } } @@ -819,16 +810,17 @@ public class BasicScrollPaneUI extends ScrollPaneUI if (vp != null) { Dimension extentSize = vp.getExtentSize(); - Rectangle viewBounds = vp.getViewRect(); + Point viewPos = vp.getViewPosition(); + Dimension viewSize = vp.getViewSize(); // Update the vertical scrollbar. JScrollBar vsb = scrollpane.getVerticalScrollBar(); if (vsb != null) { int extent = extentSize.height; - int max = viewBounds.height; - vsb.setValues(Math.max(0, Math.min(viewBounds.y, max - extent)), - extent, 0, max); + int max = viewSize.height; + int val = Math.max(0, Math.min(viewPos.y, max - extent)); + vsb.setValues(val, extent, 0, max); } // Update the horizontal scrollbar. @@ -836,16 +828,16 @@ public class BasicScrollPaneUI extends ScrollPaneUI if (hsb != null) { int extent = extentSize.width; - int max = viewBounds.width; - vsb.setValues(Math.max(0, Math.min(viewBounds.x, max - extent)), - extent, 0, max); + int max = viewSize.width; + int val = Math.max(0, Math.min(viewPos.x, max - extent)); + hsb.setValues(val, extent, 0, max); } // Update the row header. JViewport rowHeader = scrollpane.getRowHeader(); if (rowHeader != null) { - Point p = new Point(0, viewBounds.y); + Point p = new Point(0, viewPos.y); rowHeader.setViewPosition(p); } @@ -853,7 +845,7 @@ public class BasicScrollPaneUI extends ScrollPaneUI JViewport colHeader = scrollpane.getColumnHeader(); if (colHeader != null) { - Point p = new Point(viewBounds.x, 0); + Point p = new Point(viewPos.x, 0); colHeader.setViewPosition(p); } } |