public DocumentsAttachmentsPreviewPage(
      final String pageName, final DocumentsAttachmentsData data) {
    super(pageName);

    m_data = data;
    m_documentData = (DocumentsAttachmentsDocumentsData) m_data.getDocumentData();

    setTitle(Messages.getString("ImportAttachmentsPreviewPage.0")); // $NON-NLS-1$
    setDescription(Messages.getString("ImportAttachmentsPreviewPage.1")); // $NON-NLS-1$
  }
  private void createImportModelControl(final Composite parent) {
    final Label label = new Label(parent, SWT.NONE);
    label.setText(Messages.getString("ImportAttachmentsPreviewPage.7")); // $NON-NLS-1$

    final ComboViewer viewer = new ComboViewer(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
    viewer.setContentProvider(new ArrayContentProvider());
    viewer.setLabelProvider(new LabelProvider());
    viewer.setInput(ImportMode.values());

    final IViewerObservableValue target = ViewersObservables.observeSinglePostSelection(viewer);
    final IObservableValue model =
        BeansObservables.observeValue(m_data, DocumentsAttachmentsData.PROPERTY_IMPORT_MODE);
    m_binding.bindValue(target, model);

    // TRICKY: we need to refresh the table when the import mode changes, in order
    // to show the gray state correctly
    model.addValueChangeListener(
        new IValueChangeListener() {
          @Override
          public void handleValueChange(final ValueChangeEvent event) {
            handleImportModeChanged();
          }
        });
  }
  private void createDocumentsTable(final Composite parent) {
    final Table table = new Table(parent, SWT.CHECK | SWT.FULL_SELECTION | SWT.BORDER);
    table.setHeaderVisible(true);
    table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

    m_viewer = new CheckboxTableViewer(table);
    m_viewer.setContentProvider(new ArrayContentProvider());
    m_checkStateHandler = new DocumentsCheckstateHandler(m_viewer, m_data);
    m_viewer.setCheckStateProvider(m_checkStateHandler);

    /* Name. */
    final TableViewerColumn nameColumn = new TableViewerColumn(m_viewer, SWT.LEFT);
    nameColumn.setLabelProvider(new DocumentsNameProvider());
    nameColumn
        .getColumn()
        .setText(Messages.getString("ImportAttachmentsPreviewPage.4")); // $NON-NLS-1$
    nameColumn.getColumn().setResizable(false);
    ColumnViewerSorter.registerSorter(nameColumn, new DocumentsNameComparator());
    ColumnsResizeControlListener.setMinimumPackWidth(nameColumn.getColumn());

    /* Mime type. */
    final TableViewerColumn typeColumn = new TableViewerColumn(m_viewer, SWT.LEFT);
    typeColumn.setLabelProvider(new DocumentsTypeProvider());
    typeColumn
        .getColumn()
        .setText(Messages.getString("ImportAttachmentsPreviewPage.5")); // $NON-NLS-1$
    typeColumn.getColumn().setResizable(false);
    ColumnViewerSorter.registerSorter(typeColumn, new DocumentsTypeComparator());
    ColumnsResizeControlListener.setMinimumPackWidth(typeColumn.getColumn());

    /* Status. */
    final TableViewerColumn statusColumn = new TableViewerColumn(m_viewer, SWT.LEFT);
    statusColumn.setLabelProvider(new DocumentsStatusProvider(m_documentData));
    statusColumn
        .getColumn()
        .setText(Messages.getString("ImportAttachmentsPreviewPage.2")); // $NON-NLS-1$
    statusColumn.getColumn().setResizable(false);
    ColumnViewerSorter.registerSorter(statusColumn, new DocumentsStatusComparator(m_documentData));
    ColumnsResizeControlListener.setMinimumPackWidth(statusColumn.getColumn());

    table.addControlListener(new ColumnsResizeControlListener());

    ColumnSortListener.setSortState(nameColumn, Boolean.TRUE);

    /* Double-click shows status */
    m_viewer.addOpenListener(
        new IOpenListener() {
          @Override
          public void open(final OpenEvent event) {
            handleShowDocumentStatus((IStructuredSelection) event.getSelection());
          }
        });

    m_viewer.addCheckStateListener(m_checkStateHandler);

    final IObservableValue target = new WritableValue();
    final IObservableValue model =
        BeansObservables.observeValue(m_data, DocumentsAttachmentsData.PROPERTY_SELECTION_COUNT);

    final DataBinder countBinder = new DataBinder(target, model);
    countBinder.addModelAfterGetValidator(
        new NumberNotExactValidator(
            Integer.valueOf(0),
            IStatus.ERROR,
            Messages.getString("ImportAttachmentsPreviewPage.6"))); // $NON-NLS-1$
    m_binding.bindValue(countBinder);
  }