001 /*
002 * Copyright 2002-2003 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.synth;
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.beans.PropertyChangeListener;
035 import java.beans.PropertyChangeEvent;
036
037 import java.awt.*;
038 import java.awt.event.*;
039 import sun.swing.plaf.synth.SynthUI;
040
041 /**
042 * Synth's ScrollPaneUI.
043 *
044 * @version 1.19, 05/05/07
045 * @author Scott Violet
046 */
047 class SynthScrollPaneUI extends BasicScrollPaneUI implements
048 PropertyChangeListener, SynthUI {
049 private SynthStyle style;
050
051 public static ComponentUI createUI(JComponent x) {
052 return new SynthScrollPaneUI();
053 }
054
055 public void update(Graphics g, JComponent c) {
056 SynthContext context = getContext(c);
057
058 SynthLookAndFeel.update(context, g);
059 context.getPainter().paintScrollPaneBackground(context, g, 0,
060 0, c.getWidth(), c.getHeight());
061 paint(context, g);
062 context.dispose();
063 }
064
065 public void paint(Graphics g, JComponent c) {
066 SynthContext context = getContext(c);
067
068 paint(context, g);
069 context.dispose();
070 }
071
072 protected void paint(SynthContext context, Graphics g) {
073 Border vpBorder = scrollpane.getViewportBorder();
074 if (vpBorder != null) {
075 Rectangle r = scrollpane.getViewportBorderBounds();
076 vpBorder.paintBorder(scrollpane, g, r.x, r.y, r.width,
077 r.height);
078 }
079 }
080
081 public void paintBorder(SynthContext context, Graphics g, int x,
082 int y, int w, int h) {
083 context.getPainter().paintScrollPaneBorder(context, g, x, y, w,
084 h);
085 }
086
087 protected void installDefaults(JScrollPane scrollpane) {
088 updateStyle(scrollpane);
089 }
090
091 private void updateStyle(JScrollPane c) {
092 SynthContext context = getContext(c, ENABLED);
093 SynthStyle oldStyle = style;
094
095 style = SynthLookAndFeel.updateStyle(context, this );
096 if (style != oldStyle) {
097 Border vpBorder = scrollpane.getViewportBorder();
098 if ((vpBorder == null) || (vpBorder instanceof UIResource)) {
099 scrollpane
100 .setViewportBorder(new ViewportBorder(context));
101 }
102 if (oldStyle != null) {
103 uninstallKeyboardActions(c);
104 installKeyboardActions(c);
105 }
106 }
107 context.dispose();
108 }
109
110 protected void installListeners(JScrollPane c) {
111 super .installListeners(c);
112 c.addPropertyChangeListener(this );
113 }
114
115 protected void uninstallDefaults(JScrollPane c) {
116 SynthContext context = getContext(c, ENABLED);
117
118 style.uninstallDefaults(context);
119 context.dispose();
120
121 if (scrollpane.getViewportBorder() instanceof UIResource) {
122 scrollpane.setViewportBorder(null);
123 }
124 }
125
126 protected void uninstallListeners(JComponent c) {
127 super .uninstallListeners(c);
128 c.removePropertyChangeListener(this );
129 }
130
131 public SynthContext getContext(JComponent c) {
132 return getContext(c, getComponentState(c));
133 }
134
135 private SynthContext getContext(JComponent c, int state) {
136 return SynthContext.getContext(SynthContext.class, c,
137 SynthLookAndFeel.getRegion(c), style, state);
138 }
139
140 private Region getRegion(JComponent c) {
141 return SynthLookAndFeel.getRegion(c);
142 }
143
144 private int getComponentState(JComponent c) {
145 return SynthLookAndFeel.getComponentState(c);
146 }
147
148 public void propertyChange(PropertyChangeEvent e) {
149 if (SynthLookAndFeel.shouldUpdateStyle(e)) {
150 updateStyle(scrollpane);
151 }
152 }
153
154 private class ViewportBorder extends AbstractBorder implements
155 UIResource {
156 private Insets insets;
157
158 ViewportBorder(SynthContext context) {
159 this .insets = (Insets) context.getStyle().get(context,
160 "ScrollPane.viewportBorderInsets");
161 if (this .insets == null) {
162 this .insets = SynthLookAndFeel.EMPTY_UIRESOURCE_INSETS;
163 }
164 }
165
166 public void paintBorder(Component c, Graphics g, int x, int y,
167 int width, int height) {
168 JComponent jc = (JComponent) c;
169 SynthContext context = getContext(jc);
170 SynthStyle style = context.getStyle();
171 if (style == null) {
172 assert false : "SynthBorder is being used outside after the "
173 + " UI has been uninstalled";
174 return;
175 }
176 context.getPainter().paintViewportBorder(context, g, x, y,
177 width, height);
178 context.dispose();
179 }
180
181 public Insets getBorderInsets(Component c) {
182 return getBorderInsets(c, null);
183 }
184
185 public Insets getBorderInsets(Component c, Insets insets) {
186 if (insets == null) {
187 return new Insets(this .insets.top, this .insets.left,
188 this .insets.bottom, this .insets.right);
189 }
190 insets.top = this .insets.top;
191 insets.bottom = this .insets.bottom;
192 insets.left = this .insets.left;
193 insets.right = this .insets.left;
194 return insets;
195 }
196
197 public boolean isBorderOpaque() {
198 return false;
199 }
200 }
201 }
|