/*******************************************************************************
 * Copyright (c) 2004, 2005 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.facesconfig.ui.wizard;

import org.eclipse.jface.viewers.ColumnPixelData;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;

/**
 * Common wizard page used to summarize information entered in previous pages.
 * 
 * @author plevin
 * @version 1.0
 */
public class SummaryPage extends WizardPage
{
	private static final String WIZARD_SUMMARY_PAGE = "WizardSummaryPage";

	/** The source of the summary items */
	private ISummaryDataSource source;

	/** The table control that displays the summary items */
	private Table table;

	/**
	 * This Constructor creates the summary page
	 */
	public SummaryPage()
	{
		super( WIZARD_SUMMARY_PAGE );
		setTitle( WizardMessages.WizardSummaryPage_Title_WizardSummary );
		setDescription( WizardMessages.WizardSummaryPage_Summary_SummaryDesc );
	}

	/**
	 * This Constructor initializes the data source.
	 * 
	 * @param source -
	 *            Summary data source
	 */
	public SummaryPage( ISummaryDataSource source )
	{
		this();
		this.source = source;
	}

	/**
	 * Determines if the wizard can enable the Next button
	 * 
	 * @return boolean - the state of the Next button
	 */
	public boolean canFlipToNextPage()
	{
		return false;
	}

	/**
	 * Creates the page controls
	 * 
	 * @param parent -
	 *            the wizard composite
	 */
	public void createControl( Composite parent )
	{

		Composite composite = SWTUtils.createComposite( parent, 1 );

		table = new Table( composite, SWT.BORDER );
		table.setLayoutData( new GridData( GridData.FILL_BOTH ) );
		table.setHeaderVisible( true );
		table.setLinesVisible( true );

		TableLayout layout = new TableLayout();
		table.setLayout( layout );

		layout.addColumnData( new ColumnPixelData( 163 ) );
		layout.addColumnData( new ColumnPixelData( 350 ) );

		TableColumn keyCol = new TableColumn( table, SWT.NONE );
		keyCol.setText( WizardMessages.WizardSummaryPage_Label_Field );

		TableColumn valueCol = new TableColumn( table, SWT.NONE );
		valueCol
				.setText( WizardMessages.WizardSummaryPage_Label_Value );

		setControl( composite );
		setPageComplete( true );
	}

	/**
	 * Populates the table with summary information.
	 */
	public void loadSummaryData()
	{
		if ( source == null )
		{
			return;
		}
		Object[] data = source.getSummaryData().toArray();
		table.removeAll();
		for ( int i = 0; i < data.length; i++ )
		{
			TableItem item = new TableItem( table, SWT.NONE );
			item.setText( (String[]) data[i] );
		}
		return;
	}

	/**
	 * Sets summary page data source.
	 * 
	 * @param s -
	 *            Data source.
	 */
	public void setSummaryDataSource( ISummaryDataSource s )
	{
		source = s;
	}

	/**
	 * Populates the table with summary items when the page becomes visible.
	 * 
	 * @param visible -
	 *            the visible state of the page
	 */
	public void setVisible( boolean visible )
	{
		super.setVisible( visible );

		if ( visible == true )
		{
			loadSummaryData();
		}
	}
}
