//package org.rascalmpl.eclipse.library.vis.figure.keys; // //import io.usethesource.vallang.IConstructor; //import io.usethesource.vallang.IList; //import io.usethesource.vallang.INumber; //import io.usethesource.vallang.IValue; //import io.usethesource.vallang.impl.fast.ValueFactory; //import io.usethesource.vallang.type.Type; //import io.usethesource.vallang.type.TypeFactory; //import org.rascalmpl.eclipse.library.vis.figure.FigureFactory; //import org.rascalmpl.eclipse.library.vis.figure.combine.WithInnerFig; //import org.rascalmpl.eclipse.library.vis.graphics.GraphicsContext; //import org.rascalmpl.eclipse.library.vis.properties.Properties; //import org.rascalmpl.eclipse.library.vis.properties.PropertyManager; //import org.rascalmpl.eclipse.library.vis.swt.IFigureConstructionEnv; //import org.rascalmpl.eclipse.library.vis.util.Key; //import org.rascalmpl.eclipse.library.vis.util.NameResolver; // //public class IntervalKey extends WithInnerFig implements Key { // // IValue explain; // IValue interpolate; // // TODO: can this type be more general? (i.e. Comparable) // INumber low,high, interval; // private IList childProps; // String id; // IFigureConstructionEnv env; // // public IntervalKey(IFigureConstructionEnv env,IValue interpolate, IValue explain, PropertyManager properties,IList childProps){ // super(null,properties); // this.childProps = childProps; // id = getIdProperty(); // this.explain = explain; // this.interpolate = interpolate; // this.env = env; // } // // // public void init(){ // super.init(); // interval = high = low = null; // } // // public void finalize(){ // if(high == null){ // high = ValueFactory.getInstance().real(0); // } // if(low == null){ // low = ValueFactory.getInstance().real(0); // } // if(low.toReal().isEqual(high.toReal())){ // low = ValueFactory.getInstance().real(0); // } // if(low.toReal().isEqual(high.toReal())){ // interval = ValueFactory.getInstance().real(1); // } else { // interval = high.subtract(low); // } // // // //System.out.printf("Nominal finalize bbox start!\n"); // if(innerFig != null){ // innerFig.destroy(); // } // // TypeFactory tf = TypeFactory.getInstance(); // Type[] argTypes = {tf.valueType(),tf.valueType()}; // IValue[] args = {low,high}; // //System.out.printf("IntervalKey %s explain callBack!\n",id); // IConstructor figureCons = (IConstructor) // env.getCallBackEnv().executeRascalCallBack(explain,argTypes,args).getValue(); // //System.out.printf("IntervalKey %s explain done!\n",id); // innerFig = FigureFactory.make(env, figureCons, prop, childProps); // innerFig.init(); // innerFig.computeFiguresAndProperties(env.getCallBackEnv()); // NameResolver resolver = new NameResolver( env.getRascalContext()); // innerFig.registerNames(resolver); // innerFig.registerValues(resolver); // innerFig.getLikes(resolver); // innerFig.finalize(); // prop = innerFig.prop; // } // // public void bbox(){ // innerFig.bbox(); // minSize.set(innerFig.minSize); // setResizable(); // //System.out.printf("Nominal key bbox done!\n"); // } // // @Override // public void layout() { // innerFig.size.set(size); // innerFig.location.set(location); // innerFig.layout(); // } // // public void registerNames(NameResolver resolver) { // resolver.register(id,this); // } // // @Override // public void draw(GraphicsContext gc) { // innerFig.draw(gc); // // } // // public void registerValue(Properties prop, IValue val) { // if(!(val instanceof INumber)) return; // INumber n = (INumber) val; // if(low == null){ // low = n; // } else if(n.less(low).getValue()){ // low = n; // } // if(high == null){ // high = n; // } else if(n.greater(high).getValue()){ // high = n; // } // } // // public void registerOffset(double offset) { // return; // // } // // public IValue scaleValue(IValue val) { // if(!(val instanceof INumber)) return ValueFactory.getInstance().real(0); // INumber n = (INumber) val; // INumber part; // // //System.out.printf("DIv undefined? %s %s %s",low, high,interval); // part = n.subtract(low).divide(interval,10); // // // TypeFactory tf = TypeFactory.getInstance(); // //System.out.printf("IntervalKey %s scale callBack!\n",id); // IValue res = // env.getCallBackEnv().executeRascalCallBackSingleArgument(interpolate, tf.valueType(), part).getValue(); // //System.out.printf("IntervalKey %s scale done!\n",id); // return res; // } // // public String getId() { // return id; // } // //}