/**
   * Create the checkbox list for the found projects.
   *
   * @param workArea
   */
  private void createProjectsList(Composite workArea) {
    Label title = new Label(workArea, SWT.NONE);
    title.setText(UIText.WizardProjectsImportPage_ProjectsListTitle);

    Composite listComposite = new Composite(workArea, SWT.NONE);
    GridLayout layout = new GridLayout();
    layout.numColumns = 2;
    layout.marginWidth = 0;
    layout.makeColumnsEqualWidth = false;
    listComposite.setLayout(layout);

    listComposite.setLayoutData(
        new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH));

    PatternFilter filter =
        new PatternFilter() {

          @Override
          public boolean isElementVisible(Viewer viewer, Object element) {

            if (getCheckedProjects().contains(element)) return true;

            return super.isElementVisible(viewer, element);
          }
        };

    FilteredCheckboxTree filteredTree =
        new FilteredCheckboxTree(listComposite, null, SWT.NONE, filter);

    filteredTree.setInitialText(UIText.WizardProjectsImportPage_filterText);
    projectsList = filteredTree.getCheckboxTreeViewer();
    GridData listData =
        new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
    projectsList.getControl().setLayoutData(listData);
    projectsList.addCheckStateListener(
        new ICheckStateListener() {

          public void checkStateChanged(CheckStateChangedEvent event) {
            ProjectRecord element = (ProjectRecord) event.getElement();
            if (isProjectInWorkspace(element.getProjectName())) {
              projectsList.setChecked(element, false);
            }
            enableSelectAllButtons();
          }
        });

    // a bug in the CachedCheckboxTreeView requires us to not return null
    final Object[] children = new Object[0];

    projectsList.setContentProvider(
        new ITreeContentProvider() {

          public Object[] getChildren(Object parentElement) {
            return children;
          }

          public Object[] getElements(Object inputElement) {
            return selectedProjects;
          }

          public boolean hasChildren(Object element) {
            return false;
          }

          public Object getParent(Object element) {
            return null;
          }

          public void dispose() {
            // ignore
          }

          public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            // ignore
          }
        });

    projectsList
        .getTree()
        .addSelectionListener(
            new SelectionAdapter() {
              public void widgetSelected(SelectionEvent e) {
                checkPageComplete();
              }
            });

    projectsList.setLabelProvider(new ProjectLabelProvider());

    projectsList.setInput(this);
    projectsList.setComparator(new ViewerComparator());
    createSelectionButtons(listComposite);
  }