/*******************************************************************************
 * Copyright (c) 2009, 2010 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 API and implementation
 *******************************************************************************/
/**
 * 
 */
package org.eclipse.ptp.services.ui.widgets;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;

import org.eclipse.core.runtime.ListenerList;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.layout.PixelConverter;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.osgi.util.NLS;
import org.eclipse.ptp.services.core.IService;
import org.eclipse.ptp.services.core.IServiceConfiguration;
import org.eclipse.ptp.services.core.IServiceModelManager;
import org.eclipse.ptp.services.core.IServiceProvider;
import org.eclipse.ptp.services.core.ServiceModelManager;
import org.eclipse.ptp.services.ui.messages.Messages;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;

/**
 * Standard widget for selecting a service configuration.
 * 
 * Displays a table view of service configurations so that the user can easily
 * see what services and providers are available in the configuration.
 * 
 * Provides "Add...", "Remove", and "Rename" buttons to allow the creation,
 * removal and renaming of service configurations. These buttons can be
 * enabled/disabled by using the <code>buttons</code> constructor parameter.
 * 
 * The <code>excluded</code> constructor parameter can be used to supply a list
 * of configurations to be exclude from the list.
 * 
 * The whole control can be enabled/disabled using the <code>setEnabled</code> method.
 * 
 */
public class ServiceConfigurationSelectionWidget extends Composite implements ISelectionProvider {
	/**
	 * Comparator class used to sort service configurations in ascending order
	 * by name
	 */
	private class ServiceConfigurationComparator extends ViewerComparator {
		/* (non-Javadoc)
		 * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
		 */
		public int compare(Viewer viewer, Object o1, Object o2) {
			if (o1 instanceof IServiceConfiguration && o2 instanceof IServiceConfiguration) {
				return ((IServiceConfiguration)o1).getName().compareToIgnoreCase(((IServiceConfiguration)o2).getName());
			}
			
			return super.compare(viewer, o1, o2);
		}
	}
	
	/**
	 * Content provider for service configurations
	 */
	private class ServiceConfigurationContentProvider extends WorkbenchContentProvider {

		/* (non-Javadoc)
		 * @see org.eclipse.ui.model.BaseWorkbenchContentProvider#getChildren(java.lang.Object)
		 */
		@Override
		public Object[] getChildren(Object element) {
			List<IServiceConfiguration> children = new ArrayList<IServiceConfiguration>();
			if (fDisplayConfigs == null) {
				children.addAll(ServiceModelManager.getInstance().getConfigurations());
			} else {
				children.addAll(Arrays.asList(fDisplayConfigs));
			}
			if (fExcludedConfigs != null) {
				children.removeAll(fExcludedConfigs);
			}
			return children.toArray();
		}
	}

	private final static int TABLE_WIDTH = 400;
	private final static int TABLE_HEIGHT = 250;
	private final static int BUTTON_WIDTH = 110;
	
	private final ListenerList fSelectionListeners = new ListenerList();
	private final IServiceModelManager fManager = ServiceModelManager.getInstance();
	
	private TableViewer fTableViewer;
	private Table fTable;
	private TableColumnLayout fTableLayout;
	private Button fAddButton;
	private Button fRemoveButton;
	private Button fRenameButton;
	private Button fSelectAllButton;
	private Button fDeselectAllButton;
	
	private ISelection fSelection;
	private boolean fEnabled = true;
	private boolean fButtonsVisible = true;
	private boolean fUseCheckboxes = false;
	private Set<IService> fServices = null;
	private Set<IServiceConfiguration> fExcludedConfigs = null;
	private IServiceConfiguration[] fDisplayConfigs = null;
	private IServiceConfiguration fSelectedConfig = null;

	public ServiceConfigurationSelectionWidget(Composite parent, int style) {
		this (parent, style, null, null, true);
	}
	
	public ServiceConfigurationSelectionWidget(Composite parent, int style, 
			Set<IServiceConfiguration> excluded, Set<IService> services, boolean enableButtons) {
		super(parent, style);
		
		fServices = services;
		fUseCheckboxes = ((style & SWT.CHECK) == SWT.CHECK);
		
		GridLayout bodyLayout;
		if (enableButtons && !fUseCheckboxes) {
			bodyLayout = new GridLayout(2, false);
		} else {
			bodyLayout = new GridLayout(1, false);
		}
		bodyLayout.marginHeight = 0;
		bodyLayout.marginWidth = 0;
		setLayout(bodyLayout);
		setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL));

		Composite tableComposite = new Composite(this, SWT.NONE);
		fTableLayout = new TableColumnLayout();
		tableComposite.setLayout(fTableLayout);
		tableComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
		
		if (fUseCheckboxes) {
			fTable = new Table(tableComposite, SWT.CHECK | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
			fTableViewer = new CheckboxTableViewer(fTable);
			((CheckboxTableViewer)fTableViewer).addCheckStateListener(new ICheckStateListener() {
				public void checkStateChanged(CheckStateChangedEvent event) {
					updateControls();
				}
			});
		} else {
			fTableViewer = new TableViewer(tableComposite, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL);
			fTable = fTableViewer.getTable();
		}
		
		fTable.setLayout(new TableLayout());
		GridData data = new GridData(GridData.FILL_BOTH);
		data.heightHint = TABLE_HEIGHT;
		data.widthHint = TABLE_WIDTH;
		fTable.setLayoutData(data);
		
		/*
		 * Only add headers if there is more than one column
		 */
		if (fServices != null) {
			fTable.setHeaderVisible(true);
		}

		fTableViewer.setContentProvider(new ServiceConfigurationContentProvider());
		fTableViewer.setLabelProvider(new WorkbenchLabelProvider());
		fTableViewer.setComparator(new ServiceConfigurationComparator());
		fTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
			public void selectionChanged(SelectionChangedEvent event) {
				notifySelection(fTableViewer.getSelection());
				updateControls();
			}
		});
		
		createColumns();
		
		fTableViewer.setInput(this);
		
		if (enableButtons && !fUseCheckboxes) {
			Composite buttonsComp = new Composite(this, SWT.NONE);
			buttonsComp.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1));
			buttonsComp.setLayout(new GridLayout(1, false));
		
			fAddButton = new Button(buttonsComp, SWT.PUSH);
			data = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);
			data.widthHint = BUTTON_WIDTH;
			fAddButton.setLayoutData(data);
			fAddButton.setText(Messages.ServiceConfigurationSelectionWidget_1);
			fAddButton.addSelectionListener(new SelectionAdapter() {
				public void widgetSelected(SelectionEvent evt) {
					InputDialog dialog = new InputDialog(fAddButton.getShell(), Messages.ServiceConfigurationSelectionWidget_2, 
							Messages.ServiceConfigurationSelectionWidget_3, null, null);
					if (dialog.open() == InputDialog.OK) {
						IServiceConfiguration config = fManager.newServiceConfiguration(dialog.getValue());
						fManager.addConfiguration(config);
						fTableViewer.refresh();
					}
				}
			});
			
			fRemoveButton = new Button(buttonsComp, SWT.PUSH);
			fRemoveButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
			fRemoveButton.setText(Messages.ServiceConfigurationSelectionWidget_4);
			fRemoveButton.setEnabled(false);
			fRemoveButton.addSelectionListener(new SelectionAdapter() {
				public void widgetSelected(SelectionEvent evt) {
					IStructuredSelection selection = (IStructuredSelection)fTableViewer.getSelection();
					if (!selection.isEmpty()) {
						Object[] configs = (Object[])selection.toArray();
						String names = ""; //$NON-NLS-1$
						for (int i = 0; i < configs.length; i++) {
							if (i > 0) {
								names += ", "; //$NON-NLS-1$
							}
							names += "\"" + ((IServiceConfiguration)configs[i]).getName() + "\""; //$NON-NLS-1$ //$NON-NLS-2$
						}
						boolean doRemove = MessageDialog.openConfirm(fRemoveButton.getShell(), Messages.ServiceConfigurationSelectionWidget_9,
								NLS.bind(Messages.ServiceConfigurationSelectionWidget_10, names));
						if (doRemove) {
							for (Object config : configs) {
								fManager.remove((IServiceConfiguration)config);
							}
							fTableViewer.refresh();
						}
					}
				}
			});
			
			fRenameButton = new Button(buttonsComp, SWT.PUSH);
			fRenameButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
			fRenameButton.setText(Messages.ServiceConfigurationSelectionWidget_11);
			fRenameButton.setEnabled(false);
			fRenameButton.addSelectionListener(new SelectionAdapter() {
				public void widgetSelected(SelectionEvent evt) {
					IStructuredSelection selection = (IStructuredSelection)fTableViewer.getSelection();
					if (!selection.isEmpty()) {
						InputDialog dialog = new InputDialog(fAddButton.getShell(), Messages.ServiceConfigurationSelectionWidget_12, 
								Messages.ServiceConfigurationSelectionWidget_13, null, null);
						if (dialog.open() == InputDialog.OK) {
							IServiceConfiguration config = (IServiceConfiguration)selection.getFirstElement();
							config.setName(dialog.getValue());
							fTableViewer.update(config, null);
						}
					}
				}
			});
		}
		
		if (enableButtons && fUseCheckboxes) {
			Composite buttonsComp = new Composite(this, SWT.NONE);
			buttonsComp.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1));
			buttonsComp.setLayout(new GridLayout(2, false));
			
			fSelectAllButton = new Button(buttonsComp, SWT.PUSH);
			data = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);
			fSelectAllButton.setLayoutData(data);
			fSelectAllButton.setText(Messages.ServiceConfigurationSelectionWidget_5);
			fSelectAllButton.setEnabled(false);
			fSelectAllButton.addSelectionListener(new SelectionAdapter() {
				public void widgetSelected(SelectionEvent evt) {
					setAllChecked(true);
				}
			});
		
			fDeselectAllButton = new Button(buttonsComp, SWT.PUSH);
			data = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);
			fDeselectAllButton.setLayoutData(data);
			fDeselectAllButton.setText(Messages.ServiceConfigurationSelectionWidget_6);
			fDeselectAllButton.setEnabled(false);
			fDeselectAllButton.addSelectionListener(new SelectionAdapter() {
				public void widgetSelected(SelectionEvent evt) {
					setAllChecked(false);
				}
			});
		}
	
		fExcludedConfigs = excluded;
		fButtonsVisible = enableButtons;
		updateControls();
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
	 */
	public void addSelectionChangedListener(ISelectionChangedListener listener) {
		fSelectionListeners.add(listener);
	}
	
	/**
	 * Gets the elements that have been checked in the viewer
	 * 
	 * @return array containing the elements that are checked
	 */
	public IServiceConfiguration[] getCheckedServiceConfigurations() {
		if (fUseCheckboxes) {
			Object[] elements = ((CheckboxTableViewer)fTableViewer).getCheckedElements();
			return Arrays.asList(elements).toArray(new IServiceConfiguration[0]);
		}
		return new IServiceConfiguration[0];
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.swt.widgets.Control#getEnabled()
	 */
	@Override
	public boolean getEnabled() {
		return fEnabled;
	}
	
	/**
	 * Return the service configuration selected by the user
	 * 
	 * @return Selected service configuration
	 */
	public IServiceConfiguration getSelectedConfiguration() {
		return fSelectedConfig;
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
	 */
	public ISelection getSelection() {
		return fSelection;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
	 */
	public void removeSelectionChangedListener(ISelectionChangedListener listener) {
		fSelectionListeners.remove(listener);
	}

	/**
	 * Sets all elements in the viewer to the given checked state.
	 * 
	 * @param state
	 */
	public void setAllChecked(boolean state) {
		if (fUseCheckboxes) {
			((CheckboxTableViewer)fTableViewer).setAllChecked(state);
			notifySelection(fTableViewer.getSelection());
		}
	}

	/**
	 * Set the service configurations to display in the viewer. Passing null
	 * will display all known configurations (default).
	 * 
	 * @param configurations configurations to display, or null to display all
	 */
	public void setConfigurations(IServiceConfiguration[] configurations) {
		fDisplayConfigs = configurations;
		fTableViewer.refresh();
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.swt.widgets.Control#setEnabled(boolean)
	 */
	@Override
	public void setEnabled(boolean enabled) {
		fEnabled = enabled;
		updateControls();
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
	 */
	public void setSelection(ISelection selection) {
		fSelection = selection;
	}
	
	/**
	 * Add the named column to the viewer
	 * 
	 * @param colName name to use for the column heading
	 * @return the column
	 */
	private TableViewerColumn addColumn(String colName) {
		TableViewerColumn column = new TableViewerColumn(fTableViewer, SWT.NONE);
		column.getColumn().setResizable(true);
		column.getColumn().setMoveable(true);
		column.getColumn().setText(colName);
		PixelConverter converter = new PixelConverter(fTableViewer.getControl());
		int colWidth = converter.convertWidthInCharsToPixels(colName.length() + 1);
		fTableLayout.setColumnData(column.getColumn(), new ColumnWeightData(10, colWidth));
		return column;
	}

	/**
	 * Create the columns in the viewer. Always creates at least one column, the service
	 * configuration name. The other columns are determined by the set of services
	 * passed to the constructor.
	 */
	private void createColumns() {
		TableViewerColumn firstColumn = addColumn(Messages.ServiceConfigurationSelectionWidget_7);
		firstColumn.setLabelProvider(new ColumnLabelProvider(){
			@Override
			public String getText(Object element) {
				return ((IServiceConfiguration)element).getName();
			}
		});
		
		if (fServices != null) {
			SortedSet<IService> services = new TreeSet<IService>(new Comparator<IService>() {
				public int compare(IService o1, IService o2) {
					return o1.getName().compareTo(o2.getName());
				}
			});
			for (IService service : fServices) {
				services.add(service);
			}
			
			for (IService service : services) {
				String name = service.getName() + Messages.ServiceConfigurationSelectionWidget_8;
				final TableViewerColumn column = addColumn(name);
				column.getColumn().setData(service);
				column.setLabelProvider(new ColumnLabelProvider(){
					@Override
					public String getText(Object element) {
						IServiceConfiguration config = ((IServiceConfiguration)element);
						IService service = (IService)column.getColumn().getData();
						IServiceProvider provider = config.getServiceProvider(service);
						if (provider == null || provider.equals(service.getNullProvider())) {
							return Messages.ServiceConfigurationSelectionWidget_14;
						}
						return provider.getName();
					}
				});
			}
		}
	}
	
	/**
	 * Notify all listeners of the selection.
	 * 
	 * @param e event that was generated by the selection
	 */
	private void notifySelection(ISelection selection) {
		if (!selection.isEmpty()) {
			IStructuredSelection structuredSelection = (IStructuredSelection)selection;
			fSelectedConfig = (IServiceConfiguration)structuredSelection.getFirstElement();
		} else {
			fSelectedConfig = null;
		}
		setSelection(selection);
		SelectionChangedEvent event = new SelectionChangedEvent(this, getSelection());
		for (Object listener : fSelectionListeners.getListeners()) {
			((ISelectionChangedListener) listener).selectionChanged(event);
		}
	}
	
	/**
	 * Update buttons when something changes
	 */
	private void updateControls() {
		fTable.setEnabled(fEnabled);
		if (!fUseCheckboxes && fButtonsVisible) {
			fAddButton.setEnabled(fEnabled);
			boolean enabled = fEnabled && getSelectedConfiguration() != null;
			fRemoveButton.setEnabled(enabled);
			fRenameButton.setEnabled(enabled);
		} else if (fButtonsVisible) {
			fSelectAllButton.setEnabled(fEnabled);
			fDeselectAllButton.setEnabled(fEnabled);
		}
	}
}
