/******************************************************************************* * Copyright (c) 2015 Pivotal, Inc. * 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 * * Contributors: * Pivotal, Inc. - initial API and implementation *******************************************************************************/ package org.springframework.ide.eclipse.boot.properties.editor.preferences; import java.util.Arrays; import java.util.Comparator; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ProjectScope; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.jface.dialogs.ControlEnableState; import org.eclipse.jface.preference.ComboFieldEditor; import org.eclipse.jface.preference.FieldEditorPreferencePage; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; import org.eclipse.ui.IWorkbenchPropertyPage; import org.eclipse.ui.preferences.ScopedPreferenceStore; import org.springframework.ide.eclipse.boot.properties.editor.SpringPropertiesEditorPlugin; import org.springframework.ide.eclipse.boot.properties.editor.reconciling.SpringPropertiesProblemType; import org.springframework.ide.eclipse.boot.properties.editor.util.CheckboxWidget; import org.springframework.ide.eclipse.editor.support.reconcile.ProblemSeverity; import org.springsource.ide.eclipse.commons.livexp.core.LiveExpression; import org.springsource.ide.eclipse.commons.livexp.core.LiveVariable; import org.springsource.ide.eclipse.commons.livexp.core.UIValueListener; /** * @author Kris De Volder */ public abstract class AbstractPropertiesEditorPreferencesPage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage, IWorkbenchPropertyPage { /** * Project for a project propertypage, or null for a workspace preference page. */ private IProject project; /** * The state of the 'enable project specific settings' checkbox. */ private LiveVariable<Boolean> enablePreferences = new LiveVariable<Boolean>(true); private static final Comparator<SpringPropertiesProblemType> PROBLEM_TYPE_COMPARATOR = new Comparator<SpringPropertiesProblemType>() { public int compare(SpringPropertiesProblemType o1, SpringPropertiesProblemType o2) { return o1.getLabel().compareTo(o2.getLabel()); } }; private static final String[][] SEVERITY_NAMES_AND_VALUES = { {"Error", ProblemSeverity.ERROR.toString()}, {"Warning", ProblemSeverity.WARNING.toString()}, {"Ignore", ProblemSeverity.IGNORE.toString()} }; protected AbstractPropertiesEditorPreferencesPage() { super(FieldEditorPreferencePage.GRID); ProblemSeverityPreferencesUtil.initializeDefaults(); } @Override public void init(IWorkbench workbench) { setPreferenceStore(SpringPropertiesEditorPlugin.getDefault().getPreferenceStore()); } @Override protected void createFieldEditors() { SpringPropertiesProblemType[] problemTypes = getProblemTypes(); Arrays.sort(problemTypes, PROBLEM_TYPE_COMPARATOR); for (SpringPropertiesProblemType problemType : problemTypes) { ComboFieldEditor field = new ComboFieldEditor( ProblemSeverityPreferencesUtil.getPreferenceName(problemType), problemType.getLabel(), SEVERITY_NAMES_AND_VALUES, getFieldEditorParent() ); setTooltip(field, problemType.getDescription()); addField(field); } } @Override protected Control createContents(Composite parent) { if (isProjectPropertyPage()) { return createProjectPageContent(parent); } else { return super.createContents(parent); } } private Control createProjectPageContent(Composite parent) { Composite page = new Composite(parent, SWT.NONE); page.setLayout(new GridLayout()); CheckboxWidget enablePreferencesCheckbox = new CheckboxWidget(page, enablePreferences); enablePreferencesCheckbox.setText("Enable project-specific settings"); final Control preferencesControl = super.createContents(page); enablePreferences.addListener(new UIValueListener<Boolean>() { private ControlEnableState fBlockEnableState; protected void enablePreferenceContent(boolean enable) { if (enable) { if (fBlockEnableState != null) { fBlockEnableState.restore(); fBlockEnableState = null; } } else { if (fBlockEnableState == null) { fBlockEnableState = ControlEnableState.disable(preferencesControl); } } } @Override protected void uiGotValue(LiveExpression<Boolean> exp, Boolean enable) { if (enable!=null) { enablePreferenceContent(enable); } } }); return page; } private boolean isProjectPropertyPage() { return project!=null; } protected abstract SpringPropertiesProblemType[] getProblemTypes(); protected void setTooltip(ComboFieldEditor field, String tooltip) { field.getLabelControl(getFieldEditorParent()).setToolTipText(tooltip); } @Override public IAdaptable getElement() { return project; } @Override public void setElement(IAdaptable element) { project = (IProject)element.getAdapter(IProject.class); if (project!=null) { setPreferenceStore(new ScopedPreferenceStore(new ProjectScope(project), SpringPropertiesEditorPlugin.PLUGIN_ID)); enablePreferences.setValue(getPreferenceStore().getBoolean(getEnableProjectPreferencesKey())); } } @Override public boolean performOk() { if (isProjectPropertyPage()) { getPreferenceStore().setValue(getEnableProjectPreferencesKey(), enablePreferences.getValue()); } return super.performOk(); } @Override protected void performDefaults() { if (isProjectPropertyPage()) { enablePreferences.setValue(getPreferenceStore().getDefaultBoolean(getEnableProjectPreferencesKey())); } super.performDefaults(); } /** * Determines the property-key that is used to strore whether project-specific preferences are enabled for * the properties on this page. */ protected abstract String getEnableProjectPreferencesKey(); }