/******************************************************************************* * 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.util.swt.components.fields; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import melnorme.util.swt.SWTFactoryUtil; import melnorme.utilbox.core.CommonException; import melnorme.utilbox.fields.IProperty; public abstract class EnablementButtonTextField extends ButtonTextField { public static final String LABEL_UseDefault = "Use default:"; protected final CheckBoxField useDefaultField; protected final boolean createUseDefaultComponent; public EnablementButtonTextField(String labelText, String useDefaultCheckboxLabel, String buttonlabel) { super(labelText, buttonlabel); this.useDefaultField = createUseDefaultField(useDefaultCheckboxLabel); this.createUseDefaultComponent = useDefaultCheckboxLabel != null; useDefaultField.setFieldValue(createUseDefaultComponent); useDefaultField.addChangeListener(this::updateDefaultFieldValue); } protected CheckBoxField createUseDefaultField(String enablementCheckBoxLabel) { return new CheckBoxField(enablementCheckBoxLabel); } public CheckBoxField getUseDefaultField() { return useDefaultField; } public boolean isUseDefault() { return useDefaultField.getBooleanFieldValue(); } public String getEffectiveFieldValue() { return isUseDefault() ? null : super.getFieldValue(); } public void setEffectiveFieldValue(String effectiveFieldValue) { getUseDefaultField().setFieldValue(effectiveFieldValue == null); if(effectiveFieldValue != null) { setFieldValue(effectiveFieldValue); } } public void updateDefaultFieldValue() { if(isUseDefault()) { try { setFieldValue(getDefaultFieldValue()); } catch(CommonException e) { setFieldValue(""); } } } protected final IProperty<String> effectiveValueProperty = new IProperty<String>() { @Override public String get() { return getEffectiveFieldValue(); } @Override public void set(String value) { setEffectiveFieldValue(value); } }; public IProperty<String> asEffectiveValueProperty2() { return effectiveValueProperty; } protected abstract String getDefaultFieldValue() throws CommonException; @Override protected void doUpdateWidgetFromValue() { updateDefaultFieldValue(); super.doUpdateWidgetFromValue(); } /* ----------------- ----------------- */ @Override protected Composite doCreateTopLevelControl(Composite parent) { return SWTFactoryUtil.createGroup(parent, getLabelText(), SWT.NONE); } @Override protected GridLayoutFactory createTopLevelLayout() { return GridLayoutFactory.swtDefaults().numColumns(getPreferredLayoutColumns()); } @Override public int getPreferredLayoutColumns() { return 2; } @Override protected void createContents_all(Composite topControl) { createContents_EnablementCheckBox(topControl); super.createContents_all(topControl); } protected void createContents_EnablementCheckBox(Composite topControl) { if(createUseDefaultComponent) { Composite enablementTopControl = useDefaultField.createComponent(topControl); GridDataFactory.swtDefaults().span(getPreferredLayoutColumns(), 1).applyTo(enablementTopControl); useDefaultField.addChangeListener(this::updateWidgetFromInput); } } @Override protected void createContents_Label(Composite parent) { // Don't create } @Override protected void doSetEnabled(boolean enabled) { super.doSetEnabled(enabled && !isUseDefault()); useDefaultField.setEnabled(enabled); } }