View Javadoc
1   package net.logAnalyzer.utils.gui;
2   
3   import java.awt.Color;
4   import java.awt.Component;
5   import java.awt.Dimension;
6   import java.awt.Point;
7   import java.awt.Rectangle;
8   import java.awt.event.ComponentEvent;
9   import java.awt.event.ComponentListener;
10  
11  import javax.swing.JDesktopPane;
12  import javax.swing.JInternalFrame;
13  import javax.swing.JScrollPane;
14  import javax.swing.JViewport;
15  
16  public class JScrollDesktopPane extends JScrollPane implements
17          ComponentListener {
18      private static final long serialVersionUID = 1L;
19  
20      /***
21       * Desktop pane use to internal frames.
22       */
23      private JDesktopPane desktopPane = new JDesktopPane();
24  
25      public JScrollDesktopPane() {
26          super();
27          desktopPane.setBackground(getBackground());
28          desktopPane.putClientProperty("JDesktopPane.dragMode", "outline");
29          setViewportView(desktopPane);
30      }
31  
32      /***
33       * Modification to the inherited behavior.
34       * 
35       * @see java.awt.Container#add(java.awt.Component)
36       */
37      public Component add(Component comp) {
38          if (comp instanceof JInternalFrame) {
39              comp.addComponentListener(this);
40          }
41          Component added = desktopPane.add(comp);
42          if (comp instanceof JInternalFrame) {
43              resizeDesktopPane();
44          }
45          return added;
46      }
47  
48      /***
49       * Modification to the inherited behavior.
50       * 
51       * @see javax.swing.JComponent#setBackground(java.awt.Color)
52       */
53      public void setBackground(Color bg) {
54          if (desktopPane != null) {
55              desktopPane.setBackground(bg);
56          }
57      }
58  
59      private boolean processingResize = false;
60  
61      private void resizeDesktopPane() {
62          if (!processingResize) {
63              processingResize = true;
64              JInternalFrame[] frames = desktopPane.getAllFrames();
65              Rectangle viewportRect = getViewport().getViewRect();
66              int x = viewportRect.x;
67              int y = viewportRect.y;
68              int x2 = viewportRect.width + viewportRect.x;
69              int y2 = viewportRect.height + viewportRect.y;
70              for (int i = 0; i < frames.length; i++) {
71                  if (frames[i].getX() < x) {
72                      x = frames[i].getX();
73                  }
74                  if (frames[i].getX() + frames[i].getWidth() > x2) {
75                      x2 = frames[i].getX() + frames[i].getWidth();
76                  }
77                  if (frames[i].getY() < y) {
78                      y = frames[i].getY();
79                  }
80                  if (frames[i].getY() + frames[i].getHeight() > y2) {
81                      y2 = frames[i].getY() + frames[i].getHeight();
82                  }
83              }
84  
85              // Computes translations
86              if (x != 0 || y != 0) {
87                  for (int i = 0; i < frames.length; i++) {
88                      frames[i].setLocation(frames[i].getX() - x, frames[i]
89                              .getY()
90                              - y);
91                  }
92                  JViewport jviewport = getViewport();
93                  jviewport.setViewSize(new Dimension(x2 - x, y2 - y));
94                  jviewport.setViewPosition(new Point(viewportRect.x - x,
95                          viewportRect.y - y));
96                  setViewport(jviewport);
97              }
98              desktopPane.setPreferredSize(new Dimension(x2 - x, y2 - y));
99              desktopPane.revalidate();
100             processingResize = false;
101         }
102     }
103 
104     /***
105      * Modification to the inherited behavior.
106      * 
107      * @see java.awt.event.ComponentListener#componentHidden(java.awt.event.ComponentEvent)
108      */
109     public void componentHidden(ComponentEvent e) {
110         resizeDesktopPane();
111     }
112 
113     /***
114      * Modification to the inherited behavior.
115      * 
116      * @see java.awt.event.ComponentListener#componentMoved(java.awt.event.ComponentEvent)
117      */
118     public void componentMoved(ComponentEvent e) {
119         resizeDesktopPane();
120     }
121 
122     /***
123      * Modification to the inherited behavior.
124      * 
125      * @see java.awt.event.ComponentListener#componentResized(java.awt.event.ComponentEvent)
126      */
127     public void componentResized(ComponentEvent e) {
128         resizeDesktopPane();
129     }
130 
131     /***
132      * Modification to the inherited behavior.
133      * 
134      * @see java.awt.event.ComponentListener#componentShown(java.awt.event.ComponentEvent)
135      */
136     public void componentShown(ComponentEvent e) {
137         resizeDesktopPane();
138     }
139 }