PaletteLayout.java

/*
 * @(#)PaletteLayout.java
 *
 * Project:		JHotdraw - a GUI framework for technical drawings
 *				http://www.jhotdraw.org
 *				http://jhotdraw.sourceforge.net
 * Copyright:	© by the original author(s) and all contributors
 * License:		Lesser GNU Public License (LGPL)
 *				http://www.opensource.org/licenses/lgpl-license.html
 */

package CH.ifa.draw.util;

import java.awt.*;

/**
 * A custom layout manager for the palette.
 *
 * @see PaletteButton
 *
 * @version <$CURRENT_VERSION$>
 */
public class PaletteLayout implements LayoutManager {

	private int         fGap;
	private Point       fBorder;
	private boolean     fVerticalLayout;

	/**
	 * Initializes the palette layout.
	 * @param gap the gap between palette entries.
	 */
	public PaletteLayout(int gap) {
		this(gap, new Point(0,0), true);
	}

	public PaletteLayout(int gap, Point border) {
		this(gap, border, true);
	}

	public PaletteLayout(int gap, Point border, boolean vertical) {
		fGap = gap;
		fBorder = border;
		fVerticalLayout = vertical;
	}

	public void addLayoutComponent(String name, Component comp) {
	}

	public void removeLayoutComponent(Component comp) {
	}

	public Dimension preferredLayoutSize(Container target) {
		return minimumLayoutSize(target);
	}

	public Dimension minimumLayoutSize(Container target) {
		Dimension dim = new Dimension(0, 0);
		int nmembers = target.getComponentCount();

		for (int i = 0 ; i < nmembers ; i++) {
			Component m = target.getComponent(i);
			if (m.isVisible()) {
				Dimension d = m.getMinimumSize();
				if (fVerticalLayout) {
					dim.width = Math.max(dim.width, d.width);
					if (i > 0) {
						dim.height += fGap;
					}
					dim.height += d.height;
				}
				else {
					dim.height = Math.max(dim.height, d.height);
					if (i > 0) {
						dim.width += fGap;
					}
					dim.width += d.width;
				}
			}
		}

		Insets insets = target.getInsets();
		dim.width += insets.left + insets.right;
		dim.width += 2 * fBorder.x;
		dim.height += insets.top + insets.bottom;
		dim.height += 2 * fBorder.y;
		return dim;
	}

	public void layoutContainer(Container target) {
		Insets insets = target.getInsets();
		int nmembers = target.getComponentCount();
		int x = insets.left + fBorder.x;
		int y = insets.top + fBorder.y;

		for (int i = 0 ; i < nmembers ; i++) {
			Component m = target.getComponent(i);
			if (m.isVisible()) {
				Dimension d = m.getMinimumSize();
				m.setBounds(x, y, d.width, d.height);
				if (fVerticalLayout) {
					y += d.height;
					y += fGap;
				}
				else {
					x += d.width;
					x += fGap;
				}
			}
		}
	}
}