1:
37:
38:
39: package ;
40:
41: import ;
42: import ;
43: import ;
44: import ;
45: import ;
46: import ;
47: import ;
48: import ;
49: import ;
50: import ;
51: import ;
52: import ;
53: import ;
54: import ;
55: import ;
56:
57: import ;
58: import ;
59: import ;
60: import ;
61: import ;
62: import ;
63: import ;
64: import ;
65: import ;
66: import ;
67: import ;
68: import ;
69: import ;
70: import ;
71: import ;
72: import ;
73: import ;
74: import ;
75:
76:
79: public class BasicScrollBarUI extends ScrollBarUI implements LayoutManager,
80: SwingConstants
81: {
82:
86: protected class ArrowButtonListener extends MouseAdapter
87: {
88:
89:
95: public void mousePressed(MouseEvent e)
96: {
97: scrollTimer.stop();
98: scrollListener.setScrollByBlock(false);
99: if (e.getSource() == incrButton)
100: scrollListener.setDirection(POSITIVE_SCROLL);
101: else if (e.getSource() == decrButton)
102: scrollListener.setDirection(NEGATIVE_SCROLL);
103: scrollTimer.setDelay(100);
104: scrollTimer.start();
105: }
106:
107:
112: public void mouseReleased(MouseEvent e)
113: {
114: scrollTimer.stop();
115: scrollTimer.setDelay(300);
116: if (e.getSource() == incrButton)
117: scrollByUnit(POSITIVE_SCROLL);
118: else if (e.getSource() == decrButton)
119: scrollByUnit(NEGATIVE_SCROLL);
120: }
121: }
122:
123:
126: protected class ModelListener implements ChangeListener
127: {
128:
133: public void stateChanged(ChangeEvent e)
134: {
135: calculatePreferredSize();
136: updateThumbRect();
137: scrollbar.repaint();
138: }
139: }
140:
141:
144: public class PropertyChangeHandler implements PropertyChangeListener
145: {
146:
151: public void propertyChange(PropertyChangeEvent e)
152: {
153: if (e.getPropertyName().equals("model"))
154: {
155: ((BoundedRangeModel) e.getOldValue()).removeChangeListener(modelListener);
156: scrollbar.getModel().addChangeListener(modelListener);
157: updateThumbRect();
158: }
159: else if (e.getPropertyName().equals("orientation"))
160: {
161: uninstallListeners();
162: uninstallComponents();
163: uninstallDefaults();
164: installDefaults();
165: installComponents();
166: installListeners();
167: }
168: else if (e.getPropertyName().equals("enabled"))
169: {
170: Boolean b = (Boolean) e.getNewValue();
171: if (incrButton != null)
172: incrButton.setEnabled(b.booleanValue());
173: if (decrButton != null)
174: decrButton.setEnabled(b.booleanValue());
175: }
176: }
177: }
178:
179:
183: protected class ScrollListener implements ActionListener
184: {
185:
186: private transient int direction;
187:
188:
189: private transient boolean block;
190:
191:
195: public ScrollListener()
196: {
197: direction = POSITIVE_SCROLL;
198: block = true;
199: }
200:
201:
208: public ScrollListener(int dir, boolean block)
209: {
210: direction = dir;
211: this.block = block;
212: }
213:
214:
219: public void setDirection(int direction)
220: {
221: this.direction = direction;
222: }
223:
224:
229: public void setScrollByBlock(boolean block)
230: {
231: this.block = block;
232: }
233:
234:
239: public void actionPerformed(ActionEvent e)
240: {
241: if (block)
242: {
243:
244:
245:
246: if (!trackListener.shouldScroll(direction))
247: {
248: trackHighlight = NO_HIGHLIGHT;
249: scrollbar.repaint();
250: return;
251: }
252: scrollByBlock(direction);
253: }
254: else
255: scrollByUnit(direction);
256: }
257: }
258:
259:
262: protected class TrackListener extends MouseAdapter
263: implements MouseMotionListener
264: {
265:
266: protected int currentMouseX;
267:
268:
269: protected int currentMouseY;
270:
271:
275: protected int offset;
276:
277:
282: public void mouseDragged(MouseEvent e)
283: {
284: currentMouseX = e.getX();
285: currentMouseY = e.getY();
286: if (scrollbar.getValueIsAdjusting())
287: {
288: int value;
289: if (scrollbar.getOrientation() == SwingConstants.HORIZONTAL)
290: value = valueForXPosition(currentMouseX) - offset;
291: else
292: value = valueForYPosition(currentMouseY) - offset;
293:
294: scrollbar.setValue(value);
295: }
296: }
297:
298:
303: public void mouseMoved(MouseEvent e)
304: {
305: if (thumbRect.contains(e.getPoint()))
306: thumbRollover = true;
307: else
308: thumbRollover = false;
309: }
310:
311:
317: public void mousePressed(MouseEvent e)
318: {
319: currentMouseX = e.getX();
320: currentMouseY = e.getY();
321:
322: int value;
323: if (scrollbar.getOrientation() == SwingConstants.HORIZONTAL)
324: value = valueForXPosition(currentMouseX);
325: else
326: value = valueForYPosition(currentMouseY);
327:
328: if (! thumbRect.contains(e.getPoint()))
329: {
330: scrollTimer.stop();
331: scrollListener.setScrollByBlock(true);
332: if (value > scrollbar.getValue())
333: {
334: trackHighlight = INCREASE_HIGHLIGHT;
335: scrollListener.setDirection(POSITIVE_SCROLL);
336: }
337: else
338: {
339: trackHighlight = DECREASE_HIGHLIGHT;
340: scrollListener.setDirection(NEGATIVE_SCROLL);
341: }
342: scrollTimer.setDelay(100);
343: scrollTimer.start();
344: }
345: else
346: {
347:
348:
349:
350:
351:
352:
353:
354: scrollListener.setScrollByBlock(false);
355: scrollbar.setValueIsAdjusting(true);
356: offset = value - scrollbar.getValue();
357: }
358: scrollbar.repaint();
359: }
360:
361:
367: public void mouseReleased(MouseEvent e)
368: {
369: scrollTimer.stop();
370: scrollTimer.setDelay(300);
371: currentMouseX = e.getX();
372: currentMouseY = e.getY();
373:
374: if (shouldScroll(POSITIVE_SCROLL))
375: scrollByBlock(POSITIVE_SCROLL);
376: else if (shouldScroll(NEGATIVE_SCROLL))
377: scrollByBlock(NEGATIVE_SCROLL);
378:
379: trackHighlight = NO_HIGHLIGHT;
380: scrollListener.setScrollByBlock(false);
381: scrollbar.setValueIsAdjusting(true);
382: scrollbar.repaint();
383: }
384:
385:
393: boolean shouldScroll(int direction)
394: {
395: int value;
396: if (scrollbar.getOrientation() == HORIZONTAL)
397: value = valueForXPosition(currentMouseX);
398: else
399: value = valueForYPosition(currentMouseY);
400:
401: if (thumbRect.contains(currentMouseX, currentMouseY))
402: return false;
403:
404: if (direction == POSITIVE_SCROLL)
405: return value > scrollbar.getValue();
406: else
407: return value < scrollbar.getValue();
408: }
409: }
410:
411:
412: protected ArrowButtonListener buttonListener;
413:
414:
415: protected ModelListener modelListener;
416:
417:
418: protected PropertyChangeListener propertyChangeListener;
419:
420:
421: protected ScrollListener scrollListener;
422:
423:
424: protected TrackListener trackListener;
425:
426:
427: protected JButton decrButton;
428:
429:
430: protected JButton incrButton;
431:
432:
433: protected Dimension maximumThumbSize;
434:
435:
436: protected Dimension minimumThumbSize;
437:
438:
439: protected Color thumbColor;
440:
441:
442: protected Color thumbDarkShadowColor;
443:
444:
445: protected Color thumbHighlightColor;
446:
447:
448: protected Color thumbLightShadowColor;
449:
450:
451: protected Color trackHighlightColor;
452:
453:
454: protected Color trackColor;
455:
456:
457: protected Rectangle trackRect;
458:
459:
460: protected Rectangle thumbRect;
461:
462:
463: protected static final int DECREASE_HIGHLIGHT = 1;
464:
465:
466: protected static final int INCREASE_HIGHLIGHT = 2;
467:
468:
469: protected static final int NO_HIGHLIGHT = 0;
470:
471:
472: private static final int POSITIVE_SCROLL = 1;
473:
474:
475: private static final int NEGATIVE_SCROLL = -1;
476:
477:
478: private transient Dimension preferredSize;
479:
480:
481: protected int trackHighlight;
482:
483:
484: protected boolean isDragging;
485:
486:
487: protected Timer scrollTimer;
488:
489:
490: protected JScrollBar scrollbar;
491:
492:
493: boolean thumbRollover;
494:
495:
501: public void addLayoutComponent(String name, Component child)
502: {
503:
504:
505: }
506:
507:
511: protected void configureScrollBarColors()
512: {
513: trackColor = UIManager.getColor("ScrollBar.track");
514: trackHighlightColor = UIManager.getColor("ScrollBar.trackHighlight");
515: thumbColor = UIManager.getColor("ScrollBar.thumb");
516: thumbHighlightColor = UIManager.getColor("ScrollBar.thumbHighlight");
517: thumbDarkShadowColor = UIManager.getColor("ScrollBar.thumbDarkShadow");
518: thumbLightShadowColor = UIManager.getColor("ScrollBar.thumbShadow");
519: }
520:
521:
526: protected ArrowButtonListener createArrowButtonListener()
527: {
528: return new ArrowButtonListener();
529: }
530:
531:
539: protected JButton createIncreaseButton(int orientation)
540: {
541: return new BasicArrowButton(orientation);
542: }
543:
544:
552: protected JButton createDecreaseButton(int orientation)
553: {
554: return new BasicArrowButton(orientation);
555: }
556:
557:
562: protected ModelListener createModelListener()
563: {
564: return new ModelListener();
565: }
566:
567:
572: protected PropertyChangeListener createPropertyChangeListener()
573: {
574: return new PropertyChangeHandler();
575: }
576:
577:
582: protected ScrollListener createScrollListener()
583: {
584: return new ScrollListener();
585: }
586:
587:
592: protected TrackListener createTrackListener()
593: {
594: return new TrackListener();
595: }
596:
597:
604: public static ComponentUI createUI(JComponent c)
605: {
606: return new BasicScrollBarUI();
607: }
608:
609:
616: public Dimension getMaximumSize(JComponent c)
617: {
618: return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE);
619: }
620:
621:
626: protected Dimension getMaximumThumbSize()
627: {
628: return maximumThumbSize;
629: }
630:
631:
638: public Dimension getMinimumSize(JComponent c)
639: {
640: return getPreferredSize(c);
641: }
642:
643:
648: protected Dimension getMinimumThumbSize()
649: {
650: return minimumThumbSize;
651: }
652:
653:
658: void calculatePreferredSize()
659: {
660: int height;
661: int width;
662: height = width = 0;
663:
664: if (scrollbar.getOrientation() == SwingConstants.HORIZONTAL)
665: {
666: width += incrButton.getPreferredSize().getWidth();
667: width += decrButton.getPreferredSize().getWidth();
668: width += 16;
669: height = UIManager.getInt("ScrollBar.width");
670: }
671: else
672: {
673: height += incrButton.getPreferredSize().getHeight();
674: height += decrButton.getPreferredSize().getHeight();
675: height += 16;
676: width = UIManager.getInt("ScrollBar.width");
677: }
678:
679: Insets insets = scrollbar.getInsets();
680:
681: height += insets.top + insets.bottom;
682: width += insets.left + insets.right;
683:
684: preferredSize = new Dimension(width, height);
685: }
686:
687:
698: public Dimension getPreferredSize(JComponent c)
699: {
700: calculatePreferredSize();
701: return preferredSize;
702: }
703:
704:
710: protected Rectangle getThumbBounds()
711: {
712: return thumbRect;
713: }
714:
715:
721: protected Rectangle getTrackBounds()
722: {
723: return trackRect;
724: }
725:
726:
730: protected void installComponents()
731: {
732: int orientation = scrollbar.getOrientation();
733: switch (orientation)
734: {
735: case JScrollBar.HORIZONTAL:
736: incrButton = createIncreaseButton(EAST);
737: decrButton = createDecreaseButton(WEST);
738: break;
739: default:
740: incrButton = createIncreaseButton(SOUTH);
741: decrButton = createDecreaseButton(NORTH);
742: break;
743: }
744:
745: if (incrButton != null)
746: scrollbar.add(incrButton);
747: if (decrButton != null)
748: scrollbar.add(decrButton);
749: }
750:
751:
755: protected void installDefaults()
756: {
757: LookAndFeel.installColors(scrollbar, "ScrollBar.background",
758: "ScrollBar.foreground");
759: LookAndFeel.installBorder(scrollbar, "ScrollBar.border");
760: scrollbar.setOpaque(true);
761: scrollbar.setLayout(this);
762:
763: configureScrollBarColors();
764:
765: maximumThumbSize = UIManager.getDimension("ScrollBar.maximumThumbSize");
766: minimumThumbSize = UIManager.getDimension("ScrollBar.minimumThumbSize");
767: }
768:
769:
774: protected void installKeyboardActions()
775: {
776: InputMap keyMap = getInputMap(
777: JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
778: SwingUtilities.replaceUIInputMap(scrollbar,
779: JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, keyMap);
780: ActionMap map = getActionMap();
781: SwingUtilities.replaceUIActionMap(scrollbar, map);
782: }
783:
784:
788: protected void uninstallKeyboardActions()
789: {
790: SwingUtilities.replaceUIActionMap(scrollbar, null);
791: SwingUtilities.replaceUIInputMap(scrollbar,
792: JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, null);
793: }
794:
795: InputMap getInputMap(int condition)
796: {
797: if (condition == JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
798: return (InputMap) UIManager.get("ScrollBar.focusInputMap");
799: return null;
800: }
801:
802:
809: ActionMap getActionMap()
810: {
811: ActionMap map = (ActionMap) UIManager.get("ScrollBar.actionMap");
812:
813: if (map == null)
814: {
815: map = createActionMap();
816: if (map != null)
817: UIManager.put("ScrollBar.actionMap", map);
818: }
819: return map;
820: }
821:
822:
832: ActionMap createActionMap()
833: {
834: ActionMap map = new ActionMapUIResource();
835: map.put("positiveUnitIncrement",
836: new AbstractAction("positiveUnitIncrement") {
837: public void actionPerformed(ActionEvent event)
838: {
839: JScrollBar sb = (JScrollBar) event.getSource();
840: if (sb.isVisible())
841: {
842: int delta = sb.getUnitIncrement(1);
843: sb.setValue(sb.getValue() + delta);
844: }
845: }
846: }
847: );
848: map.put("positiveBlockIncrement",
849: new AbstractAction("positiveBlockIncrement") {
850: public void actionPerformed(ActionEvent event)
851: {
852: JScrollBar sb = (JScrollBar) event.getSource();
853: if (sb.isVisible())
854: {
855: int delta = sb.getBlockIncrement(1);
856: sb.setValue(sb.getValue() + delta);
857: }
858: }
859: }
860: );
861: map.put("negativeUnitIncrement",
862: new AbstractAction("negativeUnitIncrement") {
863: public void actionPerformed(ActionEvent event)
864: {
865: JScrollBar sb = (JScrollBar) event.getSource();
866: if (sb.isVisible())
867: {
868: int delta = sb.getUnitIncrement(-1);
869: sb.setValue(sb.getValue() + delta);
870: }
871: }
872: }
873: );
874: map.put("negativeBlockIncrement",
875: new AbstractAction("negativeBlockIncrement") {
876: public void actionPerformed(ActionEvent event)
877: {
878: JScrollBar sb = (JScrollBar) event.getSource();
879: if (sb.isVisible())
880: {
881: int delta = sb.getBlockIncrement(-1);
882: sb.setValue(sb.getValue() + delta);
883: }
884: }
885: }
886: );
887: map.put("minScroll",
888: new AbstractAction("minScroll") {
889: public void actionPerformed(ActionEvent event)
890: {
891: JScrollBar sb = (JScrollBar) event.getSource();
892: if (sb.isVisible())
893: {
894: sb.setValue(sb.getMinimum());
895: }
896: }
897: }
898: );
899: map.put("maxScroll",
900: new AbstractAction("maxScroll") {
901: public void actionPerformed(ActionEvent event)
902: {
903: JScrollBar sb = (JScrollBar) event.getSource();
904: if (sb.isVisible())
905: {
906: sb.setValue(sb.getMaximum());
907: }
908: }
909: }
910: );
911: return map;
912: }
913:
914:
918: protected void installListeners()
919: {
920: scrollListener = createScrollListener();
921: trackListener = createTrackListener();
92