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")); } }
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)); } } }