/************************************************************* * Function: Eval(Cell cell) * Date Created: Feb 8, 2017 * Date Last Modified: Feb 9, 2017 * Description: eval * Return: void *************************************************************/ private void Eval(Cell cell) { createACell m_Cell = cell as createACell; if (string.IsNullOrEmpty(m_Cell.Text)) { m_Cell.SetValue(""); CellPropertyChanged(cell, new PropertyChangedEventArgs("Value")); } else if (m_Cell.Text[0] == '=' && m_Cell.Text.Length >= 3) { string letter = m_Cell.Text.Substring(1); string number = letter.Substring(1); string lettersAZ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int col = 0, row = int.Parse(number) - 1; for (int i = 0; i < 26; i++) { if (lettersAZ[i] == letter[0]) { col = i; break; } } m_Cell.SetValue(GetCell(row, col).Text); CellPropertyChanged(cell, new PropertyChangedEventArgs("Value")); } else { m_Cell.SetValue(m_Cell.Text); CellPropertyChanged(cell, new PropertyChangedEventArgs("Value")); } }
/************************************************************* * Function: Eval(Cell cell) * Date Created: Feb 8, 2017 * Date Last Modified: Feb 9, 2017 * Description: eval * Return: void *************************************************************/ private void Eval(Cell cell) { createACell m_Cell = cell as createACell; if (string.IsNullOrEmpty(m_Cell.Text)) { setEmpty(m_Cell, cell); } // if it is an exp else if (m_Cell.Text[0] == '=' && m_Cell.Text.Length >= 3) { setExp(m_Cell, cell); } else { setText(m_Cell, cell); } if (depDict.ContainsKey(m_Cell.Name)) { foreach (var dependentCell in depDict[m_Cell.Name]) { Eval(dependentCell); } } }
/************************************************************* * Function: Eval(Cell cell) * Date Created: Feb 8, 2017 * Date Last Modified: Feb 9, 2017 * Description: eval * Return: void *************************************************************/ private void Eval(Cell cell) { bool flag = false; createACell m_Cell = cell as createACell; // null or empty if (string.IsNullOrEmpty(m_Cell.Text)) { setEmpty(m_Cell, cell); } // if it is an exp else if (m_Cell.Text[0] == '=' && m_Cell.Text.Length >= 2) { setExp(m_Cell, cell, ref flag); if (flag) { return; } } // others being text else { setText(m_Cell, cell); } if (depDict.ContainsKey(m_Cell.Name)) { foreach (var dependentCell in depDict[m_Cell.Name]) { Eval(dependentCell); } } }
/************************************************************* * Function: OnPropertyChanged(object sender, PropertyChangedEventArgs e) * Date Created: Feb 8, 2017 * Date Last Modified: Feb 9, 2017 * Description: OnPropertyChanged * Return: void *************************************************************/ public void OnPropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == "Text") { createACell tmpCell = sender as createACell; Eval(sender as Cell); } }
/************************************************************* * Function: Spreadsheet(int RowIndex, int ColumnIndex) * Date Created: Feb 8, 2017 * Date Last Modified: Feb 9, 2017 * Description: Spreadsheet cons * Return: NONE *************************************************************/ public Spreadsheet(int RowIndex, int ColumnIndex) { array = new Cell[RowIndex, ColumnIndex]; for (int x = 0; x < RowIndex; x++) { for (int y = 0; y < ColumnIndex; y++) { array[x, y] = new createACell(x, y); array[x, y].PropertyChanged += OnPropertyChanged; } } }
/************************************************************* * Function: OnPropertyChanged(object sender, PropertyChangedEventArgs e) * Date Created: Feb 8, 2017 * Date Last Modified: Feb 9, 2017 * Description: OnPropertyChanged * Return: void *************************************************************/ public void OnPropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == "Text") { createACell tmpCell = sender as createACell; RemoveDep(tmpCell.Name); if (tmpCell.Text != "" && tmpCell.Text[0] == '=') { ExpTree exp = new ExpTree(tmpCell.Text.Substring(1)); MakeDep(tmpCell.Name, exp.GetAllVariables()); } Eval(sender as Cell); } }
/************************************************************* * Function: Spreadsheet(int RowIndex, int ColumnIndex) * Date Created: Feb 8, 2017 * Date Last Modified: Feb 9, 2017 * Description: Spreadsheet cons * Return: NONE *************************************************************/ public Spreadsheet(int RowIndex, int ColumnIndex) { array = new Cell[RowIndex, ColumnIndex]; depDict = new Dictionary <string, HashSet <string> >(); for (int x = 0; x < RowIndex; x++) { for (int y = 0; y < ColumnIndex; y++) { array[x, y] = new createACell(x, y); array[x, y].PropertyChanged += OnPropertyChanged; } } }
/************************************************************* * Function: setExp(createACell m_Cell, Cell cell) * Date Created: Feb 8, 2017 * Date Last Modified: Feb 9, 2017 * Description: set value to exp * Return: void *************************************************************/ private void setExp(createACell m_Cell, Cell cell) { ExpTree exptree = new ExpTree(m_Cell.Text.Substring(1)); string[] variables = exptree.GetAllVariables(); foreach (string variableName in variables) { Cell variableCell = GetCell(variableName); double value; if (string.IsNullOrEmpty(variableCell.Value)) { exptree.SetVar(variableCell.Name, 0); } else if (!double.TryParse(variableCell.Value, out value)) { exptree.SetVar(variableName, 0); } else { exptree.SetVar(variableName, value); } } m_Cell.SetValue(exptree.Eval().ToString()); CellPropertyChanged(cell, new PropertyChangedEventArgs("Value")); #region hw4code //old code from hw4 //string letter = m_Cell.Text.Substring(1); //string number = letter.Substring(1); //string lettersAZ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //int col = 0, row = int.Parse(number) - 1; //for (int i = 0; i < 26; i++) //{ // if (lettersAZ[i] == letter[0]) // { // col = i; // break; // } //} //m_Cell.SetValue(GetCell(row, col).Value.ToString()); #endregion }
/************************************************************* * Function: setExp(createACell m_Cell, Cell cell) * Date Created: Feb 8, 2017 * Date Last Modified: Feb 9, 2017 * Description: set value to exp * Return: void *************************************************************/ private void setText(createACell m_Cell, Cell cell) { m_Cell.SetValue(m_Cell.Text); CellPropertyChanged(cell, new PropertyChangedEventArgs("Value")); }
/************************************************************* * Function: setEmpty(createACell m_Cell, Cell cell) * Date Created: Feb 8, 2017 * Date Last Modified: Feb 9, 2017 * Description: set value to empty * Return: void *************************************************************/ private void setEmpty(createACell m_Cell, Cell cell) { m_Cell.SetValue(""); CellPropertyChanged(cell, new PropertyChangedEventArgs("Value")); }
/************************************************************* * Function: setExp(createACell m_Cell, Cell cell) * Date Created: Feb 8, 2017 * Date Last Modified: Feb 9, 2017 * Description: set value to exp * Return: void *************************************************************/ private void setExp(createACell m_Cell, Cell cell, ref bool flag) { ExpTree exptree = new ExpTree(m_Cell.Text.Substring(1)); string[] variables = exptree.GetAllVariables(); foreach (string variableName in variables) { // bad reference if (GetCell(variableName) == null) { m_Cell.SetValue("!(Bad Reference)"); CellPropertyChanged(cell, new PropertyChangedEventArgs("Value")); flag = true; break; } //SetExpressionVariable Cell variableCell = GetCell(variableName); double value; if (string.IsNullOrEmpty(variableCell.Value)) { exptree.SetVar(variableCell.Name, 0); } else if (!double.TryParse(variableCell.Value, out value)) { exptree.SetVar(variableName, 0); } else { exptree.SetVar(variableName, value); } //SetExpressionVariable end; //self reference if (variableName == m_Cell.Name) { m_Cell.SetValue("!(Self Reference)"); CellPropertyChanged(cell, new PropertyChangedEventArgs("Value")); flag = true; break; } } if (flag) { return; } //Circular reference foreach (string varName in variables) { if (varName == m_Cell.Name) // directly same { m_Cell.SetValue("!(Circular Reference)"); CellPropertyChanged(cell, new PropertyChangedEventArgs("Value")); flag = true; break; } if (!depDict.ContainsKey(m_Cell.Name)) //check in dict { continue; } string currCell = m_Cell.Name; for (int i = 0; i < depDict.Count; i++) //find all cell in dict { foreach (string dependentCell in depDict[currCell]) //do same thing as before { if (varName == dependentCell) { m_Cell.SetValue("!(Circular Reference)"); CellPropertyChanged(cell, new PropertyChangedEventArgs("Value")); flag = true; break; } if (!depDict.ContainsKey(dependentCell)) { continue; } currCell = dependentCell; } } } if (flag) { return; } m_Cell.SetValue(exptree.Eval().ToString()); CellPropertyChanged(cell, new PropertyChangedEventArgs("Value")); #region hw4code //old code from hw4 //string letter = m_Cell.Text.Substring(1); //string number = letter.Substring(1); //string lettersAZ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //int col = 0, row = int.Parse(number) - 1; //for (int i = 0; i < 26; i++) //{ // if (lettersAZ[i] == letter[0]) // { // col = i; // break; // } //} //m_Cell.SetValue(GetCell(row, col).Value.ToString()); #endregion }