1 /* 2 * Copyright (c) 1998, 2004, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package javax.swing.plaf.metal; 27 28 import javax.swing.*; 29 import javax.swing.event.*; 30 import javax.swing.border.*; 31 import javax.swing.plaf.*; 32 import javax.swing.plaf.basic.*; 33 34 import java.awt.*; 35 import java.beans.*; 36 import java.awt.event.*; 37 38 39 /** 40 * A Metal L&F implementation of ScrollPaneUI. 41 * <p> 42 * <strong>Warning:</strong> 43 * Serialized objects of this class will not be compatible with 44 * future Swing releases. The current serialization support is 45 * appropriate for short term storage or RMI between applications running 46 * the same version of Swing. As of 1.4, support for long term storage 47 * of all JavaBeans<sup><font size="-2">TM</font></sup> 48 * has been added to the <code>java.beans</code> package. 49 * Please see {@link java.beans.XMLEncoder}. 50 * 51 * @author Steve Wilson 52 */ 53 public class MetalScrollPaneUI extends BasicScrollPaneUI 54 { 55 56 private PropertyChangeListener scrollBarSwapListener; 57 58 public static ComponentUI createUI(JComponent x) { 59 return new MetalScrollPaneUI(); 60 } 61 62 public void installUI(JComponent c) { 63 64 super.installUI(c); 65 66 JScrollPane sp = (JScrollPane)c; 67 updateScrollbarsFreeStanding(); 68 } 69 70 public void uninstallUI(JComponent c) { 71 super.uninstallUI(c); 72 73 JScrollPane sp = (JScrollPane)c; 74 JScrollBar hsb = sp.getHorizontalScrollBar(); 75 JScrollBar vsb = sp.getVerticalScrollBar(); 76 if (hsb != null) { 77 hsb.putClientProperty( MetalScrollBarUI.FREE_STANDING_PROP, null); 78 } 79 if (vsb != null) { 80 vsb.putClientProperty( MetalScrollBarUI.FREE_STANDING_PROP, null); 81 } 82 } 83 84 public void installListeners(JScrollPane scrollPane) { 85 super.installListeners(scrollPane); 86 scrollBarSwapListener = createScrollBarSwapListener(); 87 scrollPane.addPropertyChangeListener(scrollBarSwapListener); 88 } 89 90 /** 91 * {@inheritDoc} 92 */ 93 protected void uninstallListeners(JComponent c) { 94 super.uninstallListeners(c); 95 c.removePropertyChangeListener(scrollBarSwapListener); 96 } 97 98 /** 99 * @deprecated - Replaced by {@link #uninstallListeners(JComponent)} 100 */ 101 @Deprecated 102 public void uninstallListeners(JScrollPane scrollPane) { 103 super.uninstallListeners(scrollPane); 104 scrollPane.removePropertyChangeListener(scrollBarSwapListener); 105 } 106 107 /** 108 * If the border of the scrollpane is an instance of 109 * <code>MetalBorders.ScrollPaneBorder</code>, the client property 110 * <code>FREE_STANDING_PROP</code> of the scrollbars 111 * is set to false, otherwise it is set to true. 112 */ 113 private void updateScrollbarsFreeStanding() { 114 if (scrollpane == null) { 115 return; 116 } 117 Border border = scrollpane.getBorder(); 118 Object value; 119 120 if (border instanceof MetalBorders.ScrollPaneBorder) { 121 value = Boolean.FALSE; 122 } 123 else { 124 value = Boolean.TRUE; 125 } 126 JScrollBar sb = scrollpane.getHorizontalScrollBar(); 127 if (sb != null) { 128 sb.putClientProperty 129 (MetalScrollBarUI.FREE_STANDING_PROP, value); 130 } 131 sb = scrollpane.getVerticalScrollBar(); 132 if (sb != null) { 133 sb.putClientProperty 134 (MetalScrollBarUI.FREE_STANDING_PROP, value); 135 } 136 } 137 138 protected PropertyChangeListener createScrollBarSwapListener() { 139 return new PropertyChangeListener() { 140 public void propertyChange(PropertyChangeEvent e) { 141 String propertyName = e.getPropertyName(); 142 if (propertyName.equals("verticalScrollBar") || 143 propertyName.equals("horizontalScrollBar")) { 144 JScrollBar oldSB = (JScrollBar)e.getOldValue(); 145 if (oldSB != null) { 146 oldSB.putClientProperty( 147 MetalScrollBarUI.FREE_STANDING_PROP, null); 148 } 149 JScrollBar newSB = (JScrollBar)e.getNewValue(); 150 if (newSB != null) { 151 newSB.putClientProperty( 152 MetalScrollBarUI.FREE_STANDING_PROP, 153 Boolean.FALSE); 154 } 155 } 156 else if ("border".equals(propertyName)) { 157 updateScrollbarsFreeStanding(); 158 } 159 }}; 160 } 161 162 }