1:
37:
38:
39: package ;
40:
41: import ;
42: import ;
43: import ;
44: import ;
45: import ;
46: import ;
47: import ;
48:
49: import ;
50: import ;
51: import ;
52: import ;
53: import ;
54: import ;
55: import ;
56: import ;
57: import ;
58: import ;
59: import ;
60:
61: public class BasicScrollPaneUI extends ScrollPaneUI
62: implements ScrollPaneConstants
63: {
64:
65:
71: public class HSBChangeListener implements ChangeListener
72: {
73:
74:
80: public void stateChanged(ChangeEvent event)
81: {
82: JScrollBar hsb = scrollpane.getHorizontalScrollBar();
83: JViewport vp = scrollpane.getViewport();
84: Point viewPosition = vp.getViewPosition();
85: int xpos = hsb.getValue();
86:
87: if (xpos != viewPosition.x)
88: {
89: viewPosition.x = xpos;
90: vp.setViewPosition(viewPosition);
91: }
92:
93: viewPosition.y = 0;
94: JViewport columnHeader = scrollpane.getColumnHeader();
95: if (columnHeader != null
96: && !columnHeader.getViewPosition().equals(viewPosition))
97: columnHeader.setViewPosition(viewPosition);
98: }
99:
100: }
101:
102:
108: public class VSBChangeListener implements ChangeListener
109: {
110:
111:
117: public void stateChanged(ChangeEvent event)
118: {
119: JScrollBar vsb = scrollpane.getVerticalScrollBar();
120: JViewport vp = scrollpane.getViewport();
121: Point viewPosition = vp.getViewPosition();
122: int ypos = vsb.getValue();
123: if (ypos != viewPosition.y)
124: {
125: viewPosition.y = ypos;
126: vp.setViewPosition(viewPosition);
127: }
128:
129: viewPosition.x = 0;
130: JViewport rowHeader = scrollpane.getRowHeader();
131: if (rowHeader != null
132: && !rowHeader.getViewPosition().equals(viewPosition))
133: rowHeader.setViewPosition(viewPosition);
134: }
135:
136: }
137:
138:
144: public class ViewportChangeHandler implements ChangeListener
145: {
146:
147:
155: public void stateChanged(ChangeEvent event)
156: {
157: JViewport vp = scrollpane.getViewport();
158: JScrollBar hsb = scrollpane.getHorizontalScrollBar();
159: JScrollBar vsb = scrollpane.getVerticalScrollBar();
160: syncScrollPaneWithViewport();
161: }
162:
163: }
164:
165:
171: public class PropertyChangeHandler implements PropertyChangeListener
172: {
173:
174:
186: public void propertyChange(PropertyChangeEvent e)
187: {
188: String propName = e.getPropertyName();
189: if (propName.equals("viewport"))
190: updateViewport(e);
191: else if (propName.equals("rowHeader"))
192: updateRowHeader(e);
193: else if (propName.equals("columnHeader"))
194: updateColumnHeader(e);
195: else if (propName.equals("horizontalScrollBarPolicy")
196: || e.getPropertyName().equals("verticalScrollBarPolicy"))
197: updateScrollBarDisplayPolicy(e);
198: else if (propName.equals("verticalScrollBar"))
199: {
200: JScrollBar oldSb = (JScrollBar) e.getOldValue();
201: oldSb.getModel().removeChangeListener(vsbChangeListener);
202: JScrollBar newSb = (JScrollBar) e.getNewValue();
203: newSb.getModel().addChangeListener(vsbChangeListener);
204: }
205: else if (propName.equals("horizontalScrollBar"))
206: {
207: JScrollBar oldSb = (JScrollBar) e.getOldValue();
208: oldSb.getModel().removeChangeListener(hsbChangeListener);
209: JScrollBar newSb = (JScrollBar) e.getNewValue();
210: newSb.getModel().addChangeListener(hsbChangeListener);
211: }
212: }
213:
214: }
215:
216:
223: protected class MouseWheelHandler implements MouseWheelListener
224: {
225:
226:
231: public void mouseWheelMoved(MouseWheelEvent event)
232: {
233:
234: }
235:
236: }
237:
238:
239: protected JScrollPane scrollpane;
240:
241:
244: protected ChangeListener hsbChangeListener;
245:
246:
249: protected ChangeListener vsbChangeListener;
250:
251:
254: protected ChangeListener viewportChangeListener;
255:
256:
259: protected PropertyChangeListener spPropertyChangeListener;
260:
261:
264: MouseWheelListener mouseWheelListener;
265:
266: public static ComponentUI createUI(final JComponent c)
267: {
268: return new BasicScrollPaneUI();
269: }
270:
271: protected void installDefaults(JScrollPane p)
272: {
273: scrollpane = p;
274: LookAndFeel.installColorsAndFont(p, "ScrollPane.background",
275: "ScrollPane.foreground",
276: "ScrollPane.font");
277: LookAndFeel.installBorder(p, "ScrollPane.border");
278: p.setOpaque(true);
279: }
280:
281: protected void uninstallDefaults(JScrollPane p)
282: {
283: p.setForeground(null);
284: p.setBackground(null);
285: p.setFont(null);
286: p.setBorder(null);
287: scrollpane = null;
288: }
289:
290: public void installUI(final JComponent c)
291: {
292: super.installUI(c);
293: installDefaults((JScrollPane) c);
294: installListeners((JScrollPane) c);
295: installKeyboardActions((JScrollPane) c);
296: }
297:
298:
303: protected void installListeners(JScrollPane sp)
304: {
305: if (spPropertyChangeListener == null)
306: spPropertyChangeListener = createPropertyChangeListener();
307: sp.addPropertyChangeListener(spPropertyChangeListener);
308:
309: if (hsbChangeListener == null)
310: hsbChangeListener = createHSBChangeListener();
311: sp.getHorizontalScrollBar().getModel().addChangeListener(hsbChangeListener);
312:
313: if (vsbChangeListener == null)
314: vsbChangeListener = createVSBChangeListener();
315: sp.getVerticalScrollBar().getModel().addChangeListener(vsbChangeListener);
316:
317: if (viewportChangeListener == null)
318: viewportChangeListener = createViewportChangeListener();
319: sp.getViewport().addChangeListener(viewportChangeListener);
320:
321: if (mouseWheelListener == null)
322: mouseWheelListener = createMouseWheelListener();
323: sp.addMouseWheelListener(mouseWheelListener);
324: }
325:
326:
333: protected void installKeyboardActions(JScrollPane sp)
334: {
335:
336:
337: }
338:
339:
344: protected ChangeListener createHSBChangeListener()
345: {
346: return new HSBChangeListener();
347: }
348:
349:
354: protected ChangeListener createVSBChangeListener()
355: {
356: return new VSBChangeListener();
357: }
358:
359:
364: protected ChangeListener createViewportChangeListener()
365: {
366: return new ViewportChangeHandler();
367: }
368:
369:
374: protected PropertyChangeListener createPropertyChangeListener()
375: {
376: return new PropertyChangeHandler();
377: }
378:
379:
384: protected MouseWheelListener createMouseWheelListener()
385: {
386: return new MouseWheelHandler();
387: }
388:
389: public void uninstallUI(final JComponent c)
390: {
391: super.uninstallUI(c);
392: this.uninstallDefaults((JScrollPane)c);
393: uninstallListeners((JScrollPane) c);
394: installKeyboardActions((JScrollPane) c);
395: }
396:
397:
403: protected void uninstallListeners(JComponent c)
404: {
405: JScrollPane sp = (JScrollPane) c;
406: sp.removePropertyChangeListener(spPropertyChangeListener);
407: sp.getHorizontalScrollBar().getModel()
408: .removeChangeListener(hsbChangeListener);
409: sp.getVerticalScrollBar().getModel()
410: .removeChangeListener(vsbChangeListener);
411: sp.getViewport().removeChangeListener(viewportChangeListener);
412: sp.removeMouseWheelListener(mouseWheelListener);
413: }
414:
415:
422: protected void uninstallKeyboardActions(JScrollPane sp)
423: {
424:
425:
426: }
427:
428: public Dimension getMinimumSize(JComponent c)
429: {
430: JScrollPane p = (JScrollPane ) c;
431: ScrollPaneLayout sl = (ScrollPaneLayout) p.getLayout();
432: return sl.minimumLayoutSize(c);
433: }
434:
435: public void paint(Graphics g, JComponent c)
436: {
437:
438:
439: }
440:
441:
444: protected void syncScrollPaneWithViewport()
445: {
446: JViewport vp = scrollpane.getViewport();
447:
448:
449: JScrollBar hsb = scrollpane.getHorizontalScrollBar();
450: hsb.setMaximum(vp.getViewSize().width);
451: hsb.setValue(vp.getViewPosition().x);
452: hsb.setVisibleAmount(vp.getExtentSize().width);
453:
454:
455: JScrollBar vsb = scrollpane.getVerticalScrollBar();
456: vsb.setMaximum(vp.getViewSize().height);
457: vsb.setValue(vp.getViewPosition().y);
458: vsb.setVisibleAmount(vp.getExtentSize().height);
459: }
460:
461:
467: protected void updateColumnHeader(PropertyChangeEvent ev)
468: {
469:
470: }
471:
472:
478: protected void updateRowHeader(PropertyChangeEvent ev)
479: {
480:
481: }
482:
483:
489: protected void updateScrollBarDisplayPolicy(PropertyChangeEvent ev)
490: {
491:
492: }
493:
494:
503: protected void updateViewport(PropertyChangeEvent ev)
504: {
505: JViewport oldViewport = (JViewport) ev.getOldValue();
506: oldViewport.removeChangeListener(viewportChangeListener);
507: JViewport newViewport = (JViewport) ev.getNewValue();
508: newViewport.addChangeListener(viewportChangeListener);
509: syncScrollPaneWithViewport();
510: }
511: }
512:
513:
514:
515:
516:
517:
518:
519:
520:
521:
522: