/*******************************************************************************
 * Copyright (c) 2007 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - Initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.internet.monitor.ui.internal.custom;

import org.eclipse.swt.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.*;
/**
 * This Layout stacks all the controls one on top of the other and resizes all controls
 * to have the same size and location.
 * The control specified in topControl is visible and all other controls are not visible.
 * Users must set the topControl value to flip between the visible items and then call 
 * layout() on the composite which has the MonitorStackLayout.
 */
public class MonitorStackLayout extends Layout {
 	/**
 	 * topControl the Control that is displayed at the top of the stack.
 	 * All other controls that are children of the parent composite will not be visible.
 	 */
 	public Control topControl;

	protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) {
		Control children[] = composite.getChildren();
		int maxWidth = 0;
		int maxHeight = 0;
		for (int i = 0; i < children.length; i++) {
			if (children[i] == topControl) {
				Point size = children[i].computeSize(wHint, hHint, flushCache);
				maxWidth = Math.max(size.x, maxWidth);
				maxHeight = Math.max(size.y, maxHeight);
			}
		}
		int width = maxWidth;
		int height = maxHeight;
		if (wHint != SWT.DEFAULT)
			width = wHint;
		if (hHint != SWT.DEFAULT)
			height = hHint;
		return new Point(width, height);
	}

	protected boolean flushCache(Control control) {
		return true;
	}

	protected void layout(Composite composite, boolean flushCache) {
		Control children[] = composite.getChildren();
		Rectangle rect = composite.getClientArea();
		for (int i = 0; i < children.length; i++) {
			if (children[i] instanceof Label) {
				Rectangle r = new Rectangle(rect.x+2, rect.y, rect.width-2, rect.height);
				children[i].setBounds(r);
			} else
				children[i].setBounds(rect);
			children[i].setVisible(children[i] == topControl);
		}
	}

	public String toString() {
		return "MonitorStackLayout";
	}
}