/*******************************************************************************
 * Copyright (c) 2003, 2005 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
 *******************************************************************************/
/*
 * Created on Feb 9, 2004
 *  
 */
package org.eclipse.ui.navigator.internal.filters;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.navigator.CommonNavigator;
import org.eclipse.ui.navigator.CommonViewer;
import org.eclipse.ui.navigator.INavigatorContentDescriptor;
import org.eclipse.ui.navigator.INavigatorContentService;
import org.eclipse.ui.navigator.NavigatorActivationService;
import org.eclipse.ui.navigator.internal.CommonNavigatorMessages;
import org.eclipse.ui.navigator.internal.Utilities;
import org.eclipse.ui.navigator.internal.extensions.NavigatorContentDescriptor;
import org.eclipse.ui.navigator.internal.extensions.NavigatorContentDescriptorManager;

/**
 * <p>
 * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
 * part of a work in progress. There is a guarantee neither that this API will
 * work nor that it will remain the same. Please do not use this API without
 * consulting with the Platform/UI team.
 * </p>
 * 
 * @since 3.2
 * 
 */
public class CommonFilterSelectionDialog extends Dialog {

	private static final NavigatorActivationService NAVIGATOR_ACTIVATION_SERVICE = NavigatorActivationService
			.getInstance();

	private static final NavigatorContentDescriptorManager CONTENT_DESCRIPTOR_REGISTRY = NavigatorContentDescriptorManager
			.getInstance();

	private static final Object[] NO_CHILDREN = new Object[0];

	private CheckboxTableViewer extensionsCheckboxTableViewer;

	private Text descriptionText;

	private ISelectionChangedListener updateDescriptionSelectionListener;

	private TabFolder filtersTabFolder;

	private CheckboxTableViewer filtersCheckboxTableViewer;

	private CommonNavigator commonNavigator;

	private final CommonViewer commonViewer;

	private final INavigatorContentService contentService;

	/**
	 * @param arg0
	 */
	public CommonFilterSelectionDialog(CommonNavigator aCommonNavigator) {
		super(aCommonNavigator.getSite().getShell());
		setShellStyle(SWT.RESIZE | getShellStyle());

		commonNavigator = aCommonNavigator;
		commonViewer = commonNavigator.getCommonViewer();
		contentService = commonViewer.getNavigatorContentService();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
	 */
	protected Control createDialogArea(Composite parent) {
		getShell().setText(
				CommonNavigatorMessages.CommonFilterSelectionDialog_0);
		Composite superComposite = (Composite) super.createDialogArea(parent);

		createFiltersTabFolder(superComposite);

		Composite extensionsComposite = createContainerComposite(filtersTabFolder);
		/* createTitleLabel(extensionsComposite); */
		createExtensionsTableViewer(extensionsComposite);

		Composite filtersComposite = createContainerComposite(filtersTabFolder);
		createFiltersTableViewer(filtersComposite);

		createDescriptionText(superComposite);

		createTabItem(filtersTabFolder,
				CommonNavigatorMessages.CommonFilterSelectionDialog_0,
				filtersComposite);
		createTabItem(filtersTabFolder,
				CommonNavigatorMessages.CommonFilterSelectionDialog_1,
				extensionsComposite);

		descriptionText.setBackground(superComposite.getBackground());

		updateCheckedItems();

		return extensionsComposite;
	}

	/**
	 * @param superComposite
	 */
	private void createFiltersTabFolder(Composite superComposite) {
		filtersTabFolder = new TabFolder(superComposite, SWT.RESIZE);
		createStandardLayout(filtersTabFolder);
		filtersTabFolder.addSelectionListener(new SelectionListener() {

			public void widgetSelected(SelectionEvent e) {
				descriptionText.setText(""); //$NON-NLS-1$
			}

			public void widgetDefaultSelected(SelectionEvent e) {

			}

		});
	}

	/**
	 * @param filtersTabFolderArg
	 * @param composite
	 */
	private void createTabItem(TabFolder filtersTabFolderArg, String label,
			Composite composite) {
		TabItem extensionsTabItem = new TabItem(filtersTabFolderArg, SWT.NONE);
		extensionsTabItem.setText(label);
		extensionsTabItem.setControl(composite);
	}

	/**
	 * @param composite
	 */
	private void createStandardLayout(Composite composite) {
		GridLayout layout = new GridLayout();
		layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
		layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
		layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
		layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
		layout.numColumns = 1;
		composite.setLayout(layout);
		composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
	}

	/**
	 * @param superComposite
	 * @return
	 */
	private Composite createContainerComposite(Composite superComposite) {
		Composite composite = new Composite(superComposite, SWT.RESIZE);

		createStandardLayout(composite);
		return composite;
	}

	/**
	 * @param composite
	 */
	private void createExtensionsInstructionsLabel(Composite composite) {
		Label extensionsInstructionLabel = new Label(composite, SWT.BOLD
				| SWT.V_SCROLL);
		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
		gridData.heightHint = convertHeightInCharsToPixels(1) + 3;
		gridData.horizontalIndent = convertHorizontalDLUsToPixels(2);
		/* gridData.verticalSpan = convertVerticalDLUsToPixels(2); */
		gridData.verticalAlignment = GridData.VERTICAL_ALIGN_FILL;
		gridData.horizontalAlignment = GridData.HORIZONTAL_ALIGN_FILL;

		extensionsInstructionLabel.setLayoutData(gridData);
		extensionsInstructionLabel
				.setText(CommonNavigatorMessages.CommonFilterSelectionDialog_3);
	}

	/**
	 * @param composite
	 */
	private void createFiltersInstructionsLabel(Composite composite) {
		Label filtersInstructionLabel = new Label(composite, SWT.BOLD
				| SWT.V_SCROLL);
		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
		gridData.heightHint = convertHeightInCharsToPixels(1) + 3;
		gridData.horizontalIndent = convertHorizontalDLUsToPixels(2);
		/* gridData.verticalSpan = convertVerticalDLUsToPixels(2); */
		gridData.verticalAlignment = GridData.VERTICAL_ALIGN_FILL;
		gridData.horizontalAlignment = GridData.HORIZONTAL_ALIGN_FILL;

		filtersInstructionLabel.setLayoutData(gridData);
		filtersInstructionLabel
				.setText(CommonNavigatorMessages.CommonFilterSelectionDialog_4);
	}

	/**
	 * @param composite
	 */
	private void createDescriptionText(Composite composite) {
		descriptionText = new Text(composite, SWT.WRAP | SWT.V_SCROLL
				| SWT.BORDER);
		GridData descriptionTextGridData = new GridData(
				GridData.FILL_HORIZONTAL);
		descriptionTextGridData.heightHint = convertHeightInCharsToPixels(3);
		descriptionText.setLayoutData(descriptionTextGridData);
	}

	/**
	 * @param composite
	 */
	private void createFiltersTableViewer(Composite composite) {
		filtersCheckboxTableViewer = CheckboxTableViewer.newCheckList(
				composite, SWT.BORDER | SWT.RESIZE | SWT.FULL_SELECTION);

		filtersCheckboxTableViewer
				.setContentProvider(new CommonFilterContentProvider());
		filtersCheckboxTableViewer
				.setLabelProvider(new CommonFilterLabelProvider());
		filtersCheckboxTableViewer.setInput(contentService);

		createFiltersInstructionsLabel(composite);

		createCheckboxTable(filtersCheckboxTableViewer);
	}

	/**
	 * @param composite
	 */
	private void createExtensionsTableViewer(Composite composite) {
		extensionsCheckboxTableViewer = CheckboxTableViewer.newCheckList(
				composite, SWT.BORDER | SWT.RESIZE);

		extensionsCheckboxTableViewer
				.setContentProvider(new ExtensionContentProvider());
		extensionsCheckboxTableViewer
				.setLabelProvider(new CommonFilterLabelProvider());
		extensionsCheckboxTableViewer.setInput(contentService);

		createExtensionsInstructionsLabel(composite);

		createCheckboxTable(extensionsCheckboxTableViewer);
	}

	/**
	 * 
	 */
	private void createCheckboxTable(CheckboxTableViewer tableViewer) {
		Table table = tableViewer.getTable();
		GridLayout tableLayout = new GridLayout();
		tableLayout.marginHeight = 0; // convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
		tableLayout.marginWidth = 0; // convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
		tableLayout.verticalSpacing = 0; // convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
		tableLayout.horizontalSpacing = 0; // convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
		tableLayout.numColumns = 2;
		GridData tableGridData = new GridData(GridData.FILL_BOTH);
		tableGridData.widthHint = convertHorizontalDLUsToPixels(100);
		tableGridData.heightHint = convertVerticalDLUsToPixels(50);
		table.setLayout(tableLayout);
		table.setLayoutData(tableGridData);
	}

	public class UpdateDescriptionListener implements ISelectionChangedListener {

		/*
		 * (non-Javadoc)
		 * 
		 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
		 */
		public void selectionChanged(SelectionChangedEvent event) {

			IStructuredSelection structuredSelection = (IStructuredSelection) event
					.getSelection();
			Object element = structuredSelection.getFirstElement();
			if (element instanceof NavigatorContentDescriptor) {
				INavigatorContentDescriptor ncd = (INavigatorContentDescriptor) element;
				String desc = NLS.bind(
						CommonNavigatorMessages.CommonFilterSelectionDialog_2,
						new Object[] { ncd.getName() });
				descriptionText.setText(desc);
			} else if (element instanceof ExtensionFilterDescriptor) {
				ExtensionFilterDescriptor efd = (ExtensionFilterDescriptor) element;
				descriptionText.setText(efd.getDescription());
			}

		}

	}

	/**
	 * 
	 */
	protected void updateCheckedItems() {

		extensionsCheckboxTableViewer
				.addSelectionChangedListener(getSelectionListener());
		filtersCheckboxTableViewer
				.addSelectionChangedListener(getSelectionListener());

		updateExtensionsCheckState();
		updateFiltersCheckState();
	}

	/**
	 * 
	 */
	private void updateExtensionsCheckState() {
		NavigatorContentDescriptor descriptor;
		boolean enabled;

		TableItem[] descriptorTableItems = extensionsCheckboxTableViewer
				.getTable().getItems();
		for (int i = 0; i < descriptorTableItems.length; i++) {
			if (descriptorTableItems[i].getData() instanceof NavigatorContentDescriptor) {
				descriptor = (NavigatorContentDescriptor) descriptorTableItems[i]
						.getData();
				enabled = NAVIGATOR_ACTIVATION_SERVICE
						.isNavigatorExtensionActive(contentService
								.getViewerId(), descriptor.getId());
				extensionsCheckboxTableViewer.setChecked(descriptor, enabled);
			}
		}
	}

	/**
	 * 
	 */
	private void updateFiltersCheckState() {
		IStructuredContentProvider contentProvider = (IStructuredContentProvider) filtersCheckboxTableViewer
				.getContentProvider();
		Object[] children = contentProvider.getElements(contentService);
		ExtensionFilterViewerRegistry filterRegistry = ExtensionFilterRegistryManager
				.getInstance().getViewerRegistry(contentService.getViewerId());
		ExtensionFilterDescriptor filterDescriptor = null;
		for (int i = 0; i < children.length; i++) {
			filterDescriptor = (ExtensionFilterDescriptor) children[i];
			filtersCheckboxTableViewer.setChecked(children[i], filterRegistry
					.getActivationManager().isFilterActive(filterDescriptor));
		}
	}

	/**
	 * @return
	 */
	private ISelectionChangedListener getSelectionListener() {
		if (updateDescriptionSelectionListener == null)
			updateDescriptionSelectionListener = new UpdateDescriptionListener();
		return updateDescriptionSelectionListener;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jface.dialogs.Dialog#okPressed()
	 */
	protected void okPressed() {

		boolean updateExtensionActivation = false;
		boolean updateFilterActivation = false;
		boolean enabled = false;
		NavigatorContentDescriptor descriptor = null;
		ExtensionFilterDescriptor filterDescriptor = null;

		ExtensionFilterViewerRegistry filterRegistry = ExtensionFilterRegistryManager
				.getInstance().getViewerRegistry(contentService.getViewerId());
		TableItem[] extensionTableItems = extensionsCheckboxTableViewer
				.getTable().getItems();
		for (int descriptorIndex = 0; descriptorIndex < extensionTableItems.length; descriptorIndex++) {

			if (extensionTableItems[descriptorIndex].getData() instanceof NavigatorContentDescriptor) {
				descriptor = (NavigatorContentDescriptor) extensionTableItems[descriptorIndex]
						.getData();

				enabled = extensionsCheckboxTableViewer.getChecked(descriptor);
				if (enabled != NAVIGATOR_ACTIVATION_SERVICE
						.isNavigatorExtensionActive(contentService
								.getViewerId(), descriptor.getId())) {
					updateExtensionActivation = true;
					NAVIGATOR_ACTIVATION_SERVICE.activateNavigatorExtension(
							contentService.getViewerId(), descriptor.getId(),
							enabled);
				}
			}
		}

		TableItem[] filterTableItems = filtersCheckboxTableViewer.getTable()
				.getItems();
		for (int descriptorIndex = 0; descriptorIndex < filterTableItems.length; descriptorIndex++) {

			if (filterTableItems[descriptorIndex].getData() instanceof ExtensionFilterDescriptor) {
				filterDescriptor = (ExtensionFilterDescriptor) filterTableItems[descriptorIndex]
						.getData();
				enabled = filtersCheckboxTableViewer
						.getChecked(filterDescriptor);
				if (filterRegistry.getActivationManager().isFilterActive(
						filterDescriptor) != enabled) {
					updateFilterActivation = true;
					filterRegistry.getActivationManager().activateFilter(
							filterDescriptor, enabled);
				}
			}
		}
		if (updateExtensionActivation)
			NAVIGATOR_ACTIVATION_SERVICE
					.persistExtensionActivations(contentService.getViewerId());
		if (updateFilterActivation)
			filterRegistry.getActivationManager().persistFilterActivations();
		if (updateExtensionActivation || updateFilterActivation) {
			contentService.update();
			// the action providers may no longer be enabled, so we reset the selection.
			commonViewer.setSelection(StructuredSelection.EMPTY);
		}

		super.okPressed();
	}

	class ExtensionContentProvider implements ITreeContentProvider {

 		public void inputChanged(Viewer aViewer, Object anOldInput,
				Object aNewInput) {
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
		 */
		public Object[] getChildren(Object aParentElement) {
			return NO_CHILDREN;
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
		 */
		public Object getParent(Object anElement) {
			return null;
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
		 */
		public boolean hasChildren(Object anElement) {
			return getChildren(anElement).length != 0;
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
		 */
		public Object[] getElements(Object anInputElement) {
			List results = new ArrayList();
			INavigatorContentDescriptor[] descriptors = CONTENT_DESCRIPTOR_REGISTRY
					.getAllContentDescriptors();
			for (int i = 0; i < descriptors.length; i++)
				if (Utilities.isVisible(contentService
								.getViewerDescriptor(), descriptors[i]))
					results.add(descriptors[i]);

			return results.size() > 0 ? results.toArray() : NO_CHILDREN;
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
		 */
		public void dispose() {

		}

	}
}
