//------------------------------------------------------------------------------
// 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.export.wizards;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.eclipse.epf.authoring.ui.AuthoringUIResources;
import org.eclipse.epf.authoring.ui.AuthoringUIText;
import org.eclipse.epf.export.ExportPlugin;
import org.eclipse.epf.export.ExportResources;
import org.eclipse.epf.export.services.PluginExportData;
import org.eclipse.epf.library.LibraryService;
import org.eclipse.epf.library.edit.PresentationContext;
import org.eclipse.epf.library.ui.LibraryUIImages;
import org.eclipse.epf.library.ui.LibraryUIResources;
import org.eclipse.epf.ui.wizards.BaseWizardPage;
import org.eclipse.epf.uma.MethodLibrary;
import org.eclipse.epf.uma.MethodPlugin;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Text;

/**
 * A wizard page that prompts the user to select the method plug-ins to be
 * exported.
 * 
 * @author Jinhua Xi
 * @author Kelvin Low
 * @since 1.0
 */
public class SelectPluginPage extends BaseWizardPage implements
		ISelectionChangedListener, ICheckStateListener, Listener {

	public static final String PAGE_NAME = SelectPluginPage.class.getName();

	private Table table;

	private CheckboxTableViewer ctrl_chkboxTableViewer;

	private Text ctrl_author;

	private Text ctrl_version;

	private Text ctrl_briefDesc;

	private int checkedCount = 0;

	private Collection<MethodPlugin> checkedPluginList = new ArrayList<MethodPlugin>();

	private PluginExportData data;
	
	private Button selectAllButton;
	
	private Button deselectAllButton;

	/**
	 * Creates a new instance.
	 */
	public SelectPluginPage(PluginExportData data) {
		super(PAGE_NAME);
		setTitle(ExportResources.selectPluginsPage_title);
		setDescription(ExportResources.selectPluginsPage_desc);
		setImageDescriptor(ExportPlugin.getDefault().getImageDescriptor(
				"full/wizban/exp_meth_plugin_wizban.gif")); //$NON-NLS-1$
		this.data = data;
	}

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

		Composite container1 = new Composite(container, SWT.NONE);
		container1.setLayout(new GridLayout(3, false));
		createLabel(container1,
				ExportResources.selectPluginsPage_pluginsLabel_text);

		selectAllButton = createButton(
				container1,
				AuthoringUIResources.AuthoringUIPlugin_SaveAllEditorsPage_SelectAllButtonLabel);
		deselectAllButton = createButton(
				container1,
				AuthoringUIResources.AuthoringUIPlugin_SaveAllEditorsPage_DeselectAllButtonLabel);

		ctrl_chkboxTableViewer = createCheckboxTableViewer(container, 1);
		table = ctrl_chkboxTableViewer.getTable();

		MethodLibrary library = LibraryService.getInstance()
				.getCurrentMethodLibrary();
		List plugins = (library == null) ? new ArrayList() : new ArrayList(library
				.getMethodPlugins());
		
		if (plugins.size() > 1) {
			Comparator comparator = PresentationContext.INSTANCE.getComparator();
			Collections.<MethodPlugin>sort(plugins, comparator);
		}
		
		ILabelProvider labelProvider = new LabelProvider() {
			public Image getImage(Object element) {
				return LibraryUIImages.IMG_METHOD_PLUGIN;
			}

			public String getText(Object element) {
				if (element instanceof MethodPlugin) {
					return ((MethodPlugin) element).getName();
				} else {
					return element.toString();
				}
			}
		};

		ctrl_chkboxTableViewer.setLabelProvider(labelProvider);
		ctrl_chkboxTableViewer.setContentProvider(new ArrayContentProvider());
		if (plugins != null) {
			ctrl_chkboxTableViewer.setInput(plugins.toArray());
		}

		createLabel(container, AuthoringUIText.AUTHORS_TEXT);
		ctrl_author = createMultiLineText(container, "", 360, 40, 3); //$NON-NLS-1$

		createLabel(container, AuthoringUIText.VERSION_TEXT);
		ctrl_version = createText(container, "", 360, 3); //$NON-NLS-1$

		createLabel(container, AuthoringUIText.BRIEF_DESCRIPTION_TEXT);
		ctrl_briefDesc = createMultiLineText(container, "", 360, 80, 3); //$NON-NLS-1$

		if (plugins != null && !plugins.isEmpty()) {
			table.select(0);
			setDisplayAttributes((MethodPlugin) plugins.get(0));
		}

		addListeners(plugins);

		setControl(container);
		setPageComplete(false);
	}

	private void addListeners(final List<MethodPlugin> plugins) {
		ctrl_chkboxTableViewer.addSelectionChangedListener(this);
		ctrl_chkboxTableViewer.addCheckStateListener(this);
		
		final MethodLibrary lib = LibraryService.getInstance()
						.getCurrentMethodLibrary();
		selectAllButton.addSelectionListener(new SelectionListener() {
			public void widgetSelected(SelectionEvent e) {
				ctrl_chkboxTableViewer.setAllChecked(true);
				if (lib != null) {
					checkedPluginList.addAll(plugins);
					checkedCount = checkedPluginList.size();
				}
				
				setPageComplete(isPageComplete());
				getWizard().getContainer().updateButtons();
			}

			public void widgetDefaultSelected(SelectionEvent e) {
				widgetSelected(e);
			}

		});

		deselectAllButton.addSelectionListener(new SelectionListener() {
			public void widgetSelected(SelectionEvent e) {
				ctrl_chkboxTableViewer.setAllChecked(false);
				if (lib != null) {
					checkedPluginList.clear();
					checkedCount = 0;
				}
				
				setPageComplete(isPageComplete());
				getWizard().getContainer().updateButtons();
			}

			public void widgetDefaultSelected(SelectionEvent e) {
				widgetSelected(e);
			}

		});
	}

	/**
	 * @see org.eclipse.jface.viewers.ICheckStateListener#checkStateChanged(org.eclipse.jface.viewers.CheckStateChangedEvent)
	 */
	public void checkStateChanged(CheckStateChangedEvent event) {
		Object obj = event.getElement();

		if (obj instanceof MethodPlugin) {
			if (event.getChecked()) {
				checkedCount++;
				checkedPluginList.add((MethodPlugin)obj);
			} else {
				checkedCount--;
				checkedPluginList.remove(obj);
			}
			setPageComplete(isPageComplete());
			getWizard().getContainer().updateButtons();
		}
	}

	/**
	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
	 */
	public void selectionChanged(SelectionChangedEvent event) {
		StructuredSelection selection = (StructuredSelection) event
				.getSelection();
		if (!selection.isEmpty()) {
			Object[] plugin = selection.toArray();
			setDisplayAttributes((MethodPlugin) plugin[0]);
		}

	}

	/**
	 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
	 */
	public void handleEvent(Event event) {
		setPageComplete(isPageComplete());
		getWizard().getContainer().updateButtons();
	}

	private void setDisplayAttributes(MethodPlugin plugin) {
		ctrl_author.setText(plugin.getAuthors());
		ctrl_version.setText(plugin.getVersion());
		ctrl_briefDesc.setText(plugin.getBriefDescription());
	}

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

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

		return checkedCount > 0;
	}

	protected void saveDataToModel() {
		data.setSelectedPlugins(checkedPluginList);
	}

	/**
	 * @see org.eclipse.jface.wizard.WizardPage#getNextPage()
	 */
	public IWizardPage getNextPage() {
		saveDataToModel();
		PluginInfoPage page = ((ExportPluginWizard) getWizard()).page2;
		page.onEnterPage(null);
		return page;
	}

}
