package net.sf.colossus.gui; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import javax.swing.JComponent; import javax.swing.JScrollPane; public class CCVFlowLayout extends FlowLayout implements ComponentListener { private final JScrollPane parentScrollPane; private final JComponent parentComponent; CCVFlowLayout(JScrollPane sp, JComponent me, int al, int sx, int sy) { super(al, sx, sy); parentScrollPane = sp; parentComponent = me; parentScrollPane.addComponentListener(this); } protected Dimension getOurSize() { javax.swing.JViewport viewport = parentScrollPane.getViewport(); Dimension extentSize = viewport.getExtentSize(); java.awt.Insets insets = parentComponent.getInsets(); int maxLegalWidth = extentSize.width - (insets.left + insets.right); int x = 0, y = insets.top + getVgap(); int rowHeight = 0, maxWidth = 0; Component[] allComponents = parentComponent.getComponents(); for (Component component : allComponents) { if (component.isVisible()) { Dimension d = component.getPreferredSize(); if ((x == 0) || ((x + getHgap() + d.width) <= maxLegalWidth)) { if (x > 0) { x += getHgap(); } x += d.width; rowHeight = (rowHeight < d.height ? d.height : rowHeight); } else { if (x > maxWidth) { maxWidth = x; } x = d.width; y += getVgap() + rowHeight; rowHeight = d.height; } } } if (x > (maxWidth - getHgap())) { maxWidth = x + getHgap(); } y += getVgap() + rowHeight + insets.bottom; return new Dimension(maxWidth, y); } public void componentResized(ComponentEvent e) { javax.swing.JViewport viewport = parentScrollPane.getViewport(); Dimension viewSize = viewport.getViewSize(); Dimension extentSize = viewport.getExtentSize(); Dimension ourSize = getOurSize(); if ((viewSize.width != extentSize.width) || (viewSize.height != ourSize.height)) { int x = (ourSize.width > extentSize.width ? ourSize.width : extentSize.width); int y = (ourSize.height > extentSize.height ? ourSize.height : extentSize.height); parentComponent.setPreferredSize(new Dimension(x, y)); viewport.setViewSize(new Dimension(x, y)); parentComponent.doLayout(); parentScrollPane.doLayout(); } } public void componentMoved(ComponentEvent e) { // necessary to implement interface } public void componentShown(ComponentEvent e) { // necessary to implement interface } public void componentHidden(ComponentEvent e) { // necessary to implement interface } }