001 /*
002 * Copyright 1998-2004 Sun Microsystems, Inc. All Rights Reserved.
003 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004 *
005 * This code is free software; you can redistribute it and/or modify it
006 * under the terms of the GNU General Public License version 2 only, as
007 * published by the Free Software Foundation. Sun designates this
008 * particular file as subject to the "Classpath" exception as provided
009 * by Sun in the LICENSE file that accompanied this code.
010 *
011 * This code is distributed in the hope that it will be useful, but WITHOUT
012 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
013 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
014 * version 2 for more details (a copy is included in the LICENSE file that
015 * accompanied this code).
016 *
017 * You should have received a copy of the GNU General Public License version
018 * 2 along with this work; if not, write to the Free Software Foundation,
019 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
020 *
021 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
022 * CA 95054 USA or visit www.sun.com if you need additional information or
023 * have any questions.
024 */
025
026 package javax.swing.plaf.metal;
027
028 import javax.swing.*;
029 import javax.swing.event.*;
030 import javax.swing.border.*;
031 import javax.swing.plaf.*;
032 import javax.swing.plaf.basic.*;
033
034 import java.awt.*;
035 import java.beans.*;
036 import java.awt.event.*;
037
038 /**
039 * A Metal L&F implementation of ScrollPaneUI.
040 * <p>
041 * <strong>Warning:</strong>
042 * Serialized objects of this class will not be compatible with
043 * future Swing releases. The current serialization support is
044 * appropriate for short term storage or RMI between applications running
045 * the same version of Swing. As of 1.4, support for long term storage
046 * of all JavaBeans<sup><font size="-2">TM</font></sup>
047 * has been added to the <code>java.beans</code> package.
048 * Please see {@link java.beans.XMLEncoder}.
049 *
050 * @version 1.27 05/05/07
051 * @author Steve Wilson
052 */
053 public class MetalScrollPaneUI extends BasicScrollPaneUI {
054
055 private PropertyChangeListener scrollBarSwapListener;
056
057 public static ComponentUI createUI(JComponent x) {
058 return new MetalScrollPaneUI();
059 }
060
061 public void installUI(JComponent c) {
062
063 super .installUI(c);
064
065 JScrollPane sp = (JScrollPane) c;
066 updateScrollbarsFreeStanding();
067 }
068
069 public void uninstallUI(JComponent c) {
070 super .uninstallUI(c);
071
072 JScrollPane sp = (JScrollPane) c;
073 JScrollBar hsb = sp.getHorizontalScrollBar();
074 JScrollBar vsb = sp.getVerticalScrollBar();
075 if (hsb != null) {
076 hsb.putClientProperty(MetalScrollBarUI.FREE_STANDING_PROP,
077 null);
078 }
079 if (vsb != null) {
080 vsb.putClientProperty(MetalScrollBarUI.FREE_STANDING_PROP,
081 null);
082 }
083 }
084
085 public void installListeners(JScrollPane scrollPane) {
086 super .installListeners(scrollPane);
087 scrollBarSwapListener = createScrollBarSwapListener();
088 scrollPane.addPropertyChangeListener(scrollBarSwapListener);
089 }
090
091 public void uninstallListeners(JScrollPane scrollPane) {
092 super .uninstallListeners(scrollPane);
093
094 scrollPane.removePropertyChangeListener(scrollBarSwapListener);
095 }
096
097 /**
098 * If the border of the scrollpane is an instance of
099 * <code>MetalBorders.ScrollPaneBorder</code>, the client property
100 * <code>FREE_STANDING_PROP</code> of the scrollbars
101 * is set to false, otherwise it is set to true.
102 */
103 private void updateScrollbarsFreeStanding() {
104 if (scrollpane == null) {
105 return;
106 }
107 Border border = scrollpane.getBorder();
108 Object value;
109
110 if (border instanceof MetalBorders.ScrollPaneBorder) {
111 value = Boolean.FALSE;
112 } else {
113 value = Boolean.TRUE;
114 }
115 JScrollBar sb = scrollpane.getHorizontalScrollBar();
116 if (sb != null) {
117 sb.putClientProperty(MetalScrollBarUI.FREE_STANDING_PROP,
118 value);
119 }
120 sb = scrollpane.getVerticalScrollBar();
121 if (sb != null) {
122 sb.putClientProperty(MetalScrollBarUI.FREE_STANDING_PROP,
123 value);
124 }
125 }
126
127 protected PropertyChangeListener createScrollBarSwapListener() {
128 return new PropertyChangeListener() {
129 public void propertyChange(PropertyChangeEvent e) {
130 String propertyName = e.getPropertyName();
131 if (propertyName.equals("verticalScrollBar")
132 || propertyName.equals("horizontalScrollBar")) {
133 JScrollBar oldSB = (JScrollBar) e.getOldValue();
134 if (oldSB != null) {
135 oldSB.putClientProperty(
136 MetalScrollBarUI.FREE_STANDING_PROP,
137 null);
138 }
139 JScrollBar newSB = (JScrollBar) e.getNewValue();
140 if (newSB != null) {
141 newSB.putClientProperty(
142 MetalScrollBarUI.FREE_STANDING_PROP,
143 Boolean.FALSE);
144 }
145 } else if ("border".equals(propertyName)) {
146 updateScrollbarsFreeStanding();
147 }
148 }
149 };
150 }
151
152 }
|