package com.framsticks.gui.controls; import com.framsticks.core.Instance; import com.framsticks.core.Path; import com.framsticks.gui.Gui; import com.framsticks.gui.TreeNode; import com.framsticks.params.Param; import com.framsticks.params.ValueParam; import com.framsticks.params.types.ProcedureParam; import com.framsticks.util.FramsticksException; import com.framsticks.util.Logging; import com.framsticks.util.dispatching.Future; import com.framsticks.util.dispatching.RunAt; import javax.swing.*; import javax.swing.border.BevelBorder; import org.apache.log4j.Logger; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; @SuppressWarnings("serial") public class ProcedureControl extends Control implements ControlOwner { private static final Logger log = Logger.getLogger(ProcedureControl.class); protected final JButton procedureButton; final protected Map components = new HashMap<>(); public ProcedureControl(ProcedureParam procedureParam) { super(procedureParam); procedureButton = new JButton("Call"); procedureButton.setName("call"); this.setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); Gui.fillWithControls(this, procedureParam.getArgumentsType(), components, ValueControl.class); if (components.size() != procedureParam.getArgumentsType().size()) { procedureButton.setEnabled(false); } if (!components.isEmpty()) { this.setBorder(new BevelBorder(BevelBorder.RAISED)); } procedureButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { TreeNode treeNode = owner.getCurrentTreeNode(); assert treeNode != null; log.debug("calling " + getParam() + " on " + treeNode); final Path path = treeNode.getInstancePath(); final List arguments = new LinkedList(); for (Param arg : getParam().getArgumentsType()) { arguments.add(((ValueControl) components.get(arg)).getCurrentValue()); } path.getInstance().dispatch(new RunAt() { @Override public void run() { path.getInstance().call(path, getParam(), arguments.toArray(), new Future() { @Override public void handle(FramsticksException e) { Logging.log(log, "call procedure", path, e); } @Override public void result(Object result) { } }); } }); } }); this.add(procedureButton); } @Override public JPanel getPanel() { return this; } @Override public TreeNode getCurrentTreeNode() { return owner.getCurrentTreeNode(); } @Override public ProcedureParam getParam() { return (ProcedureParam) param; } }