| Summary: | [Preference] FieldEditor overwrites parent layout number of columns | ||
|---|---|---|---|
| Product: | [Eclipse Project] Platform | Reporter: | Sean Payne <spayne> |
| Component: | UI | Assignee: | Platform-UI-Inbox <Platform-UI-Inbox> |
| Status: | CLOSED INVALID | QA Contact: | |
| Severity: | normal | ||
| Priority: | P3 | ||
| Version: | 4.1 | ||
| Target Milestone: | --- | ||
| Hardware: | PC | ||
| OS: | Windows XP | ||
| Whiteboard: | |||
And like that I realize that I forgot to call FieldEditorPreferencePage#addField(FieldEditor). Oops. Sorry. |
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(); } }