@Override
  protected Object run(final Presentation context) {
    final FormComponentPresentation p = (FormComponentPresentation) context;
    final SapphirePart part = (SapphirePart) getPart();

    final Set<Property> properties = new LinkedHashSet<Property>();
    collectProperties(part, properties);

    for (Iterator<Property> itr = properties.iterator(); itr.hasNext(); ) {
      if (itr.next().empty()) {
        itr.remove();
      }
    }

    if (properties.isEmpty()) {
      MessageDialog.openInformation(p.shell(), dialogTitle.text(), nothingToDoMessage.text());
    } else {
      final Set<Property> selectedProperties = PromptDialog.open(p.shell(), properties);

      for (Property property : selectedProperties) {
        property.clear();
      }
    }

    return null;
  }
  @Override
  protected void facts(final SortedSet<String> facts) {
    final Value<?> value = context(Value.class);
    final String def = value.getDefaultText();

    if (def != null) {
      if (value.definition().hasAnnotation(SensitiveData.class)) {
        facts.add(statementForSensitive.text());
      } else {
        facts.add(statement.format(new ValueSnapshot(value.definition(), def)));
      }
    }
  }
  protected void initBindingMetadata() {
    final XmlListBinding annotation = property().definition().getAnnotation(XmlListBinding.class);
    final XmlNamespaceResolver xmlNamespaceResolver =
        ((XmlResource) property().element().resource()).getXmlNamespaceResolver();

    final SortedSet<ElementType> possible = this.possibleTypesService.types();
    this.modelElementTypes = possible.toArray(new ElementType[possible.size()]);

    if (annotation == null) {
      this.path = new XmlPath(property().name(), xmlNamespaceResolver);

      this.xmlElementNames = new QName[this.modelElementTypes.length];

      for (int i = 0; i < this.modelElementTypes.length; i++) {
        this.xmlElementNames[i] =
            createDefaultElementName(this.modelElementTypes[i], xmlNamespaceResolver);
      }
    } else {
      if (annotation.path().length() > 0) {
        this.path = new XmlPath(annotation.path(), xmlNamespaceResolver);
      }

      final XmlListBinding.Mapping[] mappings = annotation.mappings();
      this.xmlElementNames = new QName[this.modelElementTypes.length];

      for (int i = 0; i < this.modelElementTypes.length; i++) {
        final ElementType type = this.modelElementTypes[i];

        for (XmlListBinding.Mapping mapping : mappings) {
          if (mapping.type() == type.getModelElementClass()) {
            final String mappingElementName = mapping.element().trim();

            if (mappingElementName.length() == 0) {
              throw new RuntimeException(mustSpecifyElementNameMsg.text());
            }

            this.xmlElementNames[i] = createQualifiedName(mappingElementName, xmlNamespaceResolver);

            break;
          }
        }

        if (this.xmlElementNames[i] == null) {
          this.xmlElementNames[i] = createDefaultElementName(type, xmlNamespaceResolver);
        }
      }
    }
  }
  @Override
  protected Status compute() {
    if (!this.versionCompatibilityService.compatible() && !context(Property.class).empty()) {
      final String message;

      final Version version = this.versionCompatibilityService.version();
      final String versioned = this.versionCompatibilityService.versioned();

      if (version == null) {
        message = versionConstraintTargetNotFoundMessage.text();
      } else {
        message = notCompatibleWithVersionMessage.format(version.toString(), versioned);
      }

      return Status.createErrorStatus(message);
    }

    return Status.createOkStatus();
  }
    @Override
    protected Control createDialogArea(final Composite parent) {
      getShell().setText(dialogTitle.text());

      final Composite composite = (Composite) super.createDialogArea(parent);

      final Label messageLabel = new Label(composite, SWT.WRAP);
      messageLabel.setText(dialogMessage.text());
      messageLabel.setLayoutData(gdwhint(gdhfill(), 300));

      final CheckboxTableViewer tableViewer =
          CheckboxTableViewer.newCheckList(composite, SWT.BORDER);
      final Table table = tableViewer.getTable();

      table.setLayoutData(gdhhint(gdwhint(gdfill(), 300), 300));

      tableViewer.setContentProvider(
          new IStructuredContentProvider() {
            public Object[] getElements(final Object inputElement) {
              return PromptDialog.this.allProperties.toArray();
            }

            public void inputChanged(
                final Viewer viewer, final Object oldInput, final Object newInput) {}

            public void dispose() {}
          });

      tableViewer.setLabelProvider(
          new ITableLabelProvider() {
            public String getColumnText(final Object element, final int columnIndex) {
              final PropertyDef property = ((Property) element).definition();
              return property.getLabel(true, CapitalizationType.FIRST_WORD_ONLY, false);
            }

            public Image getColumnImage(final Object element, final int columnIndex) {
              return null;
            }

            public boolean isLabelProperty(final Object element, final String property) {
              return false;
            }

            public void addListener(final ILabelProviderListener listener) {}

            public void removeListener(final ILabelProviderListener listener) {}

            public void dispose() {}
          });

      tableViewer.setCheckStateProvider(
          new ICheckStateProvider() {
            public boolean isChecked(final Object element) {
              return PromptDialog.this.selectedProperties.contains(element);
            }

            public boolean isGrayed(final Object element) {
              return false;
            }
          });

      tableViewer.addCheckStateListener(
          new ICheckStateListener() {
            public void checkStateChanged(final CheckStateChangedEvent event) {
              final Property property = (Property) event.getElement();

              if (event.getChecked() == true) {
                PromptDialog.this.selectedProperties.add(property);
              } else {
                PromptDialog.this.selectedProperties.remove(property);
              }
            }
          });

      tableViewer.setInput(this);

      return composite;
    }