/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package expressionevaluation;

import expressiontree.ExpressionTreeElement;
import expressiontree.operands.Matrix;
import expressiontree.operands.NumberType;
import expressiontree.operators.Operator;
import java.util.LinkedList;
import org.apfloat.Apfloat;
import xmlhandling.ExpressionLogicalException;

/**
 * A függvényrajzolást segítő osztály.
 * @author Esta
 */
public class FunctionDrawHelper {

    /**
     * A változók elemeket tartalmazó láncolt lista
     */
    private LinkedList<NumberType> varList;

    /**
     * A változók listáját összeállító metódus.
     * @param gyoker value kifejezésfa gyökere.
     * @throws xmlhandling.ExpressionLogicalException Ha mátrixot találtunk.
     */
    public void getVarList(ExpressionTreeElement gyoker) throws ExpressionLogicalException {
        //rekurzív fabejárás
        if (gyoker instanceof Matrix) {
            if (gyoker instanceof NumberType) {
                NumberType n = (NumberType) gyoker;
                if (n.isVariable()) {
                    this.varList.add((NumberType) gyoker);
                }
            } else {
                throw new ExpressionLogicalException("MATRIX_DRAW_IS_NOT_SUPPORTED");
            }
        } else if (gyoker instanceof Operator) {
            Operator op = (Operator) gyoker;
            for(ExpressionTreeElement e:op.getOperands()) {
                this.getVarList(e);
            }
        }
    }

    /**
     * Kicseréli value változók értékét value kapott számra.
     * @param value value kapott szám
     */
    public void swapVariables(Apfloat value) {
        for(NumberType n:this.varList) {
            n.setValue(value);
        }
    } 
    
    /**
     * Az alapértelmezett konstruktor.
     */
    public FunctionDrawHelper() {
        this.varList = new LinkedList<NumberType>();
    }
}
