/* * Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved. * * Permission to use, copy, modify, and distribute this software * and its documentation for NON-COMMERCIAL purposes and without * fee is hereby granted provided that this copyright notice * appears in all copies. Please refer to the file "copyright.html" * for further important copyright and licensing information. * * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. */ import java.awt.*; import java.util.Vector; public class DiagonalLayout implements LayoutManager { private int vgap; private int minWidth = 0, minHeight = 0; private int preferredWidth = 0, preferredHeight = 0; private boolean sizeUnknown = true; private boolean DEBUG = false; public DiagonalLayout() { this(5); } public DiagonalLayout(int v) { vgap = v; } /* Required by LayoutManager. */ public void addLayoutComponent(String name, Component comp) { } /* Required by LayoutManager. */ public void removeLayoutComponent(Component comp) { } private void setSizes(Container parent) { int nComps = parent.countComponents(); Dimension d = null; if (DEBUG) { System.out.println(""); System.out.println("setSizes()"); } //Reset preferred/minimum width and height. preferredWidth = 0; preferredHeight = 0; minWidth = 0; minHeight = 0; for (int i = 0; i < nComps; i++) { Component c = parent.getComponent(i); if (c.isVisible()) { d = c.preferredSize(); if (i > 0) { preferredWidth += d.width/2; preferredHeight += vgap; } else { preferredWidth = d.width; } preferredHeight += d.height; minWidth = Math.max(c.minimumSize().width, minWidth); minHeight = preferredHeight; if (DEBUG) { System.out.println("Component["+i+"] preferred size: " + c.preferredSize()); System.out.println("Component["+i+"] minimum size: " + c.minimumSize()); System.out.print("preferred width: " + preferredWidth); System.out.print("; preferred height: " + preferredHeight); System.out.print("; minWidth: " + minWidth); System.out.println("; minHeight: " + minHeight); } } } } /* Required by LayoutManager. */ public Dimension preferredLayoutSize(Container parent) { Dimension dim = new Dimension(0, 0); int nComps = parent.countComponents(); if (DEBUG) { System.out.println(""); System.out.println("Start of preferredLayoutSize()"); } setSizes(parent); //Always add the container's insets! Insets insets = parent.insets(); dim.width = preferredWidth + insets.left + insets.right; dim.height = preferredHeight + insets.top + insets.bottom; sizeUnknown = false; if (DEBUG) { System.out.println("preferred layout size: " + dim); System.out.println("End of preferredLayoutSize()"); System.out.println(""); } return dim; } /* Required by LayoutManager. */ public Dimension minimumLayoutSize(Container parent) { Dimension dim = new Dimension(0, 0); int nComps = parent.countComponents(); if (DEBUG) { System.out.println(""); System.out.println("Start of minimumLayoutSize()"); } //Always add the container's insets! Insets insets = parent.insets(); dim.width = minWidth + insets.left + insets.right; dim.height = minHeight + insets.top + insets.bottom; sizeUnknown = false; if (DEBUG) { System.out.println("minimum layout size: " + dim); System.out.println("End of minimumLayoutSize()"); System.out.println(""); } return dim; } /* Required by LayoutManager. */ /* This is called when the panel is first displayed, * and every time its size changes. * Note: You CAN'T assume preferredLayoutSize() or minimumLayoutSize() * will be called -- in the case of applets, at leas, they probably * won't be. */ public void layoutContainer(Container parent) { Insets insets = parent.insets(); int maxWidth = parent.size().width - (insets.left + insets.right); int maxHeight = parent.size().height - (insets.top + insets.bottom); int nComps = parent.countComponents(); int previousWidth = 0, previousHeight = 0; int x = 0, y = insets.top; int rowh = 0, start = 0; int xFudge = 0, yFudge = 0; boolean oneColumn = false; if (DEBUG) { System.out.println(""); System.out.println("Start of layoutContainer()"); System.out.println("Container size = " + parent.size()); } // Go through the components' sizes, if neither preferredLayoutSize() // nor minimumLayoutSize() has been called. if (sizeUnknown) { if (DEBUG) { System.out.println("Calling preferredLayoutSize()"); } setSizes(parent); } if (maxWidth <= minWidth) { oneColumn = true; } if (maxWidth != preferredWidth) { xFudge = (maxWidth - preferredWidth)/(nComps - 1); if (DEBUG) { System.out.println("horizontal adjustment = " + xFudge); } } if (maxHeight > preferredHeight) { yFudge = (maxHeight - preferredHeight)/(nComps - 1); if (DEBUG) { System.out.println("vertical adjustment = " + yFudge); } } for (int i = 0 ; i < nComps ; i++) { Component c = parent.getComponent(i); if (c.isVisible()) { Dimension d = c.preferredSize(); // increase x and y, if appropriate if (i > 0) { if (!oneColumn) { //x += previousWidth - d.width/2 + xFudge; x += previousWidth/2 + xFudge; } y += previousHeight + vgap + yFudge; } if (DEBUG) { System.out.println("Placing component["+i+"] at (" + x + "," + y + ")"); } // If x is too large, ... if ((!oneColumn) && (x + d.width) > (parent.size().width - insets.right)) { if (DEBUG) { System.out.println("Eek! x too large: x="+x+"; maxX="+ (parent.size().width - insets.right)); System.out.println("Component["+i+"] preferred width: " +d.width); } // ... reduce x to a reasonable number. x = parent.size().width - insets.bottom - d.width; if (DEBUG) { System.out.println("Set x to " + x); } } // If y is too large, ... if ((y + d.height) > (parent.size().height - insets.bottom)) { if (DEBUG) { System.out.println("Eek! y too large: y=" + y + "; height=" + d.height + "; maxY="+ (parent.size().height - insets.bottom)); System.out.println("Component["+i+"] preferred height: " +d.height); } // ... do nothing. // Another choice would be to do what we do to x. } // Set the component's size and position. c.reshape(x, y, d.width, d.height); previousWidth = d.width; previousHeight = d.height; } } if (DEBUG) { System.out.println("End of layoutContainer()"); System.out.println(""); } } public String toString() { String str = ""; return getClass().getName() + "[vgap=" + vgap + str + "]"; } } // TO DO: // 1. Come up with a framework for making the Applet just have // a button that pops up a window. // 2. Do event handling for Quit.