package org.openswing.swing.miscellaneous.client; import java.util.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import org.openswing.swing.util.client.*; /** * <p>Title: OpenSwing Framework</p> * <p>Description: JPanel used to contain IconifableWindow objects. * It is possible to force the automatic expansion of any IconifableWindow.</p> * <p>Copyright: Copyright (C) 2006 Mauro Carniel</p> * * <p> This file is part of OpenSwing Framework. * This library is free software; you can redistribute it and/or * modify it under the terms of the (LGPL) Lesser General Public * License as published by the Free Software Foundation; * * GNU LESSER GENERAL PUBLIC LICENSE * Version 2.1, February 1999 * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * The author may be contacted at: * maurocarniel@tin.it</p> * * @author Mauro Carniel * @version 1.0 */ public class IconifableWindowsContainer extends JPanel { /** flag used to auto expand an IconifableWindow */ private boolean autoExpandWindow; /** list of IconifableWindow objects added to this container */ private ArrayList windows = new ArrayList(); private boolean firstTime = true; public IconifableWindowsContainer() { } public final void addNotify() { super.addNotify(); if (firstTime) { firstTime = false; SwingUtilities.invokeLater(new Runnable() { // thread used to wait until this container has been showed... public void run() { try { while (!ClientUtils.getParentWindow(IconifableWindowsContainer.this).isVisible()) { Thread.sleep(100); } } catch (Exception ex) { } IconifableWindowsContainer.this.addComponentListener(new ComponentAdapter() { /** * Invoked when the component's size changes. */ public void componentResized(ComponentEvent e) { IconifableWindow window = null; for (int i = 0; i < windows.size(); i++) { window = (IconifableWindow) windows.get(i); if (window.getWindow().getSize().height == window.getIconHeight()) { window.getWindow().setSize(new Dimension( IconifableWindowsContainer.this.getWidth(), window.getIconHeight() )); window.setWindowMaximumSize(new Dimension(IconifableWindowsContainer.this.getWidth(),getHeight()-windows.size()*window.getIconHeight()+window.getIconHeight())); } else { // update size for all window's content pane containers... Container c = window.getWindow().getContentPane(); while(c!=null && !(c.equals(window.getWindow()))) { c.setSize(IconifableWindowsContainer.this.getWidth(),getHeight()-windows.size()*window.getIconHeight()+window.getIconHeight()); c = c.getParent(); } // update JWindow size... window.getWindow().setSize(new Dimension(IconifableWindowsContainer.this.getWidth(),getHeight()-windows.size()*window.getIconHeight()+window.getIconHeight())); // update size of content pane children... for(int j=0;j<window.getWindow().getContentPane().getComponentCount();j++) { window.getWindow().getContentPane().getComponents()[j].setSize( new Dimension( IconifableWindowsContainer.this.getWidth(), window.getWindow().getContentPane().getComponents()[j].getHeight() ) ); ((JComponent)window.getWindow().getContentPane().getComponents()[j]).revalidate(); } window.setWindowMaximumSize(new Dimension(IconifableWindowsContainer.this.getWidth(),getHeight()-windows.size()*window.getIconHeight()+window.getIconHeight())); } } } }); JComponent anchorComponent = IconifableWindowsContainer.this; IconifableWindow window = null; for(int i=windows.size()-1;i>=0;i--) { window = (IconifableWindow)windows.get(i); if (i==windows.size()-1) window.anchorWindow(anchorComponent,IconifableWindow.INSIDE_BOTTOM); else window.anchorWindow(anchorComponent,IconifableWindow.TOP); window.setWindowMaximumSize(new Dimension(getWidth(),getHeight()-windows.size()*window.getIconHeight()+window.getIconHeight())); window.showWindow(); window.reduceToIcon(); if (i==0 && autoExpandWindow) { window.getWindow().setSize(new Dimension(getWidth(),getHeight()-windows.size()*window.getIconHeight()+window.getIconHeight())); window.getWindow().setLocation(getLocationOnScreen().x,getLocationOnScreen().y); } anchorComponent = window; window.addIconifableWindowListener(new IconifableWindowListener(){ public void windowEvent(IconifableWindow source,int event) { if (event==IconifableWindowListener.WINDOW_RESTORED) { IconifableWindow w = null; for(int k=0;k<windows.size();k++) { w = (IconifableWindow)windows.get(k); if (!w.equals(source)) w.reduceToIcon(); } if (source.getConstraint()==source.TOP) source.setLocation(source.getLocation().x,source.getLocation().y); } else if (event==IconifableWindowListener.WINDOW_REDUCED_TO_ICON && autoExpandWindow) { IconifableWindow w = null; for(int k=0;k<windows.size();k++) { w = (IconifableWindow)windows.get(k); if (w.getWindow().getHeight()!=w.getIconHeight()) return; } source.restoreWindow(); } } }); } } }); } } /** * @return define if auto expand an IconifableWindow */ public final boolean isAutoExpandWindow() { return autoExpandWindow; } /** * Define if auto expand an IconifableWindow. * @param autoExpandWindow auto expand an IconifableWindow */ public final void setAutoExpandWindow(boolean autoExpandWindow) { this.autoExpandWindow = autoExpandWindow; } /** * Add an IconifableWindow to this container. * @param window IconifableWindow object to add */ public final void addIconifableWindow(IconifableWindow window) { windows.add(window); } /** * Remove an IconifableWindow to this container. * @param window IconifableWindow object to remove */ public final void removeIconifableWindow(IconifableWindow window) { windows.remove(window); } public final Component add(Component comp, int index) { throw new RuntimeException(); } public final void add(Component comp, Object constraints, int index) { throw new RuntimeException(); } public final void add(Component comp, Object constraints) { throw new RuntimeException(); } public final Component add(Component comp) { throw new RuntimeException(); } public final Component add(String name, Component comp) { throw new RuntimeException(); } }