/*=============================================================================#
 # Copyright (c) 2010, 2019 Stephan Wahlbrink and others.
 # 
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
 # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
 # which is available at https://www.apache.org/licenses/LICENSE-2.0.
 # 
 # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
 # 
 # Contributors:
 #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
 #=============================================================================*/

package org.eclipse.statet.internal.r.ui.rhelp;

import java.util.List;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ICheckStateProvider;
import org.eclipse.jface.viewers.TableViewerColumn;
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.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.SelectionDialog;
import org.eclipse.ui.internal.IWorkbenchHelpContextIds;

import org.eclipse.statet.ecommons.ui.components.SearchText;
import org.eclipse.statet.ecommons.ui.content.SearchTextBinding;
import org.eclipse.statet.ecommons.ui.content.TableFilterController;
import org.eclipse.statet.ecommons.ui.content.TextElementFilter;
import org.eclipse.statet.ecommons.ui.util.LayoutUtils;
import org.eclipse.statet.ecommons.ui.viewers.ViewerUtils;
import org.eclipse.statet.ecommons.ui.viewers.ViewerUtils.CheckboxTableComposite;

import org.eclipse.statet.rhelp.core.RPkgHelp;


public class PackageSelectionDialog extends SelectionDialog {
	
	
	private final List<RPkgHelp> input;
	
	private SearchText filterText;
	private CheckboxTableViewer viewer;
	private TableFilterController filterController;
	
	private final List<RPkgHelp> selection;
	
	
	
	protected PackageSelectionDialog(final Shell parentShell,
			final List<RPkgHelp> packages, final List<RPkgHelp> initialSelection) {
		super(parentShell);
		this.input= packages;
		this.selection= initialSelection;
		setTitle(Messages.PackageSelection_title);
		setMessage(Messages.PackageSelection_message);
	}
	
	
	@Override
	protected void configureShell(final Shell shell) {
		super.configureShell(shell);
		PlatformUI.getWorkbench().getHelpSystem().setHelp(shell,
				IWorkbenchHelpContextIds.LIST_SELECTION_DIALOG);
	}
	
	@Override
	protected Control createDialogArea(final Composite parent) {
		final Composite composite= new Composite(parent, SWT.NONE);
		composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
		composite.setLayout(LayoutUtils.newDialogGrid(1));
		
		initializeDialogUnits(composite);
		
		createMessageArea(composite);
		
		this.filterText= new SearchText(composite);
		this.filterText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
		this.filterText.setMessage("Filter");
		
		final CheckboxTableComposite tableComposite= new CheckboxTableComposite(composite,
				SWT.BORDER | SWT.FULL_SELECTION | SWT.V_SCROLL | SWT.VIRTUAL);
		final GridData data= new GridData(SWT.FILL, SWT.FILL, true, true);
		data.heightHint= LayoutUtils.hintHeight(tableComposite.table, 10);
		data.widthHint= LayoutUtils.hintWidth(tableComposite.table, 40);
		tableComposite.setLayoutData(data);
		this.viewer= tableComposite.viewer;
		
		final TableViewerColumn column= tableComposite.addColumn("Name", SWT.LEFT, new ColumnWeightData(1));
		column.setLabelProvider(new RHelpLabelProvider());
		ColumnViewerToolTipSupport.enableFor(tableComposite.viewer);
		
		this.viewer.addCheckStateListener(new ICheckStateListener() {
			@Override
			public void checkStateChanged(final CheckStateChangedEvent event) {
				final Object element= event.getElement();
				if (element instanceof RPkgHelp) {
					final RPkgHelp pkg= (RPkgHelp) element;
					if (!PackageSelectionDialog.this.selection.remove(pkg)) {
						PackageSelectionDialog.this.selection.add(pkg);
					}
				}
			}
		});
		this.viewer.setCheckStateProvider(new ICheckStateProvider() {
			@Override
			public boolean isGrayed(final Object element) {
				return false;
			}
			@Override
			public boolean isChecked(final Object element) {
				return PackageSelectionDialog.this.selection.contains(element);
			}
		});
		
		this.filterController= new TableFilterController(this.viewer);
		
		{	final TextElementFilter filter= new TextElementFilter();
			this.filterController.setFilter(0, filter);
			new SearchTextBinding(this.filterText, this.filterController, filter);
		}
		this.filterController.setInput(this.input);
		
		ViewerUtils.installSearchTextNavigation(this.viewer, this.filterText, true);
		
		final Button clearAllControl= new Button(composite, SWT.PUSH);
		final GridData gd= new GridData(SWT.LEFT, SWT.CENTER, false, false);
		gd.widthHint= LayoutUtils.hintWidth(clearAllControl);
		clearAllControl.setLayoutData(gd);
		clearAllControl.setText(Messages.PackageSelection_ClearAll_label);
		clearAllControl.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(final SelectionEvent e) {
				PackageSelectionDialog.this.selection.clear();
				PackageSelectionDialog.this.viewer.refresh();
			}
		});
		
		Dialog.applyDialogFont(composite);
		
		return composite;
	}
	
	@Override
	protected void okPressed() {
		super.okPressed();
		setSelectionResult(this.selection.toArray(new RPkgHelp[this.selection.size()]));
	}
	
	@Override
	public RPkgHelp[] getResult() {
		return (RPkgHelp[]) super.getResult();
	}
	
}
