/// <summary>
        /// Processes a single click from the mistie control; dispatches the event into the child controls
        /// </summary>
        /// <param name="pf">mouse location x, y</param>
        /// <param name="e">mouse parameters</param>
        public void ProcessMistieClick(PointF pf, MouseEventArgs e, bool[] KeyModifiers)
        {
            if (Data == null)
            {
                return;
            }
            FitterFunction ff = Data.Solution.SelectedFunction;

            ff.SetParametersFromClick(pf.X, pf.Y);
            RefreshParameterList();
            if (DataFitter != null)
            {
                DataFitter.Plot_Picks();
            }
        }
        private void RefreshParameterList()
        {
            dataGridView2.SuspendLayout();
            dataGridView2.Rows.Clear();
            FitterFunction ff = Data.Solution.SelectedFunction;

            if (ff == null)
            {
                dataGridView2.ResumeLayout();
                return;
            }
            foreach (FitterParameter fp in ff.Parameters)
            {
                string[] tmp = fp.ToStrings();
                dataGridView2.Rows.Add(tmp);
            }
            dataGridView2.ResumeLayout();
        }
        private void dataGridView2_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            FitterFunction ff = Data.Solution.SelectedFunction;

            if (ff == null)
            {
                return;
            }
            double value = 0.0;

            try
            {
                value = Convert.ToDouble(dataGridView2[e.ColumnIndex, e.RowIndex].Value);
            }
            catch
            {
                return;
            }
            FitterParameter fp = ff.Parameters[e.RowIndex];

            switch (e.ColumnIndex)
            {
            case 1:
                fp.Value = value;
                break;

            case 2:
                fp.MinLimit = value;
                break;

            case 3:
                fp.MaxLimit = value;
                break;

            default:
                break;
            }
            UpdateParameterRow(e.RowIndex);
            if (DataFitter != null)
            {
                DataFitter.Plot_Picks();
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            if (Data == null)
            {
                return;
            }
            FitterFunction ff = Data.Solution.Add((string)comboBox1.SelectedItem);

            if (ff == null)
            {
                return;
            }
            string[] tmp = new string[1];
            tmp[0] = ff.ToString();
            dataGridView1.Rows.Add(tmp);
            dataGridView1.ClearSelection();
            dataGridView1.Rows[dataGridView1.Rows.Count - 1].Selected = true;
            if (DataFitter != null)
            {
                DataFitter.Plot_Picks();
            }
        }
        /// <summary>
        /// Processes a single click from the digitizer; dispatches the event into the child controls
        /// </summary>
        /// <param name="x">mouse location x</param>
        /// <param name="y">mouse location y</param>
        /// <param name="c">color unter mouse location</param>
        /// <param name="e">mouse parameters</param>
        public void ProcessDigitizerClick(int x, int y, int relative_x, int relative_y,
                                          string c, MouseEventArgs e, bool[] KeyModifiers)
        {
            if (Data == null)
            {
                return;
            }
            FitterFunction ff = Data.Solution.SelectedFunction;

            if (ff == null)
            {
                return;
            }
            Point  p  = new Point(x, y);
            PointF pf = Data.Calibration.LocationToValue(p);

            ff.SetParametersFromClick(pf.X, pf.Y);
            RefreshParameterList();
            if (DataFitter != null)
            {
                DataFitter.Plot_Picks();
            }
        }