Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 348661

Summary: [Preference] FieldEditor overwrites parent layout number of columns
Product: [Eclipse Project] Platform Reporter: Sean Payne <spayne>
Component: UIAssignee: 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:

Description Sean Payne CLA 2011-06-07 18:35:18 EDT
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();
	}
}
Comment 1 Sean Payne CLA 2011-06-07 19:20:57 EDT
And like that I realize that I forgot to call FieldEditorPreferencePage#addField(FieldEditor). Oops. Sorry.