blob: 00f1a6518e1fd292012af02ec15d7be3c9749ad7 [file] [log] [blame]
/*=============================================================================#
# 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();
}
}