1 /* 2 * Copyright (c) 1998, 2014, 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™ 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 @SuppressWarnings("serial") // Same-version serialization only 54 public class MetalScrollPaneUI extends BasicScrollPaneUI 55 { 56 57 private PropertyChangeListener scrollBarSwapListener; 58 59 public static ComponentUI createUI(JComponent x) { 60 return new MetalScrollPaneUI(); 61 } 62 63 public void installUI(JComponent c) { 64 65 super.installUI(c); 66 67 JScrollPane sp = (JScrollPane)c; 68 updateScrollbarsFreeStanding(); 69 } 70 71 public void uninstallUI(JComponent c) { 72 super.uninstallUI(c); 73 74 JScrollPane sp = (JScrollPane)c; 75 JScrollBar hsb = sp.getHorizontalScrollBar(); 76 JScrollBar vsb = sp.getVerticalScrollBar(); 77 if (hsb != null) { 78 hsb.putClientProperty( MetalScrollBarUI.FREE_STANDING_PROP, null); 79 } 80 if (vsb != null) { 81 vsb.putClientProperty( MetalScrollBarUI.FREE_STANDING_PROP, null); 82 } 83 } 84 85 public void installListeners(JScrollPane scrollPane) { 86 super.installListeners(scrollPane); 87 scrollBarSwapListener = createScrollBarSwapListener(); 88 scrollPane.addPropertyChangeListener(scrollBarSwapListener); 89 } 90 91 /** 92 * {@inheritDoc} 93 */ 94 protected void uninstallListeners(JComponent c) { 95 super.uninstallListeners(c); 96 c.removePropertyChangeListener(scrollBarSwapListener); 97 } 98 99 /** 100 * @deprecated - Replaced by {@link #uninstallListeners(JComponent)} 101 */ 102 @Deprecated 103 public void uninstallListeners(JScrollPane scrollPane) { 104 super.uninstallListeners(scrollPane); 105 scrollPane.removePropertyChangeListener(scrollBarSwapListener); 106 } 107 108 /** 109 * If the border of the scrollpane is an instance of 110 * <code>MetalBorders.ScrollPaneBorder</code>, the client property 111 * <code>FREE_STANDING_PROP</code> of the scrollbars 112 * is set to false, otherwise it is set to true. 113 */ 114 private void updateScrollbarsFreeStanding() { 115 if (scrollpane == null) { 116 return; 117 } 118 Border border = scrollpane.getBorder(); 119 Object value; 120 121 if (border instanceof MetalBorders.ScrollPaneBorder) { 122 value = Boolean.FALSE; 123 } 124 else { 125 value = Boolean.TRUE; 126 } 127 JScrollBar sb = scrollpane.getHorizontalScrollBar(); 128 if (sb != null) { 129 sb.putClientProperty 130 (MetalScrollBarUI.FREE_STANDING_PROP, value); 131 } 132 sb = scrollpane.getVerticalScrollBar(); 133 if (sb != null) { 134 sb.putClientProperty 135 (MetalScrollBarUI.FREE_STANDING_PROP, value); 136 } 137 } 138 139 protected PropertyChangeListener createScrollBarSwapListener() { 140 return new PropertyChangeListener() { 141 public void propertyChange(PropertyChangeEvent e) { 142 String propertyName = e.getPropertyName(); 143 if (propertyName.equals("verticalScrollBar") || 144 propertyName.equals("horizontalScrollBar")) { 145 JScrollBar oldSB = (JScrollBar)e.getOldValue(); 146 if (oldSB != null) { 147 oldSB.putClientProperty( 148 MetalScrollBarUI.FREE_STANDING_PROP, null); 149 } 150 JScrollBar newSB = (JScrollBar)e.getNewValue(); 151 if (newSB != null) { 152 newSB.putClientProperty( 153 MetalScrollBarUI.FREE_STANDING_PROP, 154 Boolean.FALSE); 155 } 156 } 157 else if ("border".equals(propertyName)) { 158 updateScrollbarsFreeStanding(); 159 } 160 }}; 161 } 162 163 }