/*******************************************************************************
 * Copyright (c) 2000, 2006 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.jdt.internal.ui.search;

import java.util.Arrays;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
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.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.SelectionStatusDialog;

public class FiltersDialog extends SelectionStatusDialog {

	private CheckboxTableViewer fListViewer;
	private JavaSearchResultPage fPage;
	private Button fLimitElementsCheckbox;
	private Text fLimitElementsField;
	
	private int fLimitElementCount= 1000;
	private boolean fLimitElements= false;

	public FiltersDialog(JavaSearchResultPage page) {
		super(page.getSite().getShell());
		setTitle(org.eclipse.jdt.internal.ui.search.SearchMessages.FiltersDialog_title); 
		setStatusLineAboveButtons(true);
		setShellStyle(getShellStyle() | SWT.RESIZE);
		fPage = page;
	}

	public MatchFilter[] getEnabledFilters() {
		Object[] result = getResult();
		MatchFilter[] filters = new MatchFilter[result.length];
		System.arraycopy(result, 0, filters, 0, filters.length);
		return filters;
	}

	public boolean isLimitEnabled() {
		return fLimitElements;
	}

	/**
	 * @return returns the number of entries to limit the filters entry to
	 */
	public int getElementLimit() {
		return fLimitElementCount;
	}

	/*
	 * (non-Javadoc) Method declared on Dialog.
	 */
	protected Control createDialogArea(Composite composite) {
		Composite parent = (Composite) super.createDialogArea(composite);
		initializeDialogUnits(composite);

		createTableLimit(parent);
		// Create list viewer
		Label l= new Label(parent, SWT.NONE);
		l.setFont(parent.getFont());
		l.setText(org.eclipse.jdt.internal.ui.search.SearchMessages.FiltersDialog_filters_label); 
		
		Table table = new Table(parent, SWT.CHECK | SWT.BORDER);
		table.setFont(parent.getFont());
		fListViewer = new CheckboxTableViewer(table);
		

		GridData data = new GridData(GridData.FILL_BOTH);
		data.minimumHeight= convertHeightInCharsToPixels(8);
		table.setLayoutData(data);

		fListViewer.setLabelProvider(new LabelProvider() {
			public String getText(Object element) {
				// Return the features's label.
				return ((MatchFilter) element).getName();
			}
		});

		// Set the content provider
		ArrayContentProvider cp = new ArrayContentProvider();
		fListViewer.setContentProvider(cp);
		fListViewer.setInput(MatchFilter.allFilters());
		fListViewer.setCheckedElements(fPage.getMatchFilters());

		l= new Label(parent, SWT.NONE);
		l.setFont(parent.getFont());
		l.setText(org.eclipse.jdt.internal.ui.search.SearchMessages.FiltersDialog_description_label); 
		final Text description = new Text(parent, SWT.LEFT | SWT.WRAP | SWT.MULTI | SWT.READ_ONLY | SWT.BORDER | SWT.V_SCROLL);
		description.setFont(parent.getFont());
		data = new GridData(GridData.FILL_HORIZONTAL);
		data.heightHint = convertHeightInCharsToPixels(3);
		description.setLayoutData(data);
		fListViewer.addSelectionChangedListener(new ISelectionChangedListener() {
			public void selectionChanged(SelectionChangedEvent event) {
				Object selectedElement = ((IStructuredSelection) event.getSelection()).getFirstElement();
				if (selectedElement != null)
					description.setText(((MatchFilter) selectedElement).getDescription());
				else
					description.setText(""); //$NON-NLS-1$
			}
		});
		return parent;
	}


	private void createTableLimit(Composite ancestor) {
		Composite parent = new Composite(ancestor, SWT.NONE);
		GridLayout gl = new GridLayout();
		gl.numColumns = 2;
		gl.marginWidth = 0;
		gl.marginHeight = 0;
		parent.setLayout(gl);
		GridData gd = new GridData();
		gd.horizontalSpan = 2;
		parent.setLayoutData(gd);

		fLimitElementsCheckbox = new Button(parent, SWT.CHECK);
		fLimitElementsCheckbox.setText(org.eclipse.jdt.internal.ui.search.SearchMessages.FiltersDialog_limit_label);  
		fLimitElementsCheckbox.setLayoutData(new GridData());

		fLimitElementsField = new Text(parent, SWT.BORDER);
		gd = new GridData();
		gd.widthHint = convertWidthInCharsToPixels(6);
		fLimitElementsField.setLayoutData(gd);

		applyDialogFont(parent);

		fLimitElementsCheckbox.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent e) {
				updateLimitValueEnablement();
			}

		});

		fLimitElementsField.addKeyListener(new KeyAdapter() {
			public void keyReleased(KeyEvent e) {
				validateText();
			}
		});
		initLimit();
	}

	private void initLimit() {
		boolean limit = fPage.limitElements();
		int count = fPage.getElementLimit();
		fLimitElementsCheckbox.setSelection(limit);
		fLimitElementsField.setText(String.valueOf(count));

		updateLimitValueEnablement();
	}

	private void updateLimitValueEnablement() {
		fLimitElementsField.setEnabled(fLimitElementsCheckbox.getSelection());
	}

	protected void validateText() {
		String text = fLimitElementsField.getText();
		int value = -1;
		try {
			value = Integer.valueOf(text).intValue();
		} catch (NumberFormatException e) {

		}
		if (fLimitElementsCheckbox.getSelection() && value <= 0)
			updateStatus(new Status(IStatus.ERROR, JavaPlugin.getPluginId(), 0, org.eclipse.jdt.internal.ui.search.SearchMessages.FiltersDialog_limit_error, null)); 
		else
			updateStatus(new Status(IStatus.OK, JavaPlugin.getPluginId(), 0, "", null)); //$NON-NLS-1$
	}

	protected void computeResult() {
		fLimitElementCount= Integer.valueOf(fLimitElementsField.getText()).intValue();
		fLimitElements= fLimitElementsCheckbox.getSelection();

		setResult(Arrays.asList(fListViewer.getCheckedElements()));
	}
}
