2017-09-27 5 views
0

J'ai un AggregateValidationStatus avec un IChangeListener. L'auditeur est appelé chaque fois que je sélectionne/change et le composant dont j'ai besoin. Le seul problème que j'ai est que je dois déclencher la méthode validate() de mon MultiValidator au début du ChangeListener. Malheureusement, il y a une documentation très faible et ce que j'ai trouvé ne m'a pas aidé.Multivalidator de déclenchement de la liaison de données JFace/Eclipse dans ChangeListener d'AggregateValidationStatus

Mon ChangeListener

final AggregateValidationStatus aggregateValidationStatus = new AggregateValidationStatus(
     dataBindingContext.getBindings(), AggregateValidationStatus.MAX_SEVERITY); 
aggregateValidationStatus.addChangeListener(new IChangeListener() { 
    public void handleChange(ChangeEvent event) { 
     //Here I have to trigger the MultiValidator to return either OK or ERROR 
     boolean formIsValid = true; 
     aggregateValidationStatus.getValue(); 
     for (Object o : dataBindingContext.getBindings()) { 
      Binding binding = (Binding) o; 
      IStatus status = (IStatus) binding.getValidationStatus().getValue(); 
      if (!status.isOK()) { 
       formIsValid = false; 
      } 

      Control control = null; 
      if (binding.getTarget() instanceof ISWTObservable) { 
       ISWTObservable swtObservable = (ISWTObservable) binding.getTarget(); 
       control = (Control) swtObservable.getWidget(); 
      } 
      if (binding.getTarget() instanceof CalendarComboObservableValue) { 
       CalendarComboObservableValue observable = (CalendarComboObservableValue) binding.getTarget(); 
       control = (Control) observable.getControl(); 
      } 

      if (binding.getTarget() instanceof IViewerObservable) { 
       IViewerObservable observable = (IViewerObservable) binding.getTarget(); 
       control = observable.getViewer().getControl(); 
      } 

      ControlDecoration decoration = decoratorMap.get(control); 
      if (decoration != null) { 
       if (status.isOK() || status.matches(Status.WARNING)) { 
        decoration.hide(); 
       } else { 
        decoration.setDescriptionText(status.getMessage()); 
        decoration.show(); 
       } 
      } 
     } 
     if (saveBtn != null) 
      saveBtn.setEnabled(formIsValid); 
    } 
}); 
+0

Pouvez-vous s'il vous plaît ajouter le code comment vous créez le aggregateValidationStatus? –

+0

@TillmannSeidel mis à jour le code – XtremeBaumer

Répondre

1

Votre AggregateValidationStatus agrégats que sur les liaisons du datBindingContext:

final AggregateValidationStatus aggregateValidationStatus = new AggregateValidationStatus(
    dataBindingContext.getBindings(), AggregateValidationStatus.MAX_SEVERITY); 

Le MultiValidator n'est pas attaché à une seule liaison, mais à l'ensemble du contexte. Donc, si vous voulez que votre AggregateValidationStatus pour surveiller MultiValidator s aussi bien, vous devez utiliser un constructeur différent:

final AggregateValidationStatus aggregateValidationStatus = new AggregateValidationStatus(
    dataBindingContext, AggregateValidationStatus.MAX_SEVERITY); 

Cela devrait rendre le déclenchement manuel du MultiValidator dans handleChanged superfluent.

+0

merci pour la réponse, va l'essayer une fois que j'arrive à celui-ci. si cela fonctionne, je vais accepter la réponse – XtremeBaumer