/*******************************************************************************
 * Copyright (c) 2000, 2012 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.swt.custom;

import org.eclipse.swt.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.*;

/**
 * This class provides the layout for CTabFolder
 * 
 * @see CTabFolder
 */
class CTabFolderLayout extends Layout {
@Override
protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) {
	CTabFolder folder = (CTabFolder)composite;
	CTabItem[] items = folder.items;
	CTabFolderRenderer renderer = folder.renderer;
	// preferred width of tab area to show all tabs
	int tabW = 0;
	int selectedIndex = folder.selectedIndex;
	if (selectedIndex == -1) selectedIndex = 0;
	GC gc = new GC(folder);
	for (int i = 0; i < items.length; i++) {
		if (folder.single) {
			tabW = Math.max(tabW, renderer.computeSize(i, SWT.SELECTED, gc, SWT.DEFAULT, SWT.DEFAULT).x);
		} else {
			int state = 0;
			if (i == selectedIndex) state |= SWT.SELECTED;
			tabW += renderer.computeSize(i, state, gc, SWT.DEFAULT, SWT.DEFAULT).x;
		}
	}
	
	int width = 0, wrapHeight = 0;
	boolean leftControl = false, rightControl = false;
	if (wHint == SWT.DEFAULT) {
		for (int i = 0; i < folder.controls.length; i++) {
			Control control = folder.controls[i];
			if (!control.isDisposed() && control.getVisible()) {
				if ((folder.controlAlignments[i] & SWT.LEAD) != 0) {
					leftControl = true;
				} else {
					rightControl = true;
				}
				width += control.computeSize(SWT.DEFAULT, SWT.DEFAULT).x;
			}
		}
	} else {
		Point size = new Point (wHint, hHint);
		boolean[][] positions = new boolean[1][];
		Rectangle[] rects = folder.computeControlBounds(size, positions);
		int minY = Integer.MAX_VALUE, maxY = 0;
		for (int i = 0; i < rects.length; i++) {
			if (positions[0][i]) {
				minY = Math.min(minY, rects[i].y);
				maxY = Math.max(maxY, rects[i].y + rects[i].height);
				wrapHeight = maxY - minY;
			} else {
				if ((folder.controlAlignments[i] & SWT.LEAD) != 0) {
					leftControl = true;
				} else {
					rightControl = true;
				}
				width += rects[i].width;
			}
		}
	}
	if (leftControl) width += CTabFolder.SPACING * 2;
	if (rightControl) width += CTabFolder.SPACING * 2;
	tabW += width;

	gc.dispose();
	
	int controlW = 0;
	int controlH = 0;
	// preferred size of controls in tab items
	for (int i = 0; i < items.length; i++) {
		Control control = items[i].control;
		if (control != null && !control.isDisposed()){
			Point size = control.computeSize (wHint, hHint, flushCache);
			controlW = Math.max (controlW, size.x);
			controlH = Math.max (controlH, size.y);
		}
	}

	int minWidth = Math.max(tabW, controlW + folder.marginWidth);
	int minHeight = (folder.minimized) ? 0 : controlH + wrapHeight;
	if (minWidth == 0) minWidth = CTabFolder.DEFAULT_WIDTH;
	if (minHeight == 0) minHeight = CTabFolder.DEFAULT_HEIGHT;
	
	if (wHint != SWT.DEFAULT) minWidth  = wHint;
	if (hHint != SWT.DEFAULT) minHeight = hHint;
	
	return new Point (minWidth, minHeight);
}
@Override
protected boolean flushCache(Control control) {
	return true;
}
@Override
protected void layout(Composite composite, boolean flushCache) {
	CTabFolder folder = (CTabFolder)composite;
	// resize content
	if (folder.selectedIndex != -1) {
		Control control = folder.items[folder.selectedIndex].control;
		if (control != null && !control.isDisposed()) {
			control.setBounds(folder.getClientArea());
		}
	}
}
}
