de.walware.statet.r.internal.ui.rhelp.PackageSelectionDialog.java Source code

Java tutorial

Introduction

Here is the source code for de.walware.statet.r.internal.ui.rhelp.PackageSelectionDialog.java

Source

/*=============================================================================#
 # Copyright (c) 2010-2015 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();
    }

}