protected void changeSelection(final TreeItem item, final boolean select) {
   SelectableFeature feature = (SelectableFeature) item.getData();
   if (feature.getAutomatic() == Selection.UNDEFINED) {
     switch (feature.getManual()) {
       case SELECTED:
         set(feature, (select) ? Selection.UNDEFINED : Selection.UNSELECTED);
         break;
       case UNSELECTED:
         set(feature, (select) ? Selection.SELECTED : Selection.UNDEFINED);
         break;
       case UNDEFINED:
         set(feature, (select) ? Selection.SELECTED : Selection.UNSELECTED);
         break;
       default:
         set(feature, Selection.UNDEFINED);
     }
     if (!dirty) {
       setDirty();
     }
     if (configurationEditor.isAutoSelectFeatures()) {
       computeTree(false);
       //				updateInfoLabel();
     } else {
       refreshItem(item, feature);
       if (configurationEditor.getConfiguration().canBeValid()) {
         invalidFeatures.clear();
       } else {
         invalidFeatures.add(feature);
       }
       //				updateInfoLabel();
     }
   }
 }
 protected boolean errorMessage(Tree tree) {
   if (configurationEditor.getConfiguration() == null) {
     if (configurationEditor.getModelFile() == null) {
       displayError(
           tree,
           THERE_IS_NO_FEATURE_MODEL_CORRESPONDING_TO_THIS_CONFIGURATION_COMMA__REOPEN_THE_EDITOR_AND_SELECT_ONE_);
     } else if (!configurationEditor.getModelFile().exists()) {
       displayError(
           tree,
           THE_GIVEN_FEATURE_MODEL
               + configurationEditor.getModelFile().getPath()
               + DOES_NOT_EXIST_);
     } else {
       displayError(tree, AN_UNKNOWN_ERROR_OCCURRED_);
     }
     return false;
   } else {
     final FeatureModelAnalyzer analyzer =
         configurationEditor.getConfiguration().getFeatureModel().getAnalyser();
     try {
       if (!analyzer.isValid()) {
         displayError(
             tree,
             THE_FEATURE_MODEL_FOR_THIS_PROJECT_IS_VOID_COMMA__I_E__COMMA__THERE_IS_NO_VALID_CONFIGURATION__YOU_NEED_TO_CORRECT_THE_FEATURE_MODEL_BEFORE_YOU_CAN_CREATE_OR_EDIT_CONFIGURATIONS_);
         return false;
       }
     } catch (TimeoutException e) {
       FMUIPlugin.getDefault().logError(e);
     }
   }
   return true;
 }
 /**
  * Colors all features if they lead to a valid configuration if current configuration is invalid.
  * deselect:blue, select:green
  */
 protected IConfigJob<?> computeColoring(final Display currentDisplay) {
   if (!configurationEditor.isAutoSelectFeatures()
       || configurationEditor.getConfiguration().isValid()) {
     return null;
   }
   final List<SelectableFeature> featureList =
       configurationEditor.getConfiguration().getManualFeatures();
   final IConfigJob<?> job =
       configurationEditor
           .getConfiguration()
           .getPropagator()
           .getJobWrapper()
           .leadToValidConfiguration(featureList);
   job.setIntermediateFunction(
       new IFunction<Object, Void>() {
         @Override
         public Void invoke(Object t) {
           if (t instanceof SelectableFeature) {
             final SelectableFeature feature = (SelectableFeature) t;
             final TreeItem item = itemMap.get(feature);
             if (item == null) {
               return null;
             }
             currentDisplay.asyncExec(
                 new Runnable() {
                   @Override
                   public void run() {
                     if (feature.getAutomatic() == Selection.UNDEFINED) {
                       switch (feature.getRecommended()) {
                         case SELECTED:
                           item.setFont(treeItemSpecialFont);
                           item.setForeground(green);
                           break;
                         case UNSELECTED:
                           item.setFont(treeItemSpecialFont);
                           item.setForeground(blue);
                           break;
                         case UNDEFINED:
                           item.setFont(treeItemStandardFont);
                           item.setForeground(null);
                           break;
                       }
                     }
                   }
                 });
           }
           return null;
         }
       });
   return job;
 }
  protected void updateInfoLabel(final Display display) {
    if (display == null) {
      infoLabel.setText(CALCULATING____);
      infoLabel.setForeground(null);
      return;
    }
    final boolean valid = configurationEditor.getConfiguration().isValid();

    final IConfigJob<Long> job =
        configurationEditor.getConfiguration().getPropagator().getJobWrapper().number(250);
    job.addJobFinishedListener(
        new JobFinishListener() {
          @Override
          public void jobFinished(IJob finishedJob, boolean success) {
            final StringBuilder sb = new StringBuilder();
            sb.append(valid ? VALID_COMMA_ : INVALID_COMMA_);

            @SuppressWarnings("unchecked")
            final long number = ((IConfigJob<Long>) finishedJob).getResults();
            if (number < 0) {
              sb.append(MORE_THAN);
              sb.append(-1 - number);
            } else {
              sb.append(number);
            }
            sb.append(POSSIBLE_CONFIGURATIONS);
            if (number == 0 && !configurationEditor.isAutoSelectFeatures()) {
              sb.append(" - Autoselect not possible!");
            }

            display.asyncExec(
                new Runnable() {
                  @Override
                  public void run() {
                    infoLabel.setText(sb.toString());
                    infoLabel.setForeground(valid ? blue : red);
                  }
                });
          }
        });
    configurationEditor.getConfigJobManager().startJob(job);
  }
 protected IConfigJob<?> computeFeatures(
     final boolean redundantManual, final Display currentDisplay) {
   if (!configurationEditor.isAutoSelectFeatures()) {
     return null;
   }
   final TreeItem topItem = tree.getTopItem();
   SelectableFeature feature = (SelectableFeature) (topItem.getData());
   final IConfigJob<?> job =
       configurationEditor
           .getConfiguration()
           .getPropagator()
           .getJobWrapper()
           .update(redundantManual, feature.getFeature().getName());
   job.setIntermediateFunction(
       new IFunction<Object, Void>() {
         @Override
         public Void invoke(Object t) {
           if (t instanceof SelectableFeature) {
             final SelectableFeature feature = (SelectableFeature) t;
             final TreeItem item = itemMap.get(feature);
             if (item == null) {
               return null;
             }
             currentDisplay.asyncExec(
                 new Runnable() {
                   @Override
                   public void run() {
                     updateFeatures.remove(feature);
                     refreshItem(item, feature);
                   }
                 });
           }
           return null;
         }
       });
   return job;
 }
  protected void updateTree() {
    itemMap.clear();
    if (errorMessage(tree)) {
      final Configuration configuration = configurationEditor.getConfiguration();
      tree.removeAll();
      final TreeItem root = new TreeItem(tree, 0);
      root.setText(configuration.getRoot().getName());
      root.setData(configuration.getRoot());
      itemMap.put(configuration.getRoot(), root);

      buildTree(
          root,
          configuration.getRoot().getChildren(),
          new FunctionalInterfaces.IFunction<Void, Void>() {
            @Override
            public Void invoke(Void t) {
              //					updateInfoLabel();
              computeTree(false);
              return null;
            }
          });
    }
  }
 protected void set(SelectableFeature feature, Selection selection) {
   configurationEditor.getConfiguration().setManual(feature, selection);
 }