blob: 4c449f29a1509607ebb3809148c84fcec350a92a [file] [log] [blame]
/**
* Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf, Austria), Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
* 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:
* Florian Pirchner - Initial implementation
*/
package org.eclipse.osbp.runtime.web.vaadin.databinding.properties;
import java.util.Arrays;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.property.INativePropertyListener;
import org.eclipse.core.databinding.property.ISimplePropertyListener;
import org.eclipse.core.databinding.property.value.SimpleValueProperty;
import org.eclipse.osbp.runtime.web.vaadin.databinding.VaadinObservables;
import org.eclipse.osbp.runtime.web.vaadin.databinding.component.internal.ComponentListener;
import org.eclipse.osbp.runtime.web.vaadin.databinding.values.IVaadinObservableValue;
import org.eclipse.osbp.runtime.web.vaadin.databinding.values.SimpleVaadinPropertyObservableValue;
import org.eclipse.osbp.runtime.web.vaadin.databinding.values.VaadinObservableValueDecorator;
import com.vaadin.ui.Component;
// TODO: Auto-generated Javadoc
/**
* Abstract value property implementation for {@link Component} properties. This
* class implements some basic behavior that widget properties are generally
* expected to have, namely:
* <ul>
* <li>Calling {@link #observe(Object)} should create the observable on the UI
* realm of the widget, rather than the current default realm
* <li>All <code>observe()</code> methods should return an
* {@link IVaadinObservableValue}
* </ul>
* This class also provides a default widget listener implementation using
* vaadins event concept. Subclasses may pass one or more vaadin event types
* (sub class of {@link Component.Event}) to the super constructor to indicate
* which events signal a property change.
*/
public abstract class AbstractVaadinValueProperty extends SimpleValueProperty
implements IVaadinValueProperty {
/** The change events. */
private Class<? extends Component.Event>[] changeEvents;
/** The stale events. */
private Class<? extends Component.Event>[] staleEvents;
/**
* Constructs a ComponentValueProperty which does not listen for any vaadin
* events.
*/
protected AbstractVaadinValueProperty() {
this(new Class[0], new Class[0]);
}
/**
* Constructs a ComponentValueProperty with the specified vaadin event type.
*
* @param changeEvent
* vaadin event type of the event that signifies a property
* change.
*/
@SuppressWarnings("unchecked")
protected AbstractVaadinValueProperty(
Class<? extends Component.Event> changeEvent) {
this(new Class[] { changeEvent }, new Class[0]);
}
/**
* Constructs a ComponentValueProperty with the specified vaadin event
* type(s).
*
* @param changeEvents
* array of vaadin event constants of the events that signify a
* property change.
*/
@SuppressWarnings("unchecked")
protected AbstractVaadinValueProperty(
Class<? extends Component.Event>[] changeEvents) {
this(changeEvents, new Class[0]);
}
/**
* Constructs a ComponentValueProperty with the specified vaadin event
* types.
*
* @param changeEvents
* array of vaadin event types of the events that signify a
* property change.
* @param staleEvents
* array of vaadin event types of the events that signify a
* property became stale.
*/
public AbstractVaadinValueProperty(
Class<? extends Component.Event>[] changeEvents,
Class<? extends Component.Event>[] staleEvents) {
this.changeEvents = Arrays.copyOf(changeEvents, changeEvents.length);
this.staleEvents = Arrays.copyOf(staleEvents, staleEvents.length);
}
/* (non-Javadoc)
* @see org.eclipse.core.databinding.property.value.SimpleValueProperty#adaptListener(org.eclipse.core.databinding.property.ISimplePropertyListener)
*/
public INativePropertyListener adaptListener(
ISimplePropertyListener listener) {
if (changeEvents == null && staleEvents == null) {
return null;
}
return new ComponentListener(this, listener, changeEvents, staleEvents);
}
/* (non-Javadoc)
* @see org.eclipse.core.databinding.property.value.ValueProperty#observe(java.lang.Object)
*/
public IVaadinObservableValue observe(Object source) {
if (source instanceof Component) {
return observe((Component) source);
}
return (IVaadinObservableValue) super.observe(source);
}
/**
* Is used to observe the com.vaadin.data.Property#value attribute.
*
* @param realm
* the realm
* @param source
* the source
* @return the i vaadin observable value
*/
public IVaadinObservableValue observeVaadinProperty(Realm realm,
Object source) {
if (source instanceof com.vaadin.data.Property) {
return wrapObservable(new SimpleVaadinPropertyObservableValue(
realm, source, this));
}
return wrapObservable(super.observe(realm, source));
}
/**
* Is used to observe the com.vaadin.data.Property#value attribute.
*
* @param source
* the source
* @return the i vaadin observable value
*/
public IVaadinObservableValue observeVaadinProperty(Object source) {
return observeVaadinProperty(Realm.getDefault(), source);
}
/* (non-Javadoc)
* @see org.eclipse.core.databinding.property.value.SimpleValueProperty#observe(org.eclipse.core.databinding.observable.Realm, java.lang.Object)
*/
public IObservableValue observe(Realm realm, Object source) {
return wrapObservable(super.observe(realm, source));
}
/**
* Wrap observable.
*
* @param observable
* the observable
* @return the i vaadin observable value
*/
protected IVaadinObservableValue wrapObservable(IObservableValue observable) {
return new VaadinObservableValueDecorator(observable);
}
/**
* Observe.
*
* @param widget
* the widget
* @return the i vaadin observable value
*/
public IVaadinObservableValue observe(Component widget) {
return (IVaadinObservableValue) observe(
VaadinObservables.getRealm(VaadinObservables.getUI(widget)),
widget);
}
/**
* Observe delayed.
*
* @param delay
* the delay
* @param widget
* the widget
* @return the i vaadin observable value
*/
public IVaadinObservableValue observeDelayed(int delay, Component widget) {
throw new UnsupportedOperationException("Delayed not allowed");
}
/* (non-Javadoc)
* @see org.eclipse.osbp.runtime.web.vaadin.databinding.properties.IVaadinValueProperty#observeDelayed(int, java.lang.Object)
*/
@Override
public IVaadinObservableValue observeDelayed(int delay, Object component) {
throw new UnsupportedOperationException("Not implemented yet");
}
}