/*=============================================================================#
# Copyright (c) 2010-2016 Stephan Wahlbrink (WalWare.de) 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:
# Stephan Wahlbrink - initial API and implementation
#=============================================================================*/
package de.walware.statet.r.internal.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 de.walware.ecommons.ui.components.SearchText;
import de.walware.ecommons.ui.content.SearchTextBinding;
import de.walware.ecommons.ui.content.TableFilterController;
import de.walware.ecommons.ui.content.TextElementFilter;
import de.walware.ecommons.ui.util.LayoutUtil;
import de.walware.ecommons.ui.util.ViewerUtil;
import de.walware.ecommons.ui.util.ViewerUtil.CheckboxTableComposite;
import de.walware.statet.r.core.rhelp.IRPkgHelp;
public class PackageSelectionDialog extends SelectionDialog {
private final List<IRPkgHelp> fInput;
private SearchText fFilterText;
private CheckboxTableViewer fViewer;
private TableFilterController fFilterController;
private final List<IRPkgHelp> fSelection;
protected PackageSelectionDialog(final Shell parentShell,
final List<IRPkgHelp> packages, final List<IRPkgHelp> initialSelection) {
super(parentShell);
fInput = packages;
fSelection = 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(LayoutUtil.createDialogGrid(1));
initializeDialogUnits(composite);
createMessageArea(composite);
fFilterText = new SearchText(composite);
fFilterText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
fFilterText.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 = LayoutUtil.hintHeight(tableComposite.table, 10);
data.widthHint = LayoutUtil.hintWidth(tableComposite.table, 40);
tableComposite.setLayoutData(data);
fViewer = tableComposite.viewer;
final TableViewerColumn column = tableComposite.addColumn("Name", SWT.LEFT, new ColumnWeightData(1));
column.setLabelProvider(new RHelpLabelProvider());
ColumnViewerToolTipSupport.enableFor(tableComposite.viewer);
fViewer.addCheckStateListener(new ICheckStateListener() {
@Override
public void checkStateChanged(final CheckStateChangedEvent event) {
final Object element = event.getElement();
if (element instanceof IRPkgHelp) {
final IRPkgHelp pkg = (IRPkgHelp) element;
if (!fSelection.remove(pkg)) {
fSelection.add(pkg);
}
}
}
});
fViewer.setCheckStateProvider(new ICheckStateProvider() {
@Override
public boolean isGrayed(final Object element) {
return false;
}
@Override
public boolean isChecked(final Object element) {
return fSelection.contains(element);
}
});
fFilterController = new TableFilterController(fViewer);
{ final TextElementFilter filter = new TextElementFilter();
fFilterController.setFilter(0, filter);
new SearchTextBinding(fFilterText, fFilterController, filter);
}
fFilterController.setInput(fInput);
ViewerUtil.installSearchTextNavigation(fViewer, fFilterText, true);
final Button clearAllControl = new Button(composite, SWT.PUSH);
final GridData gd = new GridData(SWT.LEFT, SWT.CENTER, false, false);
gd.widthHint = LayoutUtil.hintWidth(clearAllControl);
clearAllControl.setLayoutData(gd);
clearAllControl.setText(Messages.PackageSelection_ClearAll_label);
clearAllControl.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
fSelection.clear();
fViewer.refresh();
}
});
Dialog.applyDialogFont(composite);
return composite;
}
@Override
protected void okPressed() {
super.okPressed();
setSelectionResult(fSelection.toArray(new IRPkgHelp[fSelection.size()]));
}
@Override
public IRPkgHelp[] getResult() {
return (IRPkgHelp[]) super.getResult();
}
}