001    /*
002     * Copyright (c) 2005 Einar Pehrson <einar@pehrson.nu>.
003     *
004     * This file is part of
005     * CleanSheets - a spreadsheet application for the Java platform.
006     *
007     * CleanSheets is free software; you can redistribute it and/or modify
008     * it under the terms of the GNU General Public License as published by
009     * the Free Software Foundation; either version 2 of the License, or
010     * (at your option) any later version.
011     *
012     * CleanSheets is distributed in the hope that it will be useful,
013     * but WITHOUT ANY WARRANTY; without even the implied warranty of
014     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
015     * GNU General Public License for more details.
016     *
017     * You should have received a copy of the GNU General Public License
018     * along with CleanSheets; if not, write to the Free Software
019     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
020     */
021    package csheets.core.formula.lang;
022    
023    import csheets.core.IllegalValueTypeException;
024    import csheets.core.Value;
025    import csheets.core.formula.Expression;
026    import csheets.core.formula.Function;
027    import csheets.core.formula.FunctionParameter;
028    
029    /**
030     * A function that emulates the if-then-else statement.
031     * @author Einar Pehrson
032     */
033    public class If implements Function {
034    
035            /** The function's three parameters: condition, result and alternative */
036            public static final FunctionParameter[] parameters = new FunctionParameter[] {
037                    new FunctionParameter(Value.Type.BOOLEAN, "Condition", false,
038                            "A condition to evaluate before proceeding"),
039                    new FunctionParameter(Value.Type.UNDEFINED, "Then", false,
040                            "A value to return if the condition was met"),
041                    new FunctionParameter(Value.Type.UNDEFINED, "Else", true,
042                            "A value to return otherwise")
043            };
044    
045            /**
046             * Creates a new instance of the IF function.
047             */
048            public If() {}
049    
050            public String getIdentifier() {
051                    return "IF";
052            }
053    
054            public Value applyTo(Expression[] arguments) throws IllegalValueTypeException {
055                    if (arguments[0].evaluate().toBoolean())
056                            return arguments[1].evaluate();
057                    else if (arguments.length == 3)
058                            return arguments[2].evaluate();
059                    else
060                            return new Value();
061            }
062    
063            public FunctionParameter[] getParameters() {
064                    return parameters;
065            }
066    
067            public boolean isVarArg() {
068                    return false;
069            }
070    }