Ejemplo n.º 1
0
        /*************************************************************
        * 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);
                }
            }
        }
Ejemplo n.º 4
0
        /*************************************************************
        * 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);
            }
        }
Ejemplo n.º 5
0
 /*************************************************************
 * 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
        }