/******************************************************************************* * Copyright (c) 2010 Martin Schnabel <mb0@mb0.org>. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html ******************************************************************************/ package org.axdt.common.preferences; import org.eclipse.jface.preference.FieldEditor; import org.eclipse.jface.preference.FieldEditorPreferencePage; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Group; public abstract class AbstractFieldEditorPage extends FieldEditorPreferencePage { protected final PrefPage page; protected Composite content; public AbstractFieldEditorPage(PrefPage page) { super(GRID); this.page = page; setDescription(page.getDescription()); } protected abstract IPreferenceStore retrievePreferenceStore(AbstractPreferences prefs); @Override protected void createFieldEditors() { content = getFieldEditorParent(); content.setLayout(new GridLayout(1, false)); FieldSpec<?>[] specs = page.getFieldSpecs(); Composite tmp = content; for (int index = 0; index < specs.length; index++) { PrefGroup group = page.openGroup(index); if (group != null && isExcluded(group)) { index = group.getEnd()-1; continue; } tmp = openGroup(group, tmp); FieldSpec<?> spec = specs[index]; FieldEditor field = createFieldFromSpec(spec, tmp); if (field != null) addField(field); tmp = closeGroup(page.closeGroup(index+1), tmp); } } protected boolean isExcluded(PrefGroup group) { return false; } @Override protected void adjustGridLayout() { } protected Composite closeGroup(PrefGroup closeGroup, Composite current) { if (closeGroup != null) { GridLayout layout = (GridLayout) current.getLayout(); layout.marginHeight = 10; if (current instanceof Group) layout.marginWidth = 10; return current.getParent(); } return current; } protected Composite openGroup(PrefGroup pref, Composite parent) { if (pref == null) return parent; Composite groupComp; if (pref.getTitle() == null) { groupComp = new Composite(parent, SWT.NONE); } else { Group group = new Group(parent, SWT.NONE); group.setText(pref.getTitle()); groupComp = group; } groupComp.setData("keepLayout", pref.keepLayout()); GridLayout layout = new GridLayout(1, false); groupComp.setLayout(layout); GridData data = new GridData(GridData.FILL_HORIZONTAL|GridData.GRAB_HORIZONTAL); groupComp.setLayoutData(data); return groupComp; } protected FieldEditor createFieldFromSpec(FieldSpec<?> spec, Composite composite) { if (Boolean.FALSE.equals(composite.getData("keepLayout"))) { composite = new Composite(composite, SWT.NONE); composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL|GridData.GRAB_HORIZONTAL)); } return spec.createFieldEditor(composite); } }