/**
   * Creates a dialog used to select <i>multiple</i> values from the input tree.
   *
   * @param shell The parent shell for the dialog.
   * @param labelProvider The label provider for the tree.
   * @param contentProvider The content provider for the tree.
   * @return The new dialog.
   */
  private CheckedTreeSelectionDialog createCheckedTreeSelectionDialog(
      Shell shell, ILabelProvider labelProvider, ITreeContentProvider contentProvider) {

    // Create a custom check-state listener to update the selected elements
    // on the fly.
    final ICheckStateListener checkStateListener = createCheckStateListener();

    CheckedTreeSelectionDialog treeDialog =
        new CheckedTreeSelectionDialog(shell, labelProvider, contentProvider) {
          /*
           * (non-Javadoc)
           * @see org.eclipse.ui.dialogs.CheckedTreeSelectionDialog#createSelectionButtons(org.eclipse.swt.widgets.Composite)
           */
          @Override
          protected Composite createSelectionButtons(Composite composite) {
            Composite buttonComposite = super.createSelectionButtons(composite);

            // Add listeners to the select-all and deselect-all buttons
            // because they do not trigger the check-state listener.
            getButton(IDialogConstants.SELECT_ALL_ID)
                .addSelectionListener(
                    new SelectionAdapter() {
                      @Override
                      public void widgetSelected(SelectionEvent e) {
                        newSelection.clear();
                        checkNode(root, true);
                      }
                    });
            getButton(IDialogConstants.DESELECT_ALL_ID)
                .addSelectionListener(
                    new SelectionAdapter() {
                      @Override
                      public void widgetSelected(SelectionEvent e) {
                        newSelection.clear();
                      }
                    });

            return buttonComposite;
          }

          /*
           * (non-Javadoc)
           * @see org.eclipse.ui.dialogs.CheckedTreeSelectionDialog#createTreeViewer(org.eclipse.swt.widgets.Composite)
           */
          @Override
          protected CheckboxTreeViewer createTreeViewer(Composite parent) {
            // Create the default TreeViewer.
            CheckboxTreeViewer viewer = super.createTreeViewer(parent);

            // Add the check state provider and listener.
            viewer.addCheckStateListener(checkStateListener);

            return viewer;
          }
        };

    // Set this flag so the "grayed" state of parent nodes is handled
    // properly.
    treeDialog.setContainerMode(true);

    return treeDialog;
  }