//------------------------------------------------------------------------------
// Copyright (c) 2005, 2007 IBM Corporation 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:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.publishing.ui.wizards;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.epf.authoring.ui.AuthoringUIHelpContexts;
import org.eclipse.epf.authoring.ui.AuthoringUIText;
import org.eclipse.epf.common.utils.StrUtil;
import org.eclipse.epf.library.LibraryService;
import org.eclipse.epf.library.LibraryServiceUtil;
import org.eclipse.epf.library.configuration.ConfigurationHelper;
import org.eclipse.epf.library.ui.LibraryUIResources;
import org.eclipse.epf.publishing.ui.PublishingUIPlugin;
import org.eclipse.epf.publishing.ui.PublishingUIResources;
import org.eclipse.epf.ui.wizards.BaseWizardPage;
import org.eclipse.epf.uma.ContentCategory;
import org.eclipse.epf.uma.MethodConfiguration;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;

/**
 * A wizard page that prompts the user to select a method configuration to
 * publish.
 * 
 * @author Kelvin Low
 * @author Bingxue Xu
 * @author Jinhua Xi
 * @since 1.0
 */
public class SelectConfigPage extends BaseWizardPage {

	/**
	 * The wizard page name.
	 */
	public static final String PAGE_NAME = SelectConfigPage.class.getName();

	protected Table table;

	protected TableViewer configViewer;

	protected Text briefDescText;

	protected List processViews;

	protected String selectedConfigName;

	protected class ConfigurationTableLabelProvider extends LabelProvider
			implements ITableLabelProvider {

		public Image getColumnImage(Object element, int index) {
			return null;
		}

		public String getColumnText(Object element, int index) {
			MethodConfiguration config = (MethodConfiguration) element;
			return config.getName();
		}
	}

	/**
	 * Creates a new instance.
	 */
	public SelectConfigPage() {
		super(PAGE_NAME);
		setTitle(PublishingUIResources.selectConfigWizardPage_title);
		setDescription(PublishingUIResources.selectConfigWizardPage_text);
		setImageDescriptor(PublishingUIPlugin.getDefault().getImageDescriptor(
				"full/wizban/PublishConfiguration.gif")); //$NON-NLS-1$
	}

	/**
	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(Composite)
	 */
	public void createControl(Composite parent) {
		Composite composite = new Composite(parent, SWT.NULL);
		composite.setLayout(new GridLayout(1, false));

		createLabel(composite, PublishingUIResources.configLabel_text);

		table = new Table(composite, SWT.BORDER | SWT.V_SCROLL);
		GridData gridData = new GridData(GridData.FILL_BOTH);
		gridData.heightHint = 120;
		gridData.widthHint = 280;
		table.setLayoutData(gridData);

		configViewer = new TableViewer(table);

		createLabel(composite, AuthoringUIText.DESCRIPTION_TEXT);

		briefDescText = createMultiLineText(composite, "", 360, 80, 1); //$NON-NLS-1$

		initControls();

		addListeners();

		setControl(composite);

		PlatformUI
				.getWorkbench()
				.getHelpSystem()
				.setHelp(
						composite,
						AuthoringUIHelpContexts.CONFIGURATION_PUBLISH_WIZARD_ALL_PAGES_CONTEXT);
	}

	/**
	 * Initializes the wizard page controls with data.
	 */
	protected void initControls() {
		configViewer.setLabelProvider(new ConfigurationTableLabelProvider());
		configViewer.setContentProvider(new ArrayContentProvider());
		MethodConfiguration[] configs = LibraryServiceUtil
				.getMethodConfigurations(LibraryService.getInstance()
						.getCurrentMethodLibrary());
		configViewer.setInput(configs);

		// Select the first config and display its brief description.
		if (configs.length > 0) {
			table.select(0);
			setBriefDescription(configs[0]);
		}
	}

	/**
	 * Adds event handlers to the wizard page controls.
	 */
	protected void addListeners() {
		configViewer
				.addSelectionChangedListener(new ISelectionChangedListener() {
					public void selectionChanged(SelectionChangedEvent event) {
						StructuredSelection selection = (StructuredSelection) event
								.getSelection();
						if (!selection.isEmpty()) {
							Object[] configs = selection.toArray();
							setBriefDescription((MethodConfiguration) configs[0]);
						}
						setPageComplete(isPageComplete());
						getWizard().getContainer().updateButtons();
					}
				});
	}

	/**
	 * @see org.eclipse.jface.wizard.WizardPage#isCompleted()
	 */
	public boolean isPageComplete() {
		if (LibraryService.getInstance().getCurrentMethodLibrary() == null) {
			setErrorMessage(LibraryUIResources.noOpenLibraryWarning_msg);
		}

		if (getErrorMessage() != null) {
			return false;
		}

		int count = table.getSelectionCount();

		if (count > 0) {
			TableItem[] items = table.getSelection();
			selectedConfigName = items[0].getText();
			MethodConfiguration config = LibraryServiceUtil
					.getMethodConfiguration(LibraryService.getInstance()
							.getCurrentMethodLibrary(), selectedConfigName);
			processViews = null;
			if (config != null) {
				processViews = getValidConfigViews(config);
			}

			if (processViews != null && processViews.size() > 0) {
				setErrorMessage(null);
				setMessage(null);
				return true;
			} else {
				setErrorMessage(null);
				setMessage(PublishingUIResources.missingViewError_msg,
						WizardPage.WARNING);
			}
		}

		return false;
	}

	/**
	 * @see org.eclipse.jface.wizard.WizardPage#getNextPage()
	 */
	public IWizardPage getNextPage() {
		IWizardPage page = getWizard().getNextPage(this);
		try {
			((BaseWizardPage) page).onEnterPage(getConfigName());
		} catch (Exception e) {
		}
		return page;
	}

	/**
	 * Gets a list of valid configuration views.
	 * 
	 * @param config
	 *            a method configuration
	 * @return a list of configuration views
	 */
	protected List getValidConfigViews(MethodConfiguration config) {
		String msg;
		StringBuffer message = new StringBuffer();
		List<ContentCategory> views = new ArrayList<ContentCategory>();
		for (Iterator it = config.getProcessViews().iterator(); it.hasNext();) {
			ContentCategory view = (ContentCategory) it.next();
			if (ConfigurationHelper.isContributor(view)) {
				msg = PublishingUIResources.bind(
						PublishingUIResources.invalidViewContributorInfo_msg,
						view.getPresentationName());
				message.append(StrUtil.TAB).append(msg).append(
						StrUtil.LINE_FEED);
			} else {
				view = (ContentCategory) ConfigurationHelper
						.getCalculatedElement(view, config);
				if (view == null) {
					msg = PublishingUIResources.bind(
							PublishingUIResources.invalidViewInvalidInfo_msg,
							view.getPresentationName());
					message.append(StrUtil.TAB).append(msg).append(
							StrUtil.LINE_FEED);

				} else if (views.contains(view)) {
					msg = PublishingUIResources.bind(
							PublishingUIResources.invalidViewSameViewInfo_msg,
							view.getPresentationName());
					message.append(StrUtil.TAB).append(msg).append(
							StrUtil.LINE_FEED);

				} else {
					views.add(view);
				}
			}
		}

		if (message.length() > 0) {
			msg = PublishingUIResources.bind(
					PublishingUIResources.invalidViewsInfo_msg, config
							.getName());
			message.insert(0, msg + StrUtil.LINE_FEED + StrUtil.LINE_FEED);

			// FIXME! Should not display warning messages in the brief
			// description field.
			briefDescText.setText(message.toString());
		}

		return views;
	}

	/**
	 * Gets the user selected method configuration.
	 * 
	 * @return the name of the user selected configuration or <code>null</code>
	 */
	public String getConfigName() {
		return selectedConfigName;
	}

	/**
	 * Populates the Brief Description text control with the given
	 * configuration's brief descripotion.
	 */
	private void setBriefDescription(MethodConfiguration config) {
		briefDescText.setText(config.getBriefDescription());
	}

}
