/*******************************************************************************
 * 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 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 innerComposite
	 *            this should be the composite to place this widget on.
	 * @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;
	}
}
