/*******************************************************************************
 * Copyright (c) 2004, 2008 Sybase, Inc. and others. All rights reserved. This
 * program and the accompanying materials are made available under the terms of
 * the Eclipse Public License 2.0 which accompanies this distribution, and is
 * available at https://www.eclipse.org/legal/epl-2.0/ 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"; //$NON-NLS-1$

	/** 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();
		}
	}
}
