/* * RomRaider Open-Source Tuning, Logging and Reflashing * Copyright (C) 2006-2012 RomRaider.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package com.romraider.swing; import java.awt.Component; import java.awt.Dimension; import java.awt.Insets; import java.awt.Point; import java.beans.PropertyVetoException; import javax.swing.DefaultDesktopManager; import javax.swing.JComponent; import javax.swing.JDesktopPane; import javax.swing.JInternalFrame; import javax.swing.JScrollPane; import javax.swing.JViewport; import com.romraider.Settings; import com.romraider.editor.ecu.ECUEditor; import com.romraider.editor.ecu.ECUEditorManager; import com.romraider.util.SettingsManager; /** * 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. */ public class MDIDesktopPane extends JDesktopPane { private static final long serialVersionUID = -1839360490978587035L; private final MDIDesktopManager manager; public MDIDesktopPane() { manager = new MDIDesktopManager(this); setDesktopManager(manager); setDragMode(JDesktopPane.OUTLINE_DRAG_MODE); } @Override public void setBounds(int x, int y, int w, int h) { super.setBounds(x, y, w, h); checkDesktopSize(); } public Component add(JInternalFrame frame) { Point p; int w; int h; // get frame location. if(SettingsManager.getSettings().isAlwaysOpenTableAtZero()) { p = new Point(0, 0); } else { if (getAllFrames().length > 0) { JInternalFrame selectedFrame = getSelectedFrame(); if(null == selectedFrame || !selectedFrame.isVisible()) { // if none selected get the location at index 0. p = getAllFrames()[0].getLocation(); } else { // get the selected frame location and open off of that location. p = selectedFrame.getLocation(); } p.x = p.x + Settings.FRAME_OFFSET; p.y = p.y + Settings.FRAME_OFFSET; } else { p = new Point(0, 0); } } Component retval = super.add(frame); frame.setLocation(p.x, p.y); checkDesktopSize(); 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); if(frame instanceof TableFrame) { getEditor().getTableToolBar().updateTableToolBar(); ((TableFrame) frame).RegisterTable(); } try { frame.setSelected(true); } catch (PropertyVetoException e) { frame.toBack(); } return retval; } @Override public void remove(Component c) { super.remove(c); getEditor().getTableToolBar().updateTableToolBar(); checkDesktopSize(); } public ECUEditor getEditor() { return ECUEditorManager.getECUEditor(); } /** * Cascade all internal frames */ public void cascadeFrames() { int x = 0; int y = 0; JInternalFrame allFrames[] = getAllFrames(); manager.setNormalSize(); int frameHeight = (getBounds().height - 5) - allFrames.length * Settings.FRAME_OFFSET; int frameWidth = (getBounds().width - 5) - allFrames.length * Settings.FRAME_OFFSET; for (int i = allFrames.length - 1; i >= 0; i--) { allFrames[i].setSize(frameWidth, frameHeight); allFrames[i].setLocation(x, y); x = x + Settings.FRAME_OFFSET; y = y + Settings.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. */ public void setAllSize(Dimension d) { 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) { setAllSize(new Dimension(width, 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. */ class MDIDesktopManager extends DefaultDesktopManager { /** * */ private static final long serialVersionUID = -7668105643849176819L; private final MDIDesktopPane desktop; public MDIDesktopManager(MDIDesktopPane desktop) { this.desktop = desktop; } @Override public void endResizingFrame(JComponent f) { super.endResizingFrame(f); resizeDesktop(); } @Override public void endDraggingFrame(JComponent f) { super.endDraggingFrame(f); resizeDesktop(); } public void setNormalSize() { JScrollPane scrollPane = getScrollPane(); 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.revalidate(); } } public MDIDesktopPane getDesktop() { return this.desktop; } private Insets getScrollPaneInsets() { JScrollPane scrollPane = getScrollPane(); if (scrollPane == null) { return new Insets(0, 0, 0, 0); } else { return getScrollPane().getBorder().getBorderInsets(scrollPane); } } private JScrollPane getScrollPane() { if (desktop.getParent() instanceof JViewport) { JViewport viewPort = (JViewport) desktop.getParent(); if (viewPort.getParent() instanceof JScrollPane) { return (JScrollPane) viewPort.getParent(); } } return null; } protected void resizeDesktop() { int x = 0; int y = 0; JScrollPane scrollPane = getScrollPane(); Insets scrollInsets = getScrollPaneInsets(); if (scrollPane != null) { JInternalFrame allFrames[] = desktop.getAllFrames(); 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(); } } }