/*
* @(#)VFlowLayout.java 1.2 02/08/21
*
* Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved.
*/
package com.sun.media.controls;
import java.awt.*;
import java.util.Vector;
/*
* Vertical FlowLayout manager. it accepts components and put them one under the other.
* it saves the common solution which is recursive BorderLayout.
*
* @author Shay Ben-David (bendavid@haifa.ibm.com)
*
*/
public class VFlowLayout implements LayoutManager {
/** <FONT COLOR="#FF0000">
* Licensed Materials - Property of IBM <br><br>
* "Restricted Materials of IBM" <br><br>
* 5648-B81 <br><br>
* (c) Copyright IBM Corporation 1997,1999 All Rights Reserved <br><br>
* US Government Users Restricted Rights - Use, duplication or
* disclosure restricted by GSA ADP Schedule Contract with
* IBM Corporation.</FONT>
*
**/
public static final String a_copyright_notice="(c) Copyright IBM Corporation 1997,1999.";
private int gap;
private int minWidth = 0, minHeight = 0;
private int preferredWidth = 0, preferredHeight = 0;
private boolean sizeUnknown = true;
/** flow layout without gap **/
public VFlowLayout() {
this(0);
}
/** flow layout with the specified gap **/
public VFlowLayout(int v) {
gap = v;
}
/* Required by LayoutManager. */
public void addLayoutComponent(String name, Component comp) {
}
/* Required by LayoutManager. */
public void removeLayoutComponent(Component comp) {
}
/** calculates minimum size and preffered size **/
private void setSizes(Container parent) {
int nComps = parent.countComponents();
Dimension d = null;
//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();
minWidth = Math.max(c.minimumSize().width, minWidth);
preferredWidth = Math.max(c.preferredSize().width, preferredWidth);
minHeight += (c.minimumSize().height + gap);
preferredHeight += (c.preferredSize().height + gap);
}
}
}
/* Required by LayoutManager. */
public Dimension preferredLayoutSize(Container parent) {
Dimension dim = new Dimension(0, 0);
int nComps = parent.countComponents();
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;
return dim;
}
/* Required by LayoutManager. */
public Dimension minimumLayoutSize(Container parent) {
Dimension dim = new Dimension(0, 0);
int nComps = parent.countComponents();
setSizes(parent);
//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;
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 least, 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();
// Go through the components' sizes, if neither preferredLayoutSize()
// nor minimumLayoutSize() has been called.
if (sizeUnknown) {
setSizes(parent);
}
int previousWidth = 0, previousHeight = 0;
int x = 0, y = insets.top + gap/2;
int rowh = 0, start = 0;
int yFudge = 0;
boolean oneColumn = false;
// Go through the components' sizes, if neither preferredLayoutSize()
// nor minimumLayoutSize() has been called.
if (sizeUnknown) {
setSizes(parent);
}
if (maxHeight > preferredHeight) {
yFudge = (maxHeight - preferredHeight)/(nComps);
}
for (int i = 0 ; i < nComps ; i++) {
Component c = parent.getComponent(i);
if (c.isVisible()) {
Dimension d = c.preferredSize();
if (i!=0)
y+=(previousHeight + yFudge + gap);
else
y+=(previousHeight + (yFudge + gap)/2 );
// Set the component's size and position.
c.reshape(0, y, maxWidth, d.height);
previousWidth = d.width;
previousHeight = d.height;
}
}
}
public String toString() {
return getClass().getName() + "[gap=" + gap +"]";
}
}
|