/**
   * Creates the tree in this group
   *
   * @param parent parent composite
   * @param style toolkit for form style or <code>null</code> for dialog style
   */
  private TreeViewer createTree(Composite parent, FormToolkit toolkit) {
    FilteredCheckboxTree tree = new FilteredCheckboxTree(parent, toolkit);
    tree.setLayoutData(new GridData(GridData.FILL_BOTH));
    tree.getPatternFilter().setIncludeLeadingWildcard(true);
    tree.getFilterControl().setFont(parent.getFont());

    fTree = tree.getCheckboxTreeViewer();
    ((GridData) fTree.getControl().getLayoutData()).heightHint = 300;
    fTree.getControl().setFont(parent.getFont());
    fTree.setUseHashlookup(true);
    fTree.setContentProvider(new TreeContentProvider());
    fTree.setLabelProvider(new StyledBundleLabelProvider(true, false));
    fTree.addDoubleClickListener(
        new IDoubleClickListener() {
          public void doubleClick(DoubleClickEvent event) {
            IStructuredSelection selection = (IStructuredSelection) event.getSelection();
            Object first = selection.getFirstElement();
            fTree.setChecked(first, !fTree.getChecked(first));
            saveIncludedBundleState();
            contentChanged();
            updateButtons();
            fTree.update(
                fTargetDefinition.getBundleContainers(),
                new String[] {IBasicPropertyConstants.P_TEXT});
          }
        });
    fTree.addCheckStateListener(
        new ICheckStateListener() {
          public void checkStateChanged(CheckStateChangedEvent event) {
            saveIncludedBundleState();
            contentChanged();
            updateButtons();
            fTree.update(
                fTargetDefinition.getBundleContainers(),
                new String[] {IBasicPropertyConstants.P_TEXT});
          }
        });
    fTree.addSelectionChangedListener(
        new ISelectionChangedListener() {
          public void selectionChanged(SelectionChangedEvent event) {
            updateButtons();
          }
        });
    fTree.setSorter(
        new ViewerSorter() {
          public int compare(Viewer viewer, Object e1, Object e2) {
            if (fFeaureModeButton.getSelection()) {
              if (e1 == OTHER_CATEGORY) {
                return 1;
              }
              if (e2 == OTHER_CATEGORY) {
                return -1;
              }
            }
            if (e1 instanceof IResolvedBundle && !(e2 instanceof IResolvedBundle)) {
              return -1;
            }
            if (e2 instanceof IResolvedBundle && !(e1 instanceof IResolvedBundle)) {
              return 1;
            }
            if (e1 instanceof IResolvedBundle && e2 instanceof IResolvedBundle) {
              IStatus status1 = ((IResolvedBundle) e1).getStatus();
              IStatus status2 = ((IResolvedBundle) e2).getStatus();
              if (!status1.isOK() && status2.isOK()) {
                return -1;
              }
              if (status1.isOK() && !status2.isOK()) {
                return 1;
              }
            }
            return super.compare(viewer, e1, e2);
          }
        });

    fMenuManager = new MenuManager();
    fMenuManager.add(
        new Action(
            Messages.TargetContentsGroup_collapseAll,
            PlatformUI.getWorkbench()
                .getSharedImages()
                .getImageDescriptor(ISharedImages.IMG_ELCL_COLLAPSEALL)) {
          public void run() {
            fTree.collapseAll();
          }
        });
    Menu contextMenu = fMenuManager.createContextMenu(tree);
    tree.setMenu(contextMenu);

    return fTree;
  }