Community
Participate
Working Groups
Build Identifier: 20110301-1815 The method FieldEditor#createControl(Composite) is called by some derivatives of FieldEditor, and if a derivative has more or less numbers of controls than previously placed FieldEditors on a FieldEditorPreferencePage, then the layout becomes inconsistent and control layout is incorrect. Reproducible: Sometimes Steps to Reproduce: public class AdvancedPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage { private BooleanFieldEditorEx deleteRetentionEnabledField; /** * */ public AdvancedPreferencePage() { super(FieldEditorPreferencePage.GRID); setDescription("Edit advanced options"); setTitle("Advanced Preferences"); } /* (non-Javadoc) * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench) */ @Override public void init(IWorkbench workbench) { // Initialize the preference page setPreferenceStore(Activator.getDefault().getPreferenceStore()); } /* (non-Javadoc) * @see org.eclipse.jface.preference.FieldEditorPreferencePage#createFieldEditors() */ @Override protected void createFieldEditors() { { IntegerFieldEditor field = new IntegerFieldEditor(ExpPref.CACHE_PAGE_WINDOW, "Number of pages to cache per call:", getFieldEditorParent(), 2); field.setValidRange(1, 10); addField(field); } deleteRetentionEnabledField = new BooleanFieldEditorEx(ExpPref.DELETE_RETENTION_ENABLED, "Enable major definition deletion backups.", getFieldEditorParent()) { /*public int getNumberOfControls() { return 2; }*/ }; { final IntegerFieldEditor field = new IntegerFieldEditor(ExpPref.DELETE_RETENTION_DAYS, "Days to retain deleted major definitions:", getFieldEditorParent(), 3); field.setValidRange(1, 730); addField(field); deleteRetentionEnabledField.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { super.widgetSelected(e); field.setEnabled(!(Boolean)e.data, getFieldEditorParent()); } }); } } where BooleanFieldEditorEx is: class BooleanFieldEditorEx extends BooleanFieldEditor { List<SelectionListener> selectionListeners; Composite parent; public BooleanFieldEditorEx(String name, String label, Composite parent) { super(name, label, parent); selectionListeners = new ArrayList<SelectionListener>(1); this.parent = parent; } /* (non-Javadoc) * @see org.eclipse.jface.preference.FieldEditor#fireValueChanged(java.lang.String, java.lang.Object, java.lang.Object) */ @Override protected void fireValueChanged(String property, Object oldValue, Object newValue) { super.fireValueChanged(property, oldValue, newValue); fireSelectionListeners(getChangeControl(parent), newValue, property); } public Button getChangeControl() { return getChangeControl(parent); } public void addSelectionListener(SelectionListener listener) { selectionListeners.add(listener); } public void fireSelectionListeners(Widget widget, Object data, String text) { Event e = new Event(); e.widget = widget; e.data = data; e.text = text; e.doit = true; for(int i=0; i < selectionListeners.size() && e.doit; i++) { selectionListeners.get(i).widgetSelected(new SelectionEvent(e)); } } /* (non-Javadoc) * @see org.eclipse.jface.preference.FieldEditor#dispose() */ @Override public void dispose() { selectionListeners.clear(); super.dispose(); } }
And like that I realize that I forgot to call FieldEditorPreferencePage#addField(FieldEditor). Oops. Sorry.