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); }