package fr.lteconsulting.hexa.databinding.tools.whenchanges; import java.util.ArrayList; import fr.lteconsulting.hexa.client.tools.Action; import fr.lteconsulting.hexa.databinding.propertyadapters.WriteOnlyPropertyAdapter; import fr.lteconsulting.hexa.databinding.tools.SmartRegistration; /** * A fluent style class used to be called when some data changes. * * <p>For example you can use it like this : * <pre> WhenChangesHappen .In( this, "mainOperation.label" ) .In( this, "mainOperation.account.name" ) .In( this, "mainOperation.writing.balance" ) .Call( new Action() { public void exec() { // write code depending on the above datas } } ); * </pre> * @author Arnaud * */ public class WhenChangesHappen { public static WhenChangesHappenInstance In( Object object, String path ) { return new WhenChangesHappenInstance().In( object, path ); } public static class WhenChangesHappenInstance { private ArrayList<Object> objects = new ArrayList<>(); private ArrayList<String> paths = new ArrayList<>(); private ArrayList<SmartRegistration> registrations = new ArrayList<>(); private Action action; private WriteOnlyPropertyAdapter adapter = new WriteOnlyPropertyAdapter() { @Override public void setValue( Object object ) { if( action == null ) return; action.exec(); } }; public WhenChangesHappenInstance In( Object object, String path ) { objects.add( object ); paths.add( path ); return this; } public void Call( Action action ) { this.action = action; for( SmartRegistration sm : registrations ) sm.unregister(); for( int i=0; i<objects.size(); i++ ) { if( registrations.size() <= i ) registrations.add( new SmartRegistration( adapter ) ); registrations.get( i ).register( objects.get(i), paths.get(i) ); } } } }