1 /* Copyright (C) 2005-2011 Fabio Riccardi */
2 
3 package com.lightcrafts.ui.scroll;
4 
5 import javax.swing.*;
6 import java.awt.*;
7 import java.beans.PropertyChangeListener;
8 import java.beans.PropertyChangeEvent;
9 
10 public class PannerOverlay extends JLayeredPane {
11 
12     private JScrollPane scroll;
13     private Panner panner;
14 
PannerOverlay(CenteringScrollPane scroll)15     public PannerOverlay(CenteringScrollPane scroll) {
16         this.scroll = scroll;
17         panner = new Panner(scroll);
18         setLayout(null);
19         add(scroll, DEFAULT_LAYER);
20         add(panner, PALETTE_LAYER);
21 
22         // Add and remove the panner when its enabled state changes,
23         // so it won't intercept mouse events directed at the viewport
24         // when it is disabled.
25         panner.addPropertyChangeListener(
26             "enabled",
27             new PropertyChangeListener() {
28                 public void propertyChange(PropertyChangeEvent evt) {
29                     boolean isEnabled = (Boolean) evt.getNewValue();
30                     if (isEnabled) {
31                         add(panner, PALETTE_LAYER);
32                     }
33                     else {
34                         remove(panner);
35                     }
36                 }
37             }
38         );
39     }
40 
getPreferredSize()41     public Dimension getPreferredSize() {
42         Dimension size = scroll.getPreferredSize();
43         Insets insets = getInsets();
44         return new Dimension(
45             size.width + insets.left + insets.right,
46             size.height + insets.top + insets.bottom
47         );
48     }
49 
doLayout()50     public void doLayout() {
51         Dimension size = getSize();
52         Insets insets = getInsets();
53         scroll.setBounds(
54             insets.left,
55             insets.top,
56             size.width - insets.left - insets.right,
57             size.height - insets.top - insets.bottom
58         );
59         Dimension pannerSize = panner.getPreferredSize();
60         panner.setLocation(
61             size.width - pannerSize.width - insets.right - 20,
62             size.height - pannerSize.height - insets.top - 20
63         );
64         panner.setSize(pannerSize);
65     }
66 
main(String[] args)67     public static void main(String[] args) {
68         JComponent comp = new JTree();
69         comp.setBackground(Color.gray);
70         CenteringScrollPane scroll = new CenteringScrollPane(comp);
71         PannerOverlay panner = new PannerOverlay(scroll);
72 
73         JFrame frame = new JFrame("PannerOverlay");
74         frame.setContentPane(panner);
75         frame.pack();
76         frame.setLocationRelativeTo(null);
77         frame.setVisible(true);
78     }
79 }
80