/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.update.ui.forms.internal;

import org.eclipse.swt.graphics.*;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.*;

/**
 * This version of the section form adds scrolling
 * capability. However, scrolling can be disabled
 * using 'setScrollable' method. For this reason,
 * this class can be used instead of the SectionForm.
 */

public class ScrollableSectionForm extends SectionForm {
	private Composite container;
	private boolean verticalFit;
	private boolean scrollable = true;

	public ScrollableSectionForm() {
	}
	public Control createControl(Composite parent) {
		container = createParent(parent);
		Control formControl = super.createControl(container);
		if (container instanceof ScrolledComposite) {
			ScrolledComposite sc = (ScrolledComposite) container;
			sc.setContent(formControl);
		}
		GridData gd = new GridData(GridData.FILL_BOTH);
		formControl.setLayoutData(gd);
		container.setBackground(formControl.getBackground());
		return container;
	}
	protected Composite createParent(Composite parent) {
		Composite result = null;
		if (isScrollable()) {
			ScrolledComposite scomp =
				new ScrolledComposite(parent, SWT.V_SCROLL | SWT.H_SCROLL);
			if (isVerticalFit()) {
				scomp.setExpandHorizontal(true);
				scomp.setExpandVertical(true);
			}
			initializeScrollBars(scomp);
			result = scomp;
		} else {
			result = new Composite(parent, SWT.NONE);
			GridLayout layout = new GridLayout();
			layout.marginHeight = 0;
			layout.marginWidth = 0;
			result.setLayout(layout);
		}
		result.setMenu(parent.getMenu());
		return result;
	}
	public boolean isScrollable() {
		return scrollable;
	}
	public boolean isVerticalFit() {
		return verticalFit;
	}
	public void setScrollable(boolean newScrollable) {
		scrollable = newScrollable;
	}

	public void setVerticalFit(boolean newVerticalFit) {
		verticalFit = newVerticalFit;
	}

	private void initializeScrollBars(ScrolledComposite scomp) {
		ScrollBar hbar = scomp.getHorizontalBar();
		if (hbar != null) {
			hbar.setIncrement(H_SCROLL_INCREMENT);
		}
		ScrollBar vbar = scomp.getVerticalBar();
		if (vbar != null) {
			vbar.setIncrement(V_SCROLL_INCREMENT);
		}
		updatePageIncrement(scomp);
	}

	public void update() {
		super.update();
		if (container instanceof ScrolledComposite) {
			updateScrolledComposite();
		} else {
			container.layout(true);
		}
	}
	public void updateScrollBars() {
		if (container instanceof ScrolledComposite) {
			updateScrolledComposite();
		}
	}
	public void updateScrolledComposite() {
		ScrolledComposite sc = (ScrolledComposite) container;
		Control formControl = getControl();
		Point newSize = formControl.computeSize(SWT.DEFAULT, SWT.DEFAULT);
		formControl.setSize(newSize);
		sc.setMinSize(newSize);
		updatePageIncrement(sc);
	}
}
