package org.goko.common.preferences; import java.util.ArrayList; import java.util.List; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.eclipse.jface.fieldassist.ControlDecoration; import org.eclipse.jface.fieldassist.FieldDecorationRegistry; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.goko.common.preferences.fieldeditor.preference.IPreferenceFieldEditor; import org.goko.common.preferences.fieldeditor.preference.PreferenceFieldEditor; import org.goko.core.common.exception.GkException; import org.goko.core.log.GkLog; public abstract class GkFieldEditorPreferencesPage extends GkPreferencesPage { private static final GkLog LOG = GkLog.getLogger(GkPreferencesPage.class); /** List of field editors*/ protected List<IPreferenceFieldEditor<?>> fields; /** The parent composite of all editors */ private Composite fieldEditorParent; /** The invalid field editor*/ private IPreferenceFieldEditor<?> invalidFieldEditor; /** Decorator for current invalid field*/ private ControlDecoration invalidFieldDecorator; /** Default constructor */ public GkFieldEditorPreferencesPage(){ } /** (inheritDoc) * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite) */ @Override protected Control createContents(Composite parent) { fieldEditorParent = new Composite(parent, SWT.NULL); GridLayout layout = new GridLayout(); layout.numColumns = 1; layout.marginHeight = 0; layout.marginWidth = 0; fieldEditorParent.setLayout(layout); try { createPreferencePage(fieldEditorParent); if(getPreferenceStore() == null){ LOG.error("Preferences store is not set or null for page '"+getTitle()+"'"); } initialize(); postInitialize(); validate(); } catch (GkException e) { LOG.error(e); } return fieldEditorParent; } protected void postInitialize() throws GkException{ } protected abstract void createPreferencePage(Composite parent) throws GkException; /** * Add the given field editor to this preference page * @param field the field editor to add */ public void addField(IPreferenceFieldEditor<?> field){ if(fields == null){ fields = new ArrayList<IPreferenceFieldEditor<?>>(); } fields.add(field); } /** * Initialize the field editor * @throws GkException GkException */ protected void initialize() throws GkException{ if(CollectionUtils.isNotEmpty(fields)){ for (IPreferenceFieldEditor<?> fieldEditor : fields) { fieldEditor.setPage(this); fieldEditor.setPropertyChangeListener(this); fieldEditor.setPreferenceStore(getPreferenceStore()); fieldEditor.load(); } } } /** * Validates the page */ protected void validate(){ boolean valid = true; if(CollectionUtils.isNotEmpty(fields)){ for (IPreferenceFieldEditor<?> fieldEditor : fields) { valid = fieldEditor.isValid(); if(!valid){ break; } } } setValid(valid); } /** (inheritDoc) * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent) */ @Override public void propertyChange(PropertyChangeEvent event) { if(StringUtils.equals(event.getProperty(), PreferenceFieldEditor.IS_VALID)){ boolean newValue = ((Boolean) event.getNewValue()).booleanValue(); // If the new value is true then we must check all field editors. // If it is false, then the page is invalid in any case. if (newValue) { if(invalidFieldDecorator != null){ invalidFieldDecorator.hide(); } validate(); } else { invalidFieldEditor = (PreferenceFieldEditor<?>) event.getSource(); invalidFieldDecorator = new ControlDecoration(invalidFieldEditor.getControl(), SWT.TOP | SWT.RIGHT); Image image = FieldDecorationRegistry. getDefault(). getFieldDecoration(FieldDecorationRegistry.DEC_ERROR). getImage(); invalidFieldDecorator.setDescriptionText(getErrorMessage()); invalidFieldDecorator.setImage(image); invalidFieldDecorator.show(); setValid(newValue); } } } /** (inheritDoc) * @see org.eclipse.jface.preference.PreferencePage#performDefaults() */ @Override protected void performDefaults() { try{ for (IPreferenceFieldEditor<?> fieldEditor : fields) { fieldEditor.setDefault(); } }catch(GkException e){ LOG.error(e); } } /** (inheritDoc) * @see org.eclipse.jface.preference.PreferencePage#performOk() */ @Override public boolean performOk() { try{ if(CollectionUtils.isNotEmpty(fields)){ for (IPreferenceFieldEditor<?> fieldEditor : fields) { fieldEditor.store(); } } return true; }catch(GkException e){ LOG.error(e); return false; } } }