package org.eclipse.wst.xsl.jaxp.debug.ui.internal.tabs.processor;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.StatusDialog;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
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.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Text;
import org.eclipse.wst.xsl.jaxp.launching.IAttribute;
import org.eclipse.wst.xsl.jaxp.launching.IProcessorType;
import org.eclipse.wst.xsl.jaxp.launching.JAXPRuntime;
import org.eclipse.wst.xsl.jaxp.launching.LaunchAttributes;
import org.eclipse.wst.xsl.launching.config.LaunchAttribute;

public class AttributeDialog extends StatusDialog
{
	private Table table;
	private TableViewer tViewer;
	private Text text;
	private List<IAttribute> attributes = new ArrayList<IAttribute>();
	private List<IAttribute> selectedAttributes = new ArrayList<IAttribute>();

	public AttributeDialog(Shell parent, LaunchAttributes launchAttributes)
	{
		super(parent);
		setTitle("Select Processor Attributes");
		
		Set<String> attributeSet = new HashSet<String>();
		for (LaunchAttribute att : launchAttributes.getAttributes())
		{
			attributeSet.add(att.uri);
		}
		for (IProcessorType type : JAXPRuntime.getProcessorTypes())
		{
			for (IAttribute attribute : type.getAttributes())
			{
				if (!attributeSet.contains(attribute.getURI()))
				{
					attributeSet.add(attribute.getURI());
					attributes.add(attribute);
				}
			}
		}
	}
	
	@Override
	protected Control createDialogArea(Composite parent)
	{
		Composite comp = new Composite(parent,SWT.NONE);
		GridData gd = new GridData(SWT.FILL,SWT.FILL,true,true);
		gd.widthHint = 400;
		comp.setLayoutData(gd);
		comp.setLayout(new GridLayout());
		
		Label label = new Label(comp,SWT.NONE);
		label.setText("Select one or more attributes to set on the XSLT processor.");
		
		
		table = new Table(comp,SWT.BORDER | SWT.FULL_SELECTION | SWT.V_SCROLL | SWT.MULTI);
		table.setHeaderVisible(false);
		gd = new GridData(SWT.FILL,SWT.FILL,true,true);
		gd.verticalIndent = 10;
		gd.heightHint = 200;
		table.setLayoutData(gd);
		
		tViewer = new TableViewer(table);
		tViewer.setContentProvider(new IStructuredContentProvider()
		{
			public Object[] getElements(Object inputElement)
			{
				return attributes.toArray(new IAttribute[0]);
			}

			public void dispose()
			{
			}

			public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
			{
			}
		});
		tViewer.setLabelProvider(new LabelProvider(){
			@Override
			public String getText(Object element)
			{
				IAttribute attribute = (IAttribute)element;
				return attribute.getURI();
			}
		});
		tViewer.setSorter(new ViewerSorter()
		{
			@Override
			public int compare(Viewer viewer, Object e1, Object e2)
			{
				IAttribute a1 = (IAttribute) e1;
				IAttribute a2 = (IAttribute) e2;
				return a1.getURI().compareTo(a2.getURI());
			}
		});
		tViewer.addSelectionChangedListener(new ISelectionChangedListener(){
			public void selectionChanged(SelectionChangedEvent event)
			{
				IStructuredSelection sel = (IStructuredSelection)event.getSelection();
				selectedAttributes = sel.toList();
				if (sel.isEmpty())
					text.setText("");
				else
				{
					IAttribute attribute = (IAttribute)sel.getFirstElement(); 
					text.setText(attribute.getDescription());
				}
			}
		});
		tViewer.addDoubleClickListener(new IDoubleClickListener(){
			public void doubleClick(DoubleClickEvent event)
			{
				buttonPressed(IDialogConstants.OK_ID);
			}
		});
		tViewer.setInput(attributes);
		
		text = new Text(comp,SWT.BORDER | SWT.WRAP | SWT.READ_ONLY | SWT.V_SCROLL);
		text.setEditable(false);
		gd = new GridData(SWT.FILL,SWT.FILL,true,false);
		gd.heightHint = 80;
		text.setLayoutData(gd);
		
		if (attributes.size() > 0)
		{
			tViewer.setSelection(new StructuredSelection(tViewer.getElementAt(0)), true);
		}
		
		return comp;
	}
	
	public List<IAttribute> getAttributes()
	{
		return selectedAttributes;
	}
}
