package org.eclipse.cdt.internal.ui.dialogs;

/*
 * (c) Copyright IBM Corp. 2000, 2001.
 * All Rights Reserved.
 */
 
import java.util.Arrays;
import java.util.List;

import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;

import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ILabelProvider;

/**
 * A class to select one or more elements out of an indexed property
 */
public class ElementListSelectionDialog extends AbstractElementListSelectionDialog {
	
	private List fElements;
	
	/*
	 * @private
	 */
	protected void computeResult() {
		setResult(getWidgetSelection());
	}
	/*
	 * @private
	 */	
	protected Control createDialogArea(Composite parent) {
		Control result= super.createDialogArea(parent);
		
		setSelectionListElements(fElements, false);
	  	//a little trick to make the window come up faster
	  	String initialFilter= null;
	  	if (getPrimaryInitialSelection() instanceof String)
			initialFilter= (String)getPrimaryInitialSelection();
	  	if (initialFilter != null)
	  		setFilter(initialFilter, true);
	  	else
	  		refilter();
	  				
		return result;
	}
	public Object getSelectedElement() {
		return getPrimaryResult();
	}
	public Object[] getSelectedElements() {
		return getResult();
	}
	/*
	 * @private
	 */	
	protected void handleDoubleClick() {
		if (verifyCurrentSelection()) {
			buttonPressed(IDialogConstants.OK_ID);
		}
	}
	/**
	 * Constructs a list selection dialog.
	 * @param renderer The label renderer used
	 * @param ignoreCase Decides if the match string ignores lower/upper case
	 * @param multipleSelection Allow multiple selection	 
	 */
	public ElementListSelectionDialog(Shell parent, String title, Image image, ILabelProvider renderer, boolean ignoreCase, boolean multipleSelection) {
		super (parent, title, image, renderer, ignoreCase, multipleSelection);
	}
	/**
	 * Constructs a list selection dialog.
	 * @param renderer The label renderer used
	 * @param ignoreCase Decides if the match string ignores lower/upppr case
	 * @param multipleSelection Allow multiple selection	 
	 */
	public ElementListSelectionDialog(Shell parent, ILabelProvider renderer, boolean ignoreCase, boolean multipleSelection) {
		this(parent, "", null, renderer, ignoreCase, multipleSelection); //$NON-NLS-1$
	}
	public int open(Object[] elements) {
		return open(Arrays.asList(elements));
	}
	public int open(Object[] elements, String initialSelection) {
		return open(Arrays.asList(elements), initialSelection);
	}
	/**
	 * Open the dialog.
	 * @param elements The elements to show in the list
	 * @return Returns OK or CANCEL
	 */	
	public int open(List elements) {
		setElements(elements);
		return open();
	}
	/**
	 * Open the dialog.
	 * @param elements The elements to show in the list
	 * @param initialSelection The initial content of the match text box.
	 * @return Returns OK or CANCEL
	 */
	public int open(List elements, String initialSelection) {
		setElements(elements);
		setInitialSelection(initialSelection);
		return open();
	}
	/**
	 * Sets the elements presented by this dialog.
	 */
	public void setElements(List elements) {
		fElements= elements;	
	}
}
