1. /*
  2. * @(#)MetalScrollPaneUI.java 1.17 03/01/27
  3. *
  4. * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
  5. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
  6. */
  7. package javax.swing.plaf.metal;
  8. import javax.swing.*;
  9. import javax.swing.event.*;
  10. import javax.swing.border.*;
  11. import javax.swing.plaf.*;
  12. import javax.swing.plaf.basic.*;
  13. import java.awt.*;
  14. import java.beans.*;
  15. import java.awt.event.*;
  16. /**
  17. * A Metal L&F implementation of ScrollPaneUI.
  18. * <p>
  19. * <strong>Warning:</strong>
  20. * Serialized objects of this class will not be compatible with
  21. * future Swing releases. The current serialization support is
  22. * appropriate for short term storage or RMI between applications running
  23. * the same version of Swing. As of 1.4, support for long term storage
  24. * of all JavaBeans<sup><font size="-2">TM</font></sup>
  25. * has been added to the <code>java.beans</code> package.
  26. * Please see {@link java.beans.XMLEncoder}.
  27. *
  28. * @version 1.17 01/27/03
  29. * @author Steve Wilson
  30. */
  31. public class MetalScrollPaneUI extends BasicScrollPaneUI
  32. {
  33. private PropertyChangeListener scrollBarSwapListener;
  34. public static ComponentUI createUI(JComponent x) {
  35. return new MetalScrollPaneUI();
  36. }
  37. public void installUI(JComponent c) {
  38. super.installUI(c);
  39. JScrollPane sp = (JScrollPane)c;
  40. JScrollBar hsb = sp.getHorizontalScrollBar();
  41. JScrollBar vsb = sp.getVerticalScrollBar();
  42. updateScrollbarsFreeStanding();
  43. }
  44. public void uninstallUI(JComponent c) {
  45. super.uninstallUI(c);
  46. JScrollPane sp = (JScrollPane)c;
  47. JScrollBar hsb = sp.getHorizontalScrollBar();
  48. JScrollBar vsb = sp.getVerticalScrollBar();
  49. hsb.putClientProperty( MetalScrollBarUI.FREE_STANDING_PROP, null);
  50. vsb.putClientProperty( MetalScrollBarUI.FREE_STANDING_PROP, null);
  51. }
  52. public void installListeners(JScrollPane scrollPane) {
  53. super.installListeners(scrollPane);
  54. scrollBarSwapListener = createScrollBarSwapListener();
  55. scrollPane.addPropertyChangeListener(scrollBarSwapListener);
  56. }
  57. public void uninstallListeners(JScrollPane scrollPane) {
  58. super.uninstallListeners(scrollPane);
  59. scrollPane.removePropertyChangeListener(scrollBarSwapListener);
  60. }
  61. /**
  62. * If the border of the scrollpane is an instance of
  63. * <code>MetalBorders.ScrollPaneBorder</code>, the client property
  64. * <code>FREE_STANDING_PROP</code> of the scrollbars
  65. * is set to false, otherwise it is set to true.
  66. */
  67. private void updateScrollbarsFreeStanding() {
  68. if (scrollpane == null) {
  69. return;
  70. }
  71. Border border = scrollpane.getBorder();
  72. Object value;
  73. if (border instanceof MetalBorders.ScrollPaneBorder) {
  74. value = Boolean.FALSE;
  75. }
  76. else {
  77. value = Boolean.TRUE;
  78. }
  79. scrollpane.getHorizontalScrollBar().putClientProperty
  80. (MetalScrollBarUI.FREE_STANDING_PROP, value);
  81. scrollpane.getVerticalScrollBar().putClientProperty
  82. (MetalScrollBarUI.FREE_STANDING_PROP, value);
  83. }
  84. protected PropertyChangeListener createScrollBarSwapListener() {
  85. return new PropertyChangeListener() {
  86. public void propertyChange(PropertyChangeEvent e) {
  87. String propertyName = e.getPropertyName();
  88. if (propertyName.equals("verticalScrollBar") ||
  89. propertyName.equals("horizontalScrollBar")) {
  90. ((JScrollBar)e.getOldValue()).putClientProperty( MetalScrollBarUI.FREE_STANDING_PROP,
  91. null);
  92. ((JScrollBar)e.getNewValue()).putClientProperty( MetalScrollBarUI.FREE_STANDING_PROP,
  93. Boolean.FALSE);
  94. }
  95. else if ("border".equals(propertyName)) {
  96. updateScrollbarsFreeStanding();
  97. }
  98. }};
  99. }
  100. }