/******************************************************************************* * Copyright (c) 2006-2013 The RCP Company and others. * 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: * The RCP Company - initial API and implementation *******************************************************************************/ package com.rcpcompany.uibindings.internal.bindingMessages.messageAdapters; import org.eclipse.core.databinding.Binding; import org.eclipse.core.databinding.observable.Diffs; import org.eclipse.core.databinding.observable.value.AbstractObservableValue; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.core.databinding.observable.value.IValueChangeListener; import org.eclipse.core.databinding.observable.value.ValueChangeEvent; import org.eclipse.core.runtime.IStatus; import com.rcpcompany.uibindings.BindingMessageSeverity; import com.rcpcompany.uibindings.IBindingMessage; import com.rcpcompany.uibindings.IValueBinding; import com.rcpcompany.uibindings.bindingMessages.AbstractBindingMessage; import com.rcpcompany.uibindings.internal.Activator; import com.rcpcompany.utils.logging.LogUtils; /** * Decorator message observable value for a data binding of a value binding. */ public class DataBindingDecoratorMessageObservableValue extends AbstractObservableValue { /** * The binding of this object. */ protected final IValueBinding myValueBinding; /** * The data binding monitored by this object. */ protected final Binding myDataBinding; /** * The current message of the observable value. */ protected Message myMessage; /** * The current validation status of the data binding. */ protected final IObservableValue myValidationStatus; /** * Constructs and returns a new observable value. * * @param valueBinding the value binding * @param dataBinding the data binding */ public DataBindingDecoratorMessageObservableValue(IValueBinding valueBinding, Binding dataBinding) { myValueBinding = valueBinding; myDataBinding = dataBinding; myValidationStatus = myDataBinding.getValidationStatus(); myMessage = new Message(myValueBinding, (IStatus) myValidationStatus.getValue()); } @Override public synchronized void dispose() { if (hasListeners()) { lastListenerRemoved(); } super.dispose(); } @Override protected void firstListenerAdded() { super.firstListenerAdded(); myValidationStatus.addValueChangeListener(myListener); } @Override protected void lastListenerRemoved() { myValidationStatus.removeValueChangeListener(myListener); super.lastListenerRemoved(); } @Override protected Object doGetValue() { return myMessage; } @Override public Object getValueType() { return IBindingMessage.class; } private final IValueChangeListener myListener = new IValueChangeListener() { @Override public void handleValueChange(ValueChangeEvent event) { // Only report changes when the value is in fact changed final IStatus oldValue = (IStatus) event.diff.getOldValue(); final IStatus newValue = (IStatus) event.diff.getNewValue(); if ((oldValue.getSeverity() == newValue.getSeverity()) && (oldValue.getMessage().equals(newValue.getMessage()))) return; if (Activator.getDefault().TRACE_MESSAGE_DECORATION_VALIDATION_STATUS) { LogUtils.debug(DataBindingDecoratorMessageObservableValue.this, "Change: " + myValueBinding + "\n" + oldValue.getSeverity() + " -> " + newValue.getSeverity() + "\n" + oldValue.getMessage() + " -> " + newValue.getMessage()); } fireValueChange(Diffs.createValueDiff(myMessage, myMessage = new Message(myValueBinding, (IStatus) myValidationStatus.getValue()))); } }; private class Message extends AbstractBindingMessage { private final IStatus myStatus; private Message(IValueBinding binding, IStatus status) { super(binding); myStatus = status; addTarget(binding.getModelObject(), binding.getModelFeature(), null); } @Override public Object getData() { return myDataBinding; } @Override public String getMessage() { return myStatus.getMessage(); } @Override public BindingMessageSeverity getSeverity() { switch (myStatus.getSeverity()) { case IStatus.OK: return BindingMessageSeverity.NONE; case IStatus.INFO: return BindingMessageSeverity.INFORMATION; case IStatus.WARNING: return BindingMessageSeverity.WARNING; case IStatus.ERROR: return BindingMessageSeverity.ERROR; default: return BindingMessageSeverity.NONE; } } @Override public int getCode() { return myStatus.getCode(); } @Override public String getSource() { return myStatus.getPlugin(); } } }