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
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 }