/** * */ package org.goko.common.preferences.fieldeditor.ui; import javax.vecmath.Color3f; import org.eclipse.core.databinding.Binding; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.UpdateValueStrategy; import org.eclipse.core.databinding.beans.BeanProperties; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.internal.databinding.util.JFaceProperty; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.goko.common.bindings.AbstractModelObject; import org.goko.core.common.exception.GkException; /** * @author Psyko * @date 22 oct. 2016 */ public class UiColorFieldEditor extends UiLabeledFieldEditor<Button>{ /** Color selector */ private ColorSelector colorSelector; private Color3f colorValue; /** * @param parent * @param style */ public UiColorFieldEditor(Composite parent, int style) { super(parent, style); } /** (inheritDoc) * @see org.eclipse.core.databinding.validation.IValidator#validate(java.lang.Object) */ @Override public IStatus validate(Object value) { return null; } /** (inheritDoc) * @see org.goko.common.preferences.fieldeditor.ui.UiLabeledFieldEditor#createControls(org.eclipse.swt.widgets.Composite, int) */ @Override protected void createControls(Composite parent, int style) { super.createControls(parent, style); colorSelector = new ColorSelector(this); control = colorSelector.getButton(); getControl().setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1)); colorSelector.addListener(new IPropertyChangeListener() { // forward the property change of the color selector @Override public void propertyChange(PropertyChangeEvent event) { RGB newValue = (RGB) event.getNewValue(); Color3f oldColor3f = colorValue; colorValue = new Color3f(newValue.red / 255.0f, newValue.green / 255.0f, newValue.blue / 255.0f); UiColorFieldEditor.this.fireValueChanged(event.getProperty(), oldColor3f, colorValue); } }); this.pack(); } /** (inheritDoc) * @see org.goko.common.preferences.fieldeditor.ui.UiFieldEditor#getFieldEditorBinding(org.eclipse.core.databinding.DataBindingContext, org.goko.common.bindings.AbstractModelObject) */ @Override protected Binding getFieldEditorBinding(DataBindingContext bindingContext, AbstractModelObject modelObject) throws GkException { // TODO Auto-generated method stub //IObservableValue targetObserver = JFaceProperties.value(ColorSelector.class, "color3f", ColorSelector.PROP_COLORCHANGE).observe(colorSelector); IObservableValue fgTarget = new JFaceProperty(ColorSelector.PROP_COLORCHANGE, ColorSelector.PROP_COLORCHANGE, UiColorFieldEditor.class).observe(this); IObservableValue modelObserver = BeanProperties.value(propertyName).observe(modelObject); UpdateValueStrategy targetToModelStrategy = new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE); UpdateValueStrategy modelToTargetStrategy = new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE); return bindingContext.bindValue(fgTarget, modelObserver, targetToModelStrategy, modelToTargetStrategy); } /** * @return the colorSelector */ public ColorSelector getColorSelector() { return colorSelector; } /** * @param colorSelector the colorSelector to set */ public void setColorSelector(ColorSelector colorSelector) { this.colorSelector = colorSelector; } /** * @return the colorValue */ public Color3f getColorValue() { return colorValue; } /** * @param colorValue the colorValue to set */ public void setColorValue(Color3f colorValue) { this.colorValue = colorValue; colorSelector.setColorValue(new RGB( Math.round(colorValue.x * 255), Math.round(colorValue.y * 255), Math.round(colorValue.z * 255))); } /** * Adds a property change listener to this <code>ColorSelector</code>. * Events are fired when the color in the control changes via the user * clicking an selecting a new one in the color dialog. No event is fired in * the case where <code>setColorValue(RGB)</code> is invoked. * * @param listener * a property change listener * @since CHANGEME */ public void addPropertyChangeListener(IPropertyChangeListener listener) { setPropertyChangeListener(listener); } /** * Removes the given listener from this <code>ColorSelector</code>. Has no * effect if the listener is not registered. * * @param listener * a property change listener * @since CHANGEME */ public void removePropertyChangeListener(IPropertyChangeListener listener) { setPropertyChangeListener(listener); } /** (inheritDoc) * @see org.goko.common.preferences.fieldeditor.ui.UiFieldEditor#setEnabled(boolean) */ @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); if(!enabled){ setColorValue(new Color3f(0.85f,0.85f,0.85f)); } } // org.eclipse.jface.preference.ColorSelector.addPropertyChangeListener(java.beans.PropertyChangeListener) // cf https://bugs.eclipse.org/bugs/show_bug.cgi?id=374341 }