package com.insightfullogic.honest_profiler.ports.javafx.util.handle;
import javafx.beans.InvalidationListener;
import javafx.beans.Observable;
import javafx.beans.value.ChangeListener;
/**
* Interface which facilitates binding {@link ChangeListener}s or {@link InvalidationListener}s to and unbinding them
* from an {@link Observable}.
* <p>
* Based on the pattern mentioned by <a href="http://blog.codefx.org/techniques/use-listenerhandles/">"Don’t Remove
* Listeners – Use ListenerHandles"</a>. A short quote :
* <p>
* <code>
* The ListenerHandle holds on to the references to the observable and the listener. Upon calls to attach() or detach()
* it either adds the listener to the observable or removes it. For this to be embedded in the language, all methods
* which currently add listeners to observables should return a handle to that combination.
* </code>
* <p>
* This was extended to allow reattaching the handle to a different {@link Observable}.
* <p>
* @param T the type of Observable the handle can reattach the listener to
*/
public interface ListenerHandle<T extends Observable>
{
/**
* Add the contained listener to the contained {@link Observable}. If the listener has already been added to an
* {@link Observable}, {@link #detach()} will be called first. If the contained {@link Observable} is null the
* method returns without doing anything.
*/
void attach();
/**
* Remove the contained listener from the contained {@link Observable} if the handle is attached.
*/
void detach();
/**
* Remove the contained listener from the currently contained {@link Observable}, switch the contained
* {@link Observable} to the new, specified {@link Observable} and add the contained listener to it.
* <p>
* @param observable the {@link Observable} the listener will be added to
*/
void reattach(T observable);
}