/* * Copyright (C) 2007 Clam <clamisgood@gmail.com> * Copyright (C) 2007 IsmAvatar <IsmAvatar@gmail.com> * Copyright (C) 2014 Robert B. Colton * * This file is part of LateralGM. * LateralGM is free software and comes with ABSOLUTELY NO WARRANTY. * See LICENSE for details. */ package org.lateralgm.components.mdi; import java.awt.Dimension; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import javax.swing.DefaultDesktopManager; import javax.swing.JComponent; import javax.swing.JInternalFrame; import javax.swing.JScrollPane; public class MDIManager extends DefaultDesktopManager { private static final long serialVersionUID = 1L; public MDIPane pane; public JScrollPane scroll; public void setScrollPane(final JScrollPane scroll) { this.scroll = scroll; this.scroll.setAutoscrolls(false); this.scroll.addComponentListener(new ComponentListener() { @Override public void componentHidden(ComponentEvent arg0) { } @Override public void componentMoved(ComponentEvent arg0) { } @Override public void componentResized(ComponentEvent arg0) { //resizeDesktop(); } @Override public void componentShown(ComponentEvent arg0) { } }); resizeDesktop(); } public MDIManager(MDIPane pane) { super(); this.pane = pane; } @Override public void endResizingFrame(JComponent f) { super.endResizingFrame(f); resizeDesktop(); } @Override public void endDraggingFrame(JComponent f) { super.endDraggingFrame(f); resizeDesktop(); } /** * Resizes the desktop to reflect the frame (and icon) * positions. Also repositions the frames so that empty * spaces are removed while preserving the current view * (similar behavior to the windows MDI). */ public void resizeDesktop() { Rectangle viewrect = scroll.getViewport().getViewRect(); int xmin = Integer.MAX_VALUE, ymin = Integer.MAX_VALUE, xmax = 0, ymax = 0; for (JInternalFrame f : pane.getAllFrames()) { if (f.isVisible()) { if (!f.isMaximum()) { JComponent comp; if (!f.isIcon()) comp = f; else comp = f.getDesktopIcon(); xmin = Math.min(comp.getX(),xmin); ymin = Math.min(comp.getY(),ymin); xmax = Math.max(comp.getX() + comp.getWidth(),xmax); ymax = Math.max(comp.getY() + comp.getHeight(),ymax); } else { // //scroll.getViewport().setViewSize(scroll.getViewport().getExtentSize()); //pane.setPreferredSize(new Dimension((int)viewrect.getWidth(),(int)viewrect.getHeight()-200)); f.setSize(pane.getSize()); return; } } } int xcorrect = 0, ycorrect = 0; if (viewrect.x < xmin) xcorrect = -viewrect.x; else xcorrect = -xmin; if (viewrect.y < ymin) ycorrect = -viewrect.y; else ycorrect = -ymin; Point newviewpos = new Point(viewrect.x + xcorrect,viewrect.y + ycorrect); Dimension newPaneSize = new Dimension( Math.max(xmax + xcorrect,newviewpos.x + Math.min(viewrect.width,pane.getPreferredSize().width)), Math.max(ymax + ycorrect,newviewpos.y + Math.min(viewrect.height,pane.getPreferredSize().height))); for (JInternalFrame f1 : pane.getAllFrames()) { if (!f1.isIcon()) { Point p = f1.getLocation(); f1.setLocation(new Point(p.x + xcorrect,p.y + ycorrect)); } Point p = f1.getDesktopIcon().getLocation(); f1.getDesktopIcon().setLocation(new Point(p.x + xcorrect,p.y + ycorrect)); f1.repaint(); } scroll.getViewport().setViewPosition(newviewpos); pane.setPreferredSize(newPaneSize); pane.getParent().invalidate(); pane.getParent().validate(); pane.repaint(); } }