예제 #1
0
        public void Cells_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            SpreadsheetCell spreadsheetCell = sender as SpreadsheetCell; //Sender as a spreadsheet cell

            switch (e.PropertyName)                                      //switch on the property changed
            {
            case ("Text"):                                               //if text has been changed
                if (spreadsheetCell.Text == string.Empty)
                {
                    spreadsheetCell.Value = string.Empty;
                    NotifyCellPropertyChanged(spreadsheetCell);
                    //spreadsheetCell.Sendupdate();
                }

                else if (spreadsheetCell.Text[0] == '=')
                {
                    spreadsheetCell.Value = spreadsheetCell.Text;
                    NotifyCellPropertyChanged(spreadsheetCell);
                    spreadsheetCell.Sendupdate();
                }
                else if (spreadsheetCell.Text[0] != '=' && spreadsheetCell.Value == string.Empty)
                {
                    spreadsheetCell.Value = spreadsheetCell.Text;
                    NotifyCellPropertyChanged(spreadsheetCell);
                    spreadsheetCell.Sendupdate();
                }
                else if (spreadsheetCell.Text[0] != '=' && spreadsheetCell.Value[0] != '=')
                {
                    spreadsheetCell.Value = spreadsheetCell.Text;
                    NotifyCellPropertyChanged(spreadsheetCell);
                    spreadsheetCell.Sendupdate();
                }

                break;

            case ("Value"):
                try
                {
                    if (spreadsheetCell.Value != string.Empty)
                    {
                        if (spreadsheetCell.Value[0] == '=')
                        {
                            if (char.IsLetter(spreadsheetCell.Value[1]) && spreadsheetCell.Value.Length <= 4 && spreadsheetCell.Value.Length >= 2)
                            {
                                string          varcol         = spreadsheetCell.Value[1].ToString();
                                string          varrow         = spreadsheetCell.Value.Substring(2);
                                SpreadsheetCell referencedcell = getcellat(varcol, varrow);
                                if (spreadsheetCell.Text != referencedcell.Text)
                                {
                                    spreadsheetCell.Text = referencedcell.Text;
                                }
                                referencedcell.Referencesme(spreadsheetCell);
                            }
                            else if (spreadsheetCell.Value.Length >= 2)     //starts with = and is within the length of a valid function
                            {
                                ExpTree expTree = new ExpTree(spreadsheetCell.Value.Substring(1));
                                expTree.Eval();
                                string varcol;
                                string varrow;
                                double vardata;
                                Dictionary <string, double> vardic = new Dictionary <string, double>(expTree.variables);
                                foreach (string key in vardic.Keys)
                                {
                                    varcol = key.Substring(0, 1);
                                    varrow = key.Substring(1);
                                    SpreadsheetCell referencedcell = getcellat(varcol, varrow);
                                    if (referencedcell == spreadsheetCell)
                                    {
                                        //ToDo-- If self is in the equation
                                        vardata = 0;
                                    }
                                    else
                                    {
                                        Double.TryParse(referencedcell.Text, out vardata);
                                    }

                                    referencedcell.Referencesme(spreadsheetCell);
                                    expTree.SetVAr(key, vardata);
                                }
                                string eval = expTree.Eval().ToString();
                                if (spreadsheetCell.Text != eval)
                                {
                                    spreadsheetCell.Text = eval;
                                }
                            }
                        }
                    }
                }
                catch
                {
                    spreadsheetCell.Text = "#ERROR";
                }
                break;
            }
        }