package com.framsticks.gui.controls; import com.framsticks.core.Tree; 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.dispatching.ExceptionResultHandler; import com.framsticks.util.dispatching.FutureHandler; import com.framsticks.util.dispatching.RunAt; import com.framsticks.util.dispatching.ThrowExceptionHandler; 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.getTreePath(); final List arguments = new LinkedList(); for (Param arg : getParam().getArgumentsType()) { Object value = components.get(arg).getCurrentValue(); arguments.add(value); log.debug("argument " + arg + ": " + value); } //TODO FEH: make it show dialog final ExceptionResultHandler handler = ThrowExceptionHandler.getInstance(); path.getTree().dispatch(new RunAt(handler) { @Override protected void runAt() { path.getTree().call(path, getParam(), arguments.toArray(), new FutureHandler(handler) { @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; } }