0

I am building a preference page in Eclipse by extending the FieldEditorPreferencePage class. this page contains 2 fields : 1 BooleanFieldEditor (checkbox) and 1 FileFieldEditor. I would like to disable/enable the file field following the checkbox value. I went up to something like this (some obvious code is not displayed):

public class PreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {

    public static final String PREF_KEY_1 = "checkBoxPref";
    public static final String PREF_KEY_2 = "filePref";
    private FileFieldEditor pathField;
    private BooleanFieldEditor yesOrNoField;
    private Composite pathFieldParent;

    @Override
    protected void createFieldEditors() {
        this.yesOrNoField = new BooleanFieldEditor(PREF_KEY_1, "Check this box!", getFieldEditorParent());
        this.pathFieldParent = getFieldEditorParent();
    this.pathField = new FileFieldEditor(PREF_KEY_2, "Path:", this.pathFieldParent); 
        addField(this.yesOrNoField);
        addField(this.pathField);
        boolean isChecked = getPreferenceStore().getBoolean(PREF_KEY_1); 
        updatePathFieldEnablement(! isChecked);
    }

    /**
     * Updates the fields according to entered values
     */
    private void updatePathFieldEnablement(boolean enabled) {
        this.pathField.setEnabled(enabled, this.pathFieldParent);
    }

    @SuppressWarnings("boxing")
    @Override
    public void propertyChange(PropertyChangeEvent event) {
        if (event.getProperty().equals(FieldEditor.VALUE) && event.getSource() == this.yesOrNoField) {
            updatePathFieldEnablement(! (boolean) event.getNewValue());
        }
        super.propertyChange(event);
    }
}

My question is about this second parameter in FieldEditor#setEnabled. This parameter is the parent composite of the FieldEditor's controls ("Used to create the controls if required" says the javadoc) . At first, I set the value with the return of getFieldEditorParent but then I got an exception "Different parent". So I ended storing it (cf. this.pathFieldParent) and give it back to setEnabled and it works (or it seems to work). But I am not sure I am doing well, especially because I had to create a member in my class that means nothing to it (and I would have to create many of them if I had many fields to enable/disable).

Do you think I am doing well or is there a better way to provide this parent ? And could you explain to me why *setEnabled" needs it ?

Thanks.

moudug
  • 209
  • 1
  • 3
  • 13

1 Answers1

0

You are using the default FLAT layout for the preference page. When this layout is used each call to getFieldEditorParent generates a new Composite so you have to make just one call and remember the correct parent. Using the GRID layout getFieldEditorParent always returns the same parent. This is the actual code:

protected Composite getFieldEditorParent() {
    if (style == FLAT) {
        // Create a new parent for each field editor
        Composite parent = new Composite(fieldEditorParent, SWT.NULL);
        parent.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        return parent;
    }
    // Just return the parent
    return fieldEditorParent;
}

setEnabled does sometimes create a new Label control so it needs to know the correct parent Composite.

greg-449
  • 109,219
  • 232
  • 102
  • 145
  • Thx for your anwer once more. – moudug Jan 29 '18 at 08:37
  • And if I used the GRID layout, and wanted to disable/enable a bunch of fieldEditors, should I store all their parents individually ? That seems a bit cumbersome to me. – moudug Jan 29 '18 at 08:42
  • If you use GRID layout they all have the same parent and you can just call `getFieldEditorParent` since it always returns the same thing. – greg-449 Jan 29 '18 at 09:05
  • Oh sorry! I completely mixed things (not awaken yet), my question was stupid. Thx once again. – moudug Jan 29 '18 at 10:23