1 /* |
1 /* |
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
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 |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. Oracle designates this |
7 * published by the Free Software Foundation. Oracle designates this |
50 * @author Hans Muller |
50 * @author Hans Muller |
51 */ |
51 */ |
52 public class BasicScrollPaneUI |
52 public class BasicScrollPaneUI |
53 extends ScrollPaneUI implements ScrollPaneConstants |
53 extends ScrollPaneUI implements ScrollPaneConstants |
54 { |
54 { |
|
55 /** |
|
56 * The instance of {@code JScrollPane}. |
|
57 */ |
55 protected JScrollPane scrollpane; |
58 protected JScrollPane scrollpane; |
|
59 |
|
60 /** |
|
61 * {@code ChangeListener} installed on the vertical scrollbar. |
|
62 */ |
56 protected ChangeListener vsbChangeListener; |
63 protected ChangeListener vsbChangeListener; |
|
64 |
|
65 /** |
|
66 * {@code ChangeListener} installed on the horizontal scrollbar. |
|
67 */ |
57 protected ChangeListener hsbChangeListener; |
68 protected ChangeListener hsbChangeListener; |
|
69 |
|
70 /** |
|
71 * {@code ChangeListener} installed on the viewport. |
|
72 */ |
58 protected ChangeListener viewportChangeListener; |
73 protected ChangeListener viewportChangeListener; |
|
74 |
|
75 /** |
|
76 * {@code PropertyChangeListener} installed on the scroll pane. |
|
77 */ |
59 protected PropertyChangeListener spPropertyChangeListener; |
78 protected PropertyChangeListener spPropertyChangeListener; |
60 private MouseWheelListener mouseScrollListener; |
79 private MouseWheelListener mouseScrollListener; |
61 private int oldExtent = Integer.MIN_VALUE; |
80 private int oldExtent = Integer.MIN_VALUE; |
62 |
81 |
63 /** |
82 /** |
64 * PropertyChangeListener installed on the vertical scrollbar. |
83 * {@code PropertyChangeListener} installed on the vertical scrollbar. |
65 */ |
84 */ |
66 private PropertyChangeListener vsbPropertyChangeListener; |
85 private PropertyChangeListener vsbPropertyChangeListener; |
67 |
86 |
68 /** |
87 /** |
69 * PropertyChangeListener installed on the horizontal scrollbar. |
88 * {@code PropertyChangeListener} installed on the horizontal scrollbar. |
70 */ |
89 */ |
71 private PropertyChangeListener hsbPropertyChangeListener; |
90 private PropertyChangeListener hsbPropertyChangeListener; |
72 |
91 |
73 private Handler handler; |
92 private Handler handler; |
74 |
93 |
77 * before the value of "extent" was set in right-to-left component |
96 * before the value of "extent" was set in right-to-left component |
78 * orientation. |
97 * orientation. |
79 */ |
98 */ |
80 private boolean setValueCalled = false; |
99 private boolean setValueCalled = false; |
81 |
100 |
82 |
101 /** |
|
102 * Returns a new instance of {@code BasicScrollPaneUI}. |
|
103 * |
|
104 * @param x a component. |
|
105 * @return a new instance of {@code BasicScrollPaneUI} |
|
106 */ |
83 public static ComponentUI createUI(JComponent x) { |
107 public static ComponentUI createUI(JComponent x) { |
84 return new BasicScrollPaneUI(); |
108 return new BasicScrollPaneUI(); |
85 } |
109 } |
86 |
110 |
87 static void loadActionMap(LazyActionMap map) { |
111 static void loadActionMap(LazyActionMap map) { |
113 */ |
137 */ |
114 public Dimension getMaximumSize(JComponent c) { |
138 public Dimension getMaximumSize(JComponent c) { |
115 return new Dimension(Short.MAX_VALUE, Short.MAX_VALUE); |
139 return new Dimension(Short.MAX_VALUE, Short.MAX_VALUE); |
116 } |
140 } |
117 |
141 |
118 |
142 /** |
|
143 * Installs default properties. |
|
144 * |
|
145 * @param scrollpane an instance of {@code JScrollPane} |
|
146 */ |
119 protected void installDefaults(JScrollPane scrollpane) |
147 protected void installDefaults(JScrollPane scrollpane) |
120 { |
148 { |
121 LookAndFeel.installBorder(scrollpane, "ScrollPane.border"); |
149 LookAndFeel.installBorder(scrollpane, "ScrollPane.border"); |
122 LookAndFeel.installColorsAndFont(scrollpane, |
150 LookAndFeel.installColorsAndFont(scrollpane, |
123 "ScrollPane.background", |
151 "ScrollPane.background", |
130 scrollpane.setViewportBorder(vpBorder); |
158 scrollpane.setViewportBorder(vpBorder); |
131 } |
159 } |
132 LookAndFeel.installProperty(scrollpane, "opaque", Boolean.TRUE); |
160 LookAndFeel.installProperty(scrollpane, "opaque", Boolean.TRUE); |
133 } |
161 } |
134 |
162 |
135 |
163 /** |
|
164 * Registers listeners. |
|
165 * |
|
166 * @param c an instance of {@code JScrollPane} |
|
167 */ |
136 protected void installListeners(JScrollPane c) |
168 protected void installListeners(JScrollPane c) |
137 { |
169 { |
138 vsbChangeListener = createVSBChangeListener(); |
170 vsbChangeListener = createVSBChangeListener(); |
139 vsbPropertyChangeListener = createVSBPropertyChangeListener(); |
171 vsbPropertyChangeListener = createVSBPropertyChangeListener(); |
140 hsbChangeListener = createHSBChangeListener(); |
172 hsbChangeListener = createHSBChangeListener(); |
163 mouseScrollListener = createMouseWheelListener(); |
195 mouseScrollListener = createMouseWheelListener(); |
164 scrollpane.addMouseWheelListener(mouseScrollListener); |
196 scrollpane.addMouseWheelListener(mouseScrollListener); |
165 |
197 |
166 } |
198 } |
167 |
199 |
|
200 /** |
|
201 * Registers keyboard actions. |
|
202 * |
|
203 * @param c an instance of {@code JScrollPane} |
|
204 */ |
168 protected void installKeyboardActions(JScrollPane c) { |
205 protected void installKeyboardActions(JScrollPane c) { |
169 InputMap inputMap = getInputMap(JComponent. |
206 InputMap inputMap = getInputMap(JComponent. |
170 WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); |
207 WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); |
171 |
208 |
172 SwingUtilities.replaceUIInputMap(c, JComponent. |
209 SwingUtilities.replaceUIInputMap(c, JComponent. |
199 installDefaults(scrollpane); |
236 installDefaults(scrollpane); |
200 installListeners(scrollpane); |
237 installListeners(scrollpane); |
201 installKeyboardActions(scrollpane); |
238 installKeyboardActions(scrollpane); |
202 } |
239 } |
203 |
240 |
204 |
241 /** |
|
242 * Uninstalls default properties. |
|
243 * |
|
244 * @param c an instance of {@code JScrollPane} |
|
245 */ |
205 protected void uninstallDefaults(JScrollPane c) { |
246 protected void uninstallDefaults(JScrollPane c) { |
206 LookAndFeel.uninstallBorder(scrollpane); |
247 LookAndFeel.uninstallBorder(scrollpane); |
207 |
248 |
208 if (scrollpane.getViewportBorder() instanceof UIResource) { |
249 if (scrollpane.getViewportBorder() instanceof UIResource) { |
209 scrollpane.setViewportBorder(null); |
250 scrollpane.setViewportBorder(null); |
210 } |
251 } |
211 } |
252 } |
212 |
253 |
213 |
254 /** |
|
255 * Unregisters listeners. |
|
256 * |
|
257 * @param c a component |
|
258 */ |
214 protected void uninstallListeners(JComponent c) { |
259 protected void uninstallListeners(JComponent c) { |
215 JViewport viewport = scrollpane.getViewport(); |
260 JViewport viewport = scrollpane.getViewport(); |
216 JScrollBar vsb = scrollpane.getVerticalScrollBar(); |
261 JScrollBar vsb = scrollpane.getVerticalScrollBar(); |
217 JScrollBar hsb = scrollpane.getHorizontalScrollBar(); |
262 JScrollBar hsb = scrollpane.getHorizontalScrollBar(); |
218 |
263 |
240 spPropertyChangeListener = null; |
285 spPropertyChangeListener = null; |
241 mouseScrollListener = null; |
286 mouseScrollListener = null; |
242 handler = null; |
287 handler = null; |
243 } |
288 } |
244 |
289 |
245 |
290 /** |
|
291 * Unregisters keyboard actions. |
|
292 * |
|
293 * @param c an instance of {@code JScrollPane} |
|
294 */ |
246 protected void uninstallKeyboardActions(JScrollPane c) { |
295 protected void uninstallKeyboardActions(JScrollPane c) { |
247 SwingUtilities.replaceUIActionMap(c, null); |
296 SwingUtilities.replaceUIActionMap(c, null); |
248 SwingUtilities.replaceUIInputMap(c, JComponent. |
297 SwingUtilities.replaceUIInputMap(c, JComponent. |
249 WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, null); |
298 WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, null); |
250 } |
299 } |
262 handler = new Handler(); |
311 handler = new Handler(); |
263 } |
312 } |
264 return handler; |
313 return handler; |
265 } |
314 } |
266 |
315 |
|
316 /** |
|
317 * Synchronizes the {@code JScrollPane} with {@code Viewport}. |
|
318 */ |
267 protected void syncScrollPaneWithViewport() |
319 protected void syncScrollPaneWithViewport() |
268 { |
320 { |
269 JViewport viewport = scrollpane.getViewport(); |
321 JViewport viewport = scrollpane.getViewport(); |
270 JScrollBar vsb = scrollpane.getVerticalScrollBar(); |
322 JScrollBar vsb = scrollpane.getVerticalScrollBar(); |
271 JScrollBar hsb = scrollpane.getHorizontalScrollBar(); |
323 JScrollBar hsb = scrollpane.getHorizontalScrollBar(); |
563 */ |
630 */ |
564 protected MouseWheelListener createMouseWheelListener() { |
631 protected MouseWheelListener createMouseWheelListener() { |
565 return getHandler(); |
632 return getHandler(); |
566 } |
633 } |
567 |
634 |
|
635 /** |
|
636 * Updates a scroll bar display policy. |
|
637 * |
|
638 * @param e the property change event |
|
639 */ |
568 protected void updateScrollBarDisplayPolicy(PropertyChangeEvent e) { |
640 protected void updateScrollBarDisplayPolicy(PropertyChangeEvent e) { |
569 scrollpane.revalidate(); |
641 scrollpane.revalidate(); |
570 scrollpane.repaint(); |
642 scrollpane.repaint(); |
571 } |
643 } |
572 |
644 |
573 |
645 /** |
|
646 * Updates viewport. |
|
647 * |
|
648 * @param e the property change event |
|
649 */ |
574 protected void updateViewport(PropertyChangeEvent e) |
650 protected void updateViewport(PropertyChangeEvent e) |
575 { |
651 { |
576 JViewport oldViewport = (JViewport)(e.getOldValue()); |
652 JViewport oldViewport = (JViewport)(e.getOldValue()); |
577 JViewport newViewport = (JViewport)(e.getNewValue()); |
653 JViewport newViewport = (JViewport)(e.getNewValue()); |
578 |
654 |
597 newViewport.setViewPosition(p); |
673 newViewport.setViewPosition(p); |
598 newViewport.addChangeListener(viewportChangeListener); |
674 newViewport.addChangeListener(viewportChangeListener); |
599 } |
675 } |
600 } |
676 } |
601 |
677 |
602 |
678 /** |
|
679 * Updates row header. |
|
680 * |
|
681 * @param e the property change event |
|
682 */ |
603 protected void updateRowHeader(PropertyChangeEvent e) |
683 protected void updateRowHeader(PropertyChangeEvent e) |
604 { |
684 { |
605 JViewport newRowHead = (JViewport)(e.getNewValue()); |
685 JViewport newRowHead = (JViewport)(e.getNewValue()); |
606 if (newRowHead != null) { |
686 if (newRowHead != null) { |
607 JViewport viewport = scrollpane.getViewport(); |
687 JViewport viewport = scrollpane.getViewport(); |
609 p.y = (viewport != null) ? viewport.getViewPosition().y : 0; |
689 p.y = (viewport != null) ? viewport.getViewPosition().y : 0; |
610 newRowHead.setViewPosition(p); |
690 newRowHead.setViewPosition(p); |
611 } |
691 } |
612 } |
692 } |
613 |
693 |
614 |
694 /** |
|
695 * Updates column header. |
|
696 * |
|
697 * @param e the property change event |
|
698 */ |
615 protected void updateColumnHeader(PropertyChangeEvent e) |
699 protected void updateColumnHeader(PropertyChangeEvent e) |
616 { |
700 { |
617 JViewport newColHead = (JViewport)(e.getNewValue()); |
701 JViewport newColHead = (JViewport)(e.getNewValue()); |
618 if (newColHead != null) { |
702 if (newColHead != null) { |
619 JViewport viewport = scrollpane.getViewport(); |
703 JViewport viewport = scrollpane.getViewport(); |
677 } |
761 } |
678 |
762 |
679 |
763 |
680 |
764 |
681 /** |
765 /** |
682 * Creates an instance of PropertyChangeListener that's added to |
766 * Creates an instance of {@code PropertyChangeListener} that's added to |
683 * the JScrollPane by installUI(). Subclasses can override this method |
767 * the {@code JScrollPane} by {@code installUI()}. Subclasses can override |
684 * to return a custom PropertyChangeListener, e.g. |
768 * this method to return a custom {@code PropertyChangeListener}, e.g. |
685 * <pre> |
769 * <pre> |
686 * class MyScrollPaneUI extends BasicScrollPaneUI { |
770 * class MyScrollPaneUI extends BasicScrollPaneUI { |
687 * protected PropertyChangeListener <b>createPropertyChangeListener</b>() { |
771 * protected PropertyChangeListener <b>createPropertyChangeListener</b>() { |
688 * return new MyPropertyChangeListener(); |
772 * return new MyPropertyChangeListener(); |
689 * } |
773 * } |