blob: fe149781247db9184b72709cd12878ddf8e47cf5 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2007 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.core.databinding.observable;
/**
* An object with state that allows to listen for state changes.
*
* <p>
* Implementations must not manage listeners themselves, listener management
* must be delegated to a private instance of type {@link ChangeSupport} if it
* is not inherited from {@link AbstractObservable}.
* </p>
*
* @noextend This interface is not intended to be extended by clients.
* @noimplement This interface is not intended to be implemented by clients.
* Clients should instead subclass one of the classes in the
* framework that implement this interface. Note that direct
* implementers of this interface outside of the framework will be
* broken in future releases when methods are added to this
* interface.
*
* @since 1.0
*
*/
public interface IObservable {
/**
* Returns the realm for this observable. Unless otherwise specified,
* getters and setters must be accessed from within this realm. Listeners
* will be within this realm when they receive events from this observable.
* <p>
* Because observables can only be accessed from within one realm, and they
* always fire events on that realm, their state can be observed in an
* incremental way. It is always safe to call getters of an observable from
* within a change listener attached to that observable.
* </p>
*
* @return the realm
*/
public Realm getRealm();
/**
* Adds the given change listener to the list of change listeners. Change
* listeners are notified about changes of the state of this observable in a
* generic way, without specifying the change that happened. To get the
* changed state, a change listener needs to query for the current state of
* this observable.
*
* @param listener
*/
public void addChangeListener(IChangeListener listener);
/**
* Removes the given change listener from the list of change listeners. Has
* no effect if the given listener is not registered as a change listener.
*
* @param listener
*/
public void removeChangeListener(IChangeListener listener);
/**
* Adds the given stale listener to the list of stale listeners. Stale
* listeners are notified when an observable object becomes stale, not when
* is becomes non-stale.
*
* @param listener
*
* @see #isStale()
*/
public void addStaleListener(IStaleListener listener);
/**
* Removes the given stale listener from the list of stale listeners. Has no
* effect if the given listener is not registered as a stale listener.
*
* @param listener
*/
public void removeStaleListener(IStaleListener listener);
/**
* Returns whether the state of this observable is stale and is expected to
* change soon. A non-stale observable that becomes stale will notify its
* stale listeners. A stale object that becomes non-stale does so by
* changing its state and notifying its change listeners, it does <b>not</b>
* notify its stale listeners about becoming non-stale. Clients that do not
* expect asynchronous changes may ignore staleness of observable objects.
*
* @return true if this observable's state is stale and will change soon.
*
* @TrackedGetter - implementers must call
* {@link ObservableTracker#getterCalled(IObservable)}.
*/
public boolean isStale();
/**
* Disposes of this observable object, removing all listeners registered
* with this object, and all listeners this object might have registered on
* other objects.
*/
public void dispose();
}