/*******************************************************************************
 * Copyright (c) 2006 Sybase, Inc. 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:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.jsf.common.ui.internal.guiutils;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.forms.events.ExpansionAdapter;
import org.eclipse.ui.forms.events.ExpansionEvent;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;

/**
 * Creates a class to be used to build a control for a collapseable area inside
 * a scrollable composite. This will take care of scrollbar resize.
 * 
 * Example use:
 * 
 * CollapsableSection cs = new CollapsableSection(toolkit, scomp, "General",
 * true) { public void setCollapsableContent(Composite composite) { // place
 * your content on this composite.... } }); cs.createControl(composite,
 * horizontalSpan);
 * 
 * @author mengbo
 * 
 */
public abstract class CollapsableSection {
	// internal fields needed for doing the section and computing the scrollbar
	// on a collapse.
	protected FormToolkit _toolkit;

	protected Section _section;

	protected ScrolledComposite _scomp;

	protected String _title;

	protected int _expansionStyle;

	/**
	 * Creates a class to be used to build the control for a collapseable area.
	 * 
	 * @param toolkit 
	 * 
	 * @param scomp
	 *            the scrollable composite used inside the container. This is
	 *            used to force resizing of the bars on dinking the control.
	 * @param title
	 *            the string to place next to the collapsable icon.
	 * @param bCollapsed
	 *            should this area start collapsed?
	 */
	public CollapsableSection(FormToolkit toolkit, ScrolledComposite scomp,
			String title, boolean bCollapsed) {
		_toolkit = toolkit;
		_scomp = scomp;
		_title = title;
		_expansionStyle = ExpandableComposite.TWISTIE
				| ExpandableComposite.FOCUS_TITLE;
		if (bCollapsed) {
			_expansionStyle |= ExpandableComposite.COMPACT;
		} else {
			_expansionStyle |= ExpandableComposite.EXPANDED;
		}
	}

	/**
	 * Build the GUI parts of the Collapsable area into the given composite.
	 * NOTE: you must set the layout on this composite before adding swt
	 * widgets.
	 * 
	 * @param composite
	 */
	abstract public void setCollapsableContent(Composite composite);

	/**
	 * A convient way to build the widget into a control and place it on the
	 * page. NOTE: this method will build the Section and call
	 * setCollapsableContent with a composite to fill in the inner area.
	 * 
	 * @param parent
	 * @param horizontalSpan
	 *            how many columns should this control span.
	 * @return Control that was added to the composite.
	 */
	public Control createControl(Composite parent, int horizontalSpan) {
		_section = _toolkit.createSection(parent, _expansionStyle);
		_section.clientVerticalSpacing = 5; // space between the dink and the
		// controls in when opened.
		// _section.marginHeight = 5; // indents the entire section.
		// _section.marginWidth = 5; // indents the entire section.
		_section.setText(_title);
		_toolkit.createCompositeSeparator(_section);
		_section.addExpansionListener(new ExpansionAdapter() {
			public void expansionStateChanged(ExpansionEvent event) {
				SWTUtils.computeScrollArea(_scomp, (Composite) _scomp
						.getContent());
			}
		});

		Composite content = new Composite(_section, SWT.NULL);
		setCollapsableContent(content);

		_section.setClient(content);
		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
		gd.horizontalSpan = horizontalSpan;
		_section.setLayoutData(gd);

		return _section;
	}

	/**
	 * Programmatically changes expanded state.
	 * 
	 * @param expanded
	 *            the new expanded state
	 */
	public void setExpanded(boolean expanded) {
		if (_section != null) {
			_section.setExpanded(expanded);

			// NOTE: internal calling of expanding doesn't fire
			// the event to resize. We do it here.
			SWTUtils.computeScrollArea(_scomp, (Composite) _scomp.getContent());
		}
	}

	/**
	 * Return the internal Section control for more advanced things.
	 * 
	 * @return Section
	 */
	public Section getSection() {
		return _section;
	}
}
