/**
* This code is from:
* http://www.javaworld.com/javaworld/jw-05-2001/jw-0525-mdi.html
*/
package Macbeth.Utilities;
import javax.swing.*;
import java.awt.*;
import java.beans.*;
/**
* An extension of WDesktopPane that supports often used MDI functionality. This
* class also handles setting scroll bars for when windows move too far to the left or
* bottom, providing the MDIDesktopPane is in a ScrollPane.
*/
private static int FRAME_OFFSET=20;
private MDIDesktopManager manager;
public MDIDesktopPane() {
manager=new MDIDesktopManager(this);
setDesktopManager(manager);
}
public void setBounds(int x, int y, int w, int h) {
super.setBounds(x,y,w,h);
checkDesktopSize();
}
int w;
int h;
checkDesktopSize();
if (array.length > 0) {
p = array[0].getLocation();
p.x = p.x + FRAME_OFFSET;
p.y = p.y + FRAME_OFFSET;
}
else {
}
frame.setLocation(p.x, p.y);
/* Jimmy: this is a bit buggy (frames get constant size)
if (frame.isResizable()) {
w = getWidth() - (getWidth()/3);
h = getHeight() - (getHeight()/3);
if (w < frame.getMinimumSize().getWidth()) w = (int)frame.getMinimumSize().getWidth();
if (h < frame.getMinimumSize().getHeight()) h = (int)frame.getMinimumSize().getHeight();
frame.setSize(w, h);
}*/
moveToFront(frame);
frame.setVisible(true);
try {
frame.setSelected(true);
frame.toBack();
}
return retval;
}
super.remove(c);
checkDesktopSize();
}
/**
* Cascade all internal frames
*/
public void cascadeFrames() {
int x = 0;
int y = 0;
manager.setNormalSize();
int frameHeight = (getBounds().height - 5) - allFrames.length * FRAME_OFFSET;
int frameWidth = (getBounds().width - 5) - allFrames.length * FRAME_OFFSET;
for (int i = allFrames.length - 1; i >= 0; i--) {
allFrames[i].setSize(frameWidth,frameHeight);
allFrames[i].setLocation(x,y);
x = x + FRAME_OFFSET;
y = y + FRAME_OFFSET;
}
}
/**
* Tile all internal frames
*/
public void tileFrames() {
java.
awt.
Component allFrames
[] = getAllFrames
();
manager.setNormalSize();
int frameHeight = getBounds().height/allFrames.length;
int y = 0;
for (int i = 0; i < allFrames.length; i++) {
allFrames[i].setSize(getBounds().width,frameHeight);
allFrames[i].setLocation(0,y);
y = y + frameHeight;
}
}
/**
* Sets all component size properties ( maximum, minimum, preferred)
* to the given dimension.
*/
setMinimumSize(d);
setMaximumSize(d);
setPreferredSize(d);
}
/**
* Sets all component size properties ( maximum, minimum, preferred)
* to the given width and height.
*/
public void setAllSize(int width, int height){
}
private void checkDesktopSize() {
if (getParent()!=null&&isVisible()) manager.resizeDesktop();
}
}
/**
* Private class used to replace the standard DesktopManager for JDesktopPane.
* Used to provide scrollbar functionality.
*/
private MDIDesktopPane desktop;
public MDIDesktopManager(MDIDesktopPane desktop) {
this.desktop = desktop;
}
super.endResizingFrame(f);
resizeDesktop();
}
super.endDraggingFrame(f);
resizeDesktop();
}
public void setNormalSize() {
int x = 0;
int y = 0;
Insets scrollInsets = getScrollPaneInsets
();
if (scrollPane != null) {
Dimension d = scrollPane.
getVisibleRect().
getSize();
if (scrollPane.getBorder() != null) {
d.setSize(d.getWidth() - scrollInsets.left - scrollInsets.right,
d.getHeight() - scrollInsets.top - scrollInsets.bottom);
}
d.setSize(d.getWidth() - 20, d.getHeight() - 20);
desktop.setAllSize(x,y);
scrollPane.invalidate();
scrollPane.validate();
}
}
private Insets getScrollPaneInsets
() {
if (scrollPane==
null) return new Insets(0,
0,
0,
0);
else return getScrollPane().getBorder().getBorderInsets(scrollPane);
}
if (desktop.
getParent() instanceof JViewport) {
}
return null;
}
protected void resizeDesktop() {
int x = 0;
int y = 0;
Insets scrollInsets = getScrollPaneInsets
();
if (scrollPane != null) {
for (int i = 0; i < allFrames.length; i++) {
if (allFrames[i].getX()+allFrames[i].getWidth()>x) {
x = allFrames[i].getX() + allFrames[i].getWidth();
}
if (allFrames[i].getY()+allFrames[i].getHeight()>y) {
y = allFrames[i].getY() + allFrames[i].getHeight();
}
}
Dimension d=scrollPane.
getVisibleRect().
getSize();
if (scrollPane.getBorder() != null) {
d.setSize(d.getWidth() - scrollInsets.left - scrollInsets.right,
d.getHeight() - scrollInsets.top - scrollInsets.bottom);
}
if (x <= d.getWidth()) x = ((int)d.getWidth()) - 20;
if (y <= d.getHeight()) y = ((int)d.getHeight()) - 20;
desktop.setAllSize(x,y);
scrollPane.invalidate();
scrollPane.validate();
}
}
}