/*=============================================================================#
 # 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.setToolTipText("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();
	}
	
}
