mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-07 17:56:01 +02:00
Bug #154053 Allow dynamically changing the list of values in the enumerated option
This commit is contained in:
parent
53988fe210
commit
bf88a24e9c
2 changed files with 89 additions and 12 deletions
|
@ -37,7 +37,7 @@ public class BuildOptionComboFieldEditor extends FieldEditor {
|
|||
*/
|
||||
public BuildOptionComboFieldEditor (String name, String label, String [] opts, String sel, Composite parent) {
|
||||
init(name, label);
|
||||
options = opts;
|
||||
setOptions(opts);
|
||||
selected = sel;
|
||||
createControl(parent);
|
||||
}
|
||||
|
@ -112,7 +112,7 @@ public class BuildOptionComboFieldEditor extends FieldEditor {
|
|||
label.setLayoutData(labelData);
|
||||
|
||||
// Now add the combo selector
|
||||
optionSelector = ControlFactory.createSelectCombo(parent, options, selected);
|
||||
optionSelector = ControlFactory.createSelectCombo(parent, getOptions(), selected);
|
||||
GridData selectorData = (GridData) optionSelector.getLayoutData();
|
||||
selectorData.horizontalSpan = numColumns - 1;
|
||||
selectorData.grabExcessHorizontalSpace = true;
|
||||
|
@ -134,7 +134,7 @@ public class BuildOptionComboFieldEditor extends FieldEditor {
|
|||
protected void doLoad() {
|
||||
// set all the options to option selector
|
||||
optionSelector.removeAll();
|
||||
optionSelector.setItems(options);
|
||||
optionSelector.setItems(getOptions());
|
||||
|
||||
// get the selected option from preference store
|
||||
selected = getPreferenceStore().getString(getPreferenceName());
|
||||
|
@ -205,4 +205,16 @@ public class BuildOptionComboFieldEditor extends FieldEditor {
|
|||
getLabelControl(parent).setEnabled(enabled);
|
||||
optionSelector.setEnabled(enabled);
|
||||
}
|
||||
/**
|
||||
* Set the list of enum values for this combo field editor
|
||||
*/
|
||||
public void setOptions(String[] options){
|
||||
this.options = options;
|
||||
}
|
||||
/**
|
||||
* Set the list of enum values for this combo field editor
|
||||
*/
|
||||
public String[] getOptions(){
|
||||
return options;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -323,7 +323,6 @@ public class BuildOptionSettingsUI extends AbstractToolSettingUI {
|
|||
IOption opt = (IOption) options[index][1];
|
||||
String prefName = getToolSettingsPrefStore().getOptionPrefName(opt);
|
||||
|
||||
|
||||
// is the option on this page?
|
||||
if (fieldsMap.containsKey(prefName)) {
|
||||
// check to see if the option has an applicability calculator
|
||||
|
@ -335,7 +334,6 @@ public class BuildOptionSettingsUI extends AbstractToolSettingUI {
|
|||
setFieldEditorEnablement(holder, opt, applicabilityCalculator, fieldEditor, parent);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Collection fieldsList = fieldsMap.values();
|
||||
|
@ -422,8 +420,7 @@ public class BuildOptionSettingsUI extends AbstractToolSettingUI {
|
|||
default:
|
||||
break;
|
||||
}
|
||||
} catch (BuildException e) {
|
||||
}
|
||||
} catch (BuildException e) {}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -439,19 +436,24 @@ public class BuildOptionSettingsUI extends AbstractToolSettingUI {
|
|||
IOption opt = (IOption) options[index][1];
|
||||
String prefName = getToolSettingsPrefStore().getOptionPrefName(opt);
|
||||
|
||||
|
||||
// is the option on this page?
|
||||
if (fieldsMap.containsKey(prefName)) {
|
||||
// check to see if the option has an applicability calculator
|
||||
IOptionApplicability applicabilityCalculator = opt.getApplicabilityCalculator();
|
||||
|
||||
if (applicabilityCalculator != null) {
|
||||
FieldEditor fieldEditor = (FieldEditor) fieldsMap.get(prefName);
|
||||
try {
|
||||
if ( opt.getValueType() == IOption.ENUMERATED ) {
|
||||
// the item list of this enumerated option may have changed, update it
|
||||
updateEnumList( fieldEditor, opt, holder, fInfo );
|
||||
}
|
||||
} catch ( BuildException be ) {}
|
||||
|
||||
if (applicabilityCalculator != null) {
|
||||
Composite parent = (Composite) fieldEditorsToParentMap.get(fieldEditor);
|
||||
setFieldEditorEnablement(holder, opt, applicabilityCalculator, fieldEditor, parent);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Iterator iter = fieldsMap.values().iterator();
|
||||
|
@ -460,12 +462,75 @@ public class BuildOptionSettingsUI extends AbstractToolSettingUI {
|
|||
if(id == null || !id.equals(editor.getPreferenceName()))
|
||||
editor.load();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void setValues() {
|
||||
updateFields();
|
||||
}
|
||||
|
||||
/**
|
||||
* The items shown in an enumerated option may depend on other option values.
|
||||
* Whenever an option changes, check and update the valid enum values in
|
||||
* the combo fieldeditor.
|
||||
*
|
||||
* See also https://bugs.eclipse.org/bugs/show_bug.cgi?id=154053
|
||||
*
|
||||
* @param fieldEditor enumerated combo fieldeditor
|
||||
* @param opt enumerated option type to update
|
||||
* @param holder the option holder
|
||||
* @param config project or resource info
|
||||
* @throws BuildException
|
||||
*/
|
||||
protected void updateEnumList( FieldEditor fieldEditor, IOption opt, IHoldsOptions holder, IResourceInfo config ) throws BuildException
|
||||
{
|
||||
// Get all applicable values for this enumerated Option, and filter out
|
||||
// the disable values
|
||||
String[] enumNames = opt.getApplicableValues();
|
||||
|
||||
// get the currently selected enum value, the updated enum list may not contain
|
||||
// it, in that case a new value has to be selected
|
||||
String selectedEnum = opt.getSelectedEnum();
|
||||
String selectedEnumName = opt.getEnumName(selectedEnum);
|
||||
|
||||
// get the default value for this enumerated option
|
||||
String defaultEnumId = (String)opt.getDefaultValue();
|
||||
String defaultEnumName = opt.getEnumName(defaultEnumId);
|
||||
|
||||
boolean selectNewEnum = true;
|
||||
boolean selectDefault = false;
|
||||
|
||||
Vector enumValidList = new Vector();
|
||||
for (int i = 0; i < enumNames.length; ++i) {
|
||||
if (opt.getValueHandler().isEnumValueAppropriate(config,
|
||||
opt.getOptionHolder(), opt, opt.getValueHandlerExtraArgument(), enumNames[i])) {
|
||||
if ( selectedEnumName.equals(enumNames[i]) ) {
|
||||
// the currently selected enum is part of the new item list, no need to select a new value.
|
||||
selectNewEnum = false;
|
||||
}
|
||||
if ( defaultEnumName.equals(enumNames[i]) ) {
|
||||
// the default enum value is part of new item list
|
||||
selectDefault = true;
|
||||
}
|
||||
enumValidList.add(enumNames[i]);
|
||||
}
|
||||
}
|
||||
String[] enumValidNames = new String[enumValidList.size()];
|
||||
enumValidList.copyInto(enumValidNames);
|
||||
|
||||
if ( selectNewEnum ) {
|
||||
// apparantly the currently selected enum value is not part anymore of the enum list
|
||||
// select a new value.
|
||||
String selection = null;
|
||||
if ( selectDefault ) {
|
||||
// the default enum value is part of the item list, use it
|
||||
selection = (String)opt.getDefaultValue();
|
||||
} else if ( enumValidNames.length > 0 ) {
|
||||
// select the first item in the item list
|
||||
selection = opt.getEnumeratedId(enumValidNames[0]);
|
||||
}
|
||||
ManagedBuildManager.setOption(config,holder,opt,selection);
|
||||
}
|
||||
((BuildOptionComboFieldEditor)fieldEditor).setOptions(enumValidNames);
|
||||
fieldEditor.load();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue