예제 #1
0
        public void OnPropertyChanged(object sender, PropertyChangedEventArgs e) // For each fired event property changed
        {
            if (e.PropertyName == "Text")                                        // Text changed
            {
                CellInstance currentCell = sender as CellInstance;
                RemoveReferences(currentCell.Name);
                if (!string.IsNullOrEmpty(currentCell.Text) && currentCell.Text.StartsWith("=") && currentCell.Text.Length > 1)
                {
                    ExpTree expression = new ExpTree();
                    expression.ExpressionString = currentCell.Text.Substring(1);
                    AddReferences(currentCell.Name, expression.GetVar());
                }

                EvalCell(currentCell);
            }

            if (e.PropertyName == "BGColor") // Background Color changed
            {
                CellPropertyChanged(sender, new PropertyChangedEventArgs("BGColor"));
            }
        }
예제 #2
0
        public void EvalCell(Cell cell) // Evaluate a cell
        {
            CellInstance instance = cell as CellInstance;

            if (string.IsNullOrEmpty(cell.Text))
            {
                instance.SetValue("");                                            //set to nothing for default
                CellPropertyChanged(cell, new PropertyChangedEventArgs("Value")); // if value changed
            }

            else if (cell.Text[0] == '=' && cell.Text.Length > 1) // for an equation
            {
                bool    error      = false;
                ExpTree expression = new ExpTree();
                expression.ExpressionString = cell.Text.Substring(1);
                List <string> expressionVar = expression.GetVar();

                foreach (string variable in expressionVar) // check for errors
                {
                    if (variable == cell.Name)             // self reference
                    {
                        instance.SetValue("!(self reference)");
                        error = true;
                        break;
                    }
                    if (GetCell(variable) == null) // cell does not exist
                    {
                        instance.SetValue("!(bad reference)");
                        error = true;
                        break;
                    }
                    if (IsCircularReference(variable, cell.Name)) // circular reference
                    {
                        instance.SetValue("!(circular reference)");
                        error = true;
                        break;
                    }

                    Cell   variableCell = GetCell(variable);
                    double variableValue;

                    if (string.IsNullOrEmpty(variableCell.Value)) // check for empty value
                    {
                        expression.SetVar(variable, 0);
                    }

                    else if (!double.TryParse(variableCell.Value, out variableValue))
                    {
                        expression.SetVar(variable, 0);
                    }

                    else
                    {
                        expression.SetVar(variable, variableValue);
                    }
                }

                if (error) // for errors
                {
                    CellPropertyChanged(cell, new PropertyChangedEventArgs("Value"));
                    return;
                }
                //at this point, the variables are set
                instance.SetValue(expression.Eval().ToString()); // Evaluate expression and set value of Cell
                CellPropertyChanged(cell, new PropertyChangedEventArgs("Value"));
            }

            else // if not an expression
            {
                instance.SetValue(cell.Text); // chage text of cell
                CellPropertyChanged(cell, new PropertyChangedEventArgs("Value"));
            }

            if (_references.ContainsKey(instance.Name)) // Evaluate referenced cells
            {
                foreach (string cellName in _references[instance.Name])
                {
                    EvalCell(GetCell(cellName));
                }
            }
        }