/******************************************************************************* * Copyright (c) 2015 Bruno Medeiros and other Contributors. * 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: * Bruno Medeiros - initial API and implementation *******************************************************************************/ package melnorme.lang.ide.ui.preferences; import static melnorme.lang.ide.ui.preferences.PreferencesMessages.LABEL_ConfigureWorkspaceSettings; import static melnorme.lang.ide.ui.preferences.PreferencesMessages.LABEL_UseProjectSpecificSettings; import static melnorme.lang.ide.ui.utils.ControlUtils.createOpenPreferencesDialogLink; import static melnorme.utilbox.core.Assert.AssertNamespace.assertNotNull; import static melnorme.utilbox.core.Assert.AssertNamespace.assertTrue; import static melnorme.utilbox.core.CoreUtil.option; import org.eclipse.core.resources.IProject; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Link; import melnorme.lang.ide.core.utils.prefs.IGlobalPreference; import melnorme.lang.ide.core.utils.prefs.IProjectPreference; import melnorme.lang.ide.ui.LangUIPlugin; import melnorme.lang.ide.ui.preferences.common.AbstractPreferencesBlock2; import melnorme.lang.ide.ui.preferences.common.IPreferencesEditor; import melnorme.lang.ide.ui.preferences.common.PreferencesPageContext; import melnorme.util.swt.SWTFactoryUtil; import melnorme.util.swt.components.AbstractDisableableWidget; import melnorme.util.swt.components.fields.CheckBoxField; import melnorme.utilbox.core.CommonException; import melnorme.utilbox.fields.IProperty; public abstract class ProjectPreferencesBlock extends AbstractPreferencesBlock2 implements IPreferencesEditor { protected final IProject project; protected final IProjectPreference<Boolean> useProjectSettingsPref; protected final CheckBoxField useProjectSettingsField = new CheckBoxField(LABEL_UseProjectSpecificSettings); protected final AbstractDisableableWidget projectSettingsBlock; public ProjectPreferencesBlock(IProject project, IProjectPreference<Boolean> useProjectSettingsPref) { super(new ProjectPreferencesPageContext(project, useProjectSettingsPref)); this.project = project; this.useProjectSettingsPref = useProjectSettingsPref; this.projectSettingsBlock = init_createProjectSettingsBlock2(); useProjectSettingsField.registerListener( (newValue) -> projectSettingsBlock.setEnabled(newValue)); prefContext.bindToPreference(useProjectSettingsField, useProjectSettingsPref); validation.addStatusField(true, projectSettingsBlock.getStatusField()); } protected abstract AbstractDisableableWidget init_createProjectSettingsBlock2(); @Override public void doSaveSettings() throws CommonException { prefContext.doSaveSettings(); } @Override public void loadDefaults() { prefContext.loadDefaults(); } /* ----------------- ----------------- */ @Override public int getPreferredLayoutColumns() { return 2; } @Override protected void createContents(Composite topControl) { useProjectSettingsField.createComponent(topControl, GridDataFactory.fillDefaults().create()); String prefPageId = getWorkspacePrefPageId(); Link link = createOpenPreferencesDialogLink(topControl, prefPageId, LABEL_ConfigureWorkspaceSettings, null); GridDataFactory.swtDefaults().align(SWT.END, SWT.CENTER).applyTo(link); SWTFactoryUtil.createLabel(topControl, SWT.SEPARATOR | SWT.HORIZONTAL, "", GridDataFactory.fillDefaults().span(2, 1).create()); projectSettingsBlock.createComponent(topControl, gdfFillDefaults().span(2, 1).grab(true, false).create()); // Update projectSettingsBlock setEnabled status - because setEnabled only works after the control is created. useProjectSettingsField.fireFieldValueChanged(); } protected String getWorkspacePrefPageId() { return LangUIPlugin.PLUGIN_ID + ".PreferencePages.Root"; } /* ----------------- ----------------- */ protected static class ProjectPreferencesPageContext extends PreferencesPageContext { protected final IProject project; protected final IProjectPreference<Boolean> useProjectSettingsPref; public ProjectPreferencesPageContext(IProject project, IProjectPreference<Boolean> useProjectSettingsPref) { this.project = assertNotNull(project); this.useProjectSettingsPref = assertNotNull(useProjectSettingsPref); } @Override public <T> IPreferencesEditor getPreferencesBinder(IProperty<T> field, IGlobalPreference<T> globalPref) { IProjectPreference<T> pref = globalPref.getProjectPreference(); assertTrue(pref == useProjectSettingsPref || pref.getEnableProjectSettingPref() == useProjectSettingsPref); return new PreferencePropertyBinding<T>(field, pref, project); } } public static class PreferencePropertyBinding<T> implements IPreferencesEditor { protected final IProperty<T> property; protected final IProjectPreference<T> preference; protected final IProject project; public PreferencePropertyBinding(IProperty<T> property, IProjectPreference<T> preference, IProject project) { this.property = property; this.preference = preference; this.project = project; property.set(preference.getStoredValue(option(project))); } public void updateFieldFromInput() { property.set(preference.getStoredValue(option(project))); } @Override public void loadDefaults() { property.set(preference.getGlobalPreference().get()); } @Override public void doSaveSettings() throws CommonException { preference.setValue(project, property.get()); } } }