Android Open Source - jadab Property






From Project

Back to project page jadab.

License

The source code is released under:

Apache License

If you think the Android project jadab listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/**
 * Copyright 2011 Kjetil rbekk//from  w w w. j av a2  s .  c  om
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License. See accompanying LICENSE file.
 */

package com.github.binding;

import java.util.List;
import java.util.ArrayList;

import com.github.event.PropertyChangeListener;
import com.github.util.ObjectUtil;


/**
 * Hold a property for a class.
 * 
 * A sophisticated wrapper for a property, supporting {@code PropertyChangeListener}s.
 * 
 * Used with the data binding framework.
 * 
 * @param <T>
 *            The type of this property.
 */
public class Property<T> {
    
    /**
     * A listener that is used to update this property.
     * 
     * When this property is bound to another property, it will listen to
     * changes to the other property and update itself on change.
     */
    private class OnPropertyChangeUpdater implements PropertyChangeListener<T> {
        @Override public void propertyChanged(Property<T> property) {
            set(property.get());
        }      
    }
    
    private T data;
    private List<PropertyChangeListener<T>> listeners = new ArrayList<PropertyChangeListener<T>>();
    private OnPropertyChangeUpdater updateListener = new OnPropertyChangeUpdater();
    
    public Property(T data) {
        this.data = data;
    }

    /**
     * @return The data contained in this property.
     */
    public T get() {
        return data;
    }

    /**
     * Override this method to receive property changes.
     * 
     * Called before other bindings are notified.
     * 
     * Note: Changing the property inside {@code onChange} triggers a recursive call.
     */
    protected void onChange(T newValue) {
        // Empty.
    }
    
    /** 
     * Create a binding between this property and {@code other}.
     * 
     * Immediately notify {@code other} of our value, unless our value is null.
     */
    public void bind(Property<T> other) {
        PropertyChangeListener<T> listener = other.getOnPropertyChangeUpdater();
        addListener(listener);
        if (get() != null) {
            listener.propertyChanged(this);
        }
    }
    
    /**
     * Create a binding builder with this as the source.
     * 
     * Example:
     * <pre>
     * {@code
     * property.bind().to(anotherProperty).build();
     * }
     * </pre>
     */
    public BindingBuilder<T> bind() {
        return new BindingBuilder<T>().from(this);
    }
    
    /**
     * Set the data for this property.
     * 
     * Notifies listeners that the data was changed.
     */
    public void set(T data) {
        if (ObjectUtil.equals(this.data, data)) {
            this.data = data;
        } else {
            this.data = data;
            onChange(data);
            notifyListeners();
        }
    }

    protected void notifyListeners() {
        for (PropertyChangeListener<T> listener : listeners) {
            listener.propertyChanged(this);
        }
    }

    void addListener(PropertyChangeListener<T> listener) {
        listeners.add(listener);
    }

    void removeListener(PropertyChangeListener<T> listener) {
        listeners.remove(listener);
    }
    
    PropertyChangeListener<T> getOnPropertyChangeUpdater() {
        return updateListener;
    }
}




Java Source Code List

com.github.binding.AbstractBinding.java
com.github.binding.BindingBuilder.java
com.github.binding.PropertyExtractor.java
com.github.binding.Property.java
com.github.binding.android.AndroidPrefix.java
com.github.binding.android.BindingActivity.java
com.github.binding.android.BindingFactory.java
com.github.binding.android.BindingName.java
com.github.binding.android.Constants.java
com.github.binding.android.propertyprovider.AbstractPropertyProvider.java
com.github.binding.android.propertyprovider.PropertyProviderFactory.java
com.github.binding.android.propertyprovider.PropertyProviderStack.java
com.github.binding.android.propertyprovider.PropertyProvider.java
com.github.binding.android.propertyprovider.TextViewPropertyProvider.java
com.github.binding.android.propertyprovider.ViewPropertyProvider.java
com.github.binding.android.propertyprovider.listener.OnClickListenerProperty.java
com.github.binding.android.propertyprovider.listener.TextWatcherProperty.java
com.github.event.PropertyChangeListener.java
com.github.jadab.example.CalculatorActivity.java
com.github.jadab.example.logic.DbaCalculatorLogic.java
com.github.util.ObjectUtil.java