package nl.utwente.viskell.ui.components; import com.google.common.collect.ImmutableMap; import javafx.scene.control.Label; import javafx.scene.layout.Region; import nl.utwente.viskell.haskell.env.FunctionInfo; import nl.utwente.viskell.haskell.expr.Expression; import nl.utwente.viskell.haskell.expr.FunVar; import nl.utwente.viskell.haskell.type.Type; import nl.utwente.viskell.haskell.type.TypeScope; import nl.utwente.viskell.ui.BlockContainer; import nl.utwente.viskell.ui.serialize.Bundleable; import java.lang.reflect.InvocationTargetException; import java.util.Map; import java.util.Optional; import java.util.Set; public class LibraryFunUse extends Label implements FunctionReference { private final FunctionInfo funInfo; public LibraryFunUse(FunctionInfo funInfo) { super(funInfo.getDisplayName()); this.funInfo = funInfo; this.setMinWidth(USE_PREF_SIZE); this.setMaxWidth(USE_PREF_SIZE); this.getStyleClass().add("title"); } public Map<String, Object> toBundleFragment() { return ImmutableMap.of( Bundleable.KIND, this.getClass().getSimpleName(), "funInfo", this.funInfo.toBundleFragment() ); } public static LibraryFunUse fromBundleFragment(Map<String, Object> bundleFragment) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { Map<String, Object> funInfoBundle = (Map<String, Object>)bundleFragment.get("funInfo"); FunctionInfo funInfo = FunctionInfo.fromBundleFragment(funInfoBundle); return new LibraryFunUse(funInfo); } public FunctionInfo getFunInfo() { return this.funInfo; } @Override public void initializeBlock(Block funBlock) { } @Override public Optional<InputAnchor> getInputAnchor() { return Optional.empty(); } @Override public int requiredArguments() { return this.funInfo.argumentCount(); } @Override public Type refreshedType(int argCount, TypeScope scope) { return this.funInfo.getFreshSignature(); } @Override public Expression getLocalExpr(Set<OutputAnchor> outsideAnchors) { return new FunVar(this.funInfo); } @Override public void invalidateVisualState() { } @Override public Region asRegion() { return this; } @Override public FunctionReference getNewCopy() { return new LibraryFunUse(this.funInfo); } @Override public String getName() { return this.funInfo.getDisplayName(); } @Override public boolean isScopeCorrectIn(BlockContainer container) { return true; } @Override public void deleteLinks() { } }