/****************************************************************************** * Copyright (c) 2016 Oracle * 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: * Konstantin Komissarchik - initial implementation and ongoing maintenance ******************************************************************************/ package org.eclipse.sapphire.util; import org.eclipse.sapphire.Event; import org.eclipse.sapphire.Listener; import org.eclipse.sapphire.ListenerContext; /** * An object reference that can be changed after creation. * * @author <a href="mailto:konstantin.komissarchik@oracle.com">Konstantin Komissarchik</a> */ public final class MutableReference<T> { private T value; private ListenerContext listeners; public MutableReference() { this( null ); } public MutableReference( final T value ) { this.value = value; } public synchronized T get() { return this.value; } public synchronized void set( final T value ) { final T oldValue = this.value; this.value = value; if( this.listeners != null ) { this.listeners.broadcast( new ReferenceChangedEvent( oldValue, value ) ); } } public synchronized boolean attach( final Listener listener ) { if( this.listeners == null ) { this.listeners = new ListenerContext(); } return this.listeners.attach( listener ); } public synchronized boolean detach( final Listener listener ) { if( this.listeners == null ) { this.listeners = new ListenerContext(); } return this.listeners.detach( listener ); } public final class ReferenceChangedEvent extends Event { private final T before; private final T after; private ReferenceChangedEvent( final T before, final T after ) { this.before = before; this.after = after; } public T before() { return this.before; } public T after() { return this.after; } } }