001 /*
002 * Copyright 2002-2007 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005 * use this file except in compliance with the License. You may obtain a copy of
006 * the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013 * License for the specific language governing permissions and limitations under
014 * the License.
015 */
016 package org.springframework.richclient.application.mdi;
017
018 import java.awt.Component;
019 import java.awt.Point;
020 import java.beans.PropertyVetoException;
021
022 import javax.swing.JDesktopPane;
023 import javax.swing.JInternalFrame;
024
025 /**
026 * An extension of WDesktopPane that supports often used MDI functionality. This
027 * class also handles setting scroll bars for when windows move too far to the
028 * left or bottom, providing the MDIDesktopPane is in a ScrollPane.
029 */
030 public class ScrollingDesktopPane extends JDesktopPane {
031 private static int FRAME_OFFSET = 20;
032
033 private ScrollingDesktopManager manager;
034
035 public ScrollingDesktopPane() {
036 manager = new ScrollingDesktopManager(this);
037 setDesktopManager(manager);
038 }
039
040 public void setBounds(int x, int y, int w, int h) {
041 super.setBounds(x, y, w, h);
042 checkDesktopSize();
043 }
044
045 public Component add(JInternalFrame frame) {
046 JInternalFrame[] array = getAllFrames();
047 Point p;
048
049 Component retval = super.add(frame);
050 checkDesktopSize();
051 if (array.length > 0) {
052 p = array[0].getLocation();
053 p.x = p.x + FRAME_OFFSET;
054 p.y = p.y + FRAME_OFFSET;
055 }
056 else {
057 p = new Point(0, 0);
058 }
059 frame.setLocation(p.x, p.y);
060
061 moveToFront(frame);
062 frame.setVisible(true);
063 try {
064 frame.setSelected(true);
065 }
066 catch (PropertyVetoException e) {
067 frame.toBack();
068 }
069 return retval;
070 }
071
072 public void remove(Component c) {
073 super.remove(c);
074 checkDesktopSize();
075 }
076
077 private void checkDesktopSize() {
078 if (getParent() != null && isVisible()) {
079 manager.resizeDesktop();
080 }
081 }
082 }