private void btnAdd_Click(object sender, EventArgs e)
        {
            KeyStrokeDB rule = new KeyStrokeDB();

            rule.Initialize();
            rule.UniqueName = "Default-" + (EditedControlSet.KeyStrokeDBs.Count + 1);
            EditedControlSet.KeyStrokeDBs.Add(rule);
            RefreshListFromKeyStrokeDBs();
            lsvKeyRulesSets.SelectedItems.Clear();
            SelectFromUniqueName(rule.UniqueName);
        }
        private void _updateAllControlsFromRule(KeyStrokeDB rule)
        {
            // Cancel selectindex events because we are refreshing
            NoSelectedIndexDueToOngoingRefresh = true;

            // Clean some things that could lead to hazardous editing error.
            // Limit number of elements.
            rule.KeySources.RemoveRange(3, rule.KeySources.Count - 3);
            rule.KeySourcesOperators.RemoveRange(2, rule.KeySourcesOperators.Count - 2);

            // Now update
            this.txtKeyRuleName.Text = rule.UniqueName;

            this.cmbSourceType1.SelectedItem = rule.KeySources[0].Type.ToString();
            this.txtSourceIndex1.Text        = rule.KeySources[0].Index.ToString();
            this.txtThreshold1.Text          = rule.KeySources[0].Threshold.ToString("N3");
            this.chkSign1.Checked            = rule.KeySources[0].InvSign;

            this.cmbCombine1.SelectedItem = rule.KeySourcesOperators[0].ToString();

            this.cmbSourceType2.SelectedItem = rule.KeySources[1].Type.ToString();
            this.txtSourceIndex2.Text        = rule.KeySources[1].Index.ToString();
            this.txtThreshold2.Text          = rule.KeySources[1].Threshold.ToString("N3");
            this.chkSign2.Checked            = rule.KeySources[1].InvSign;

            this.cmbCombine2.SelectedItem = rule.KeySourcesOperators[1].ToString();

            this.cmbSourceType3.SelectedItem = rule.KeySources[2].Type.ToString();
            this.txtSourceIndex3.Text        = rule.KeySources[2].Index.ToString();
            this.txtThreshold3.Text          = rule.KeySources[2].Threshold.ToString("N3");
            this.chkSign2.Checked            = rule.KeySources[2].InvSign;

            this.txtAxisTolerance_pct.Text = rule.AxisTolerance_pct.ToString("N3");
            this.txtHoldTimes_ms.Text      = rule.HoldTime_ms.ToString();
            this.chkIsInversed.Checked     = rule.IsInvertedLogic;
            this.chkTestValue.Checked      = false;

            this.cmbKeyAPI.SelectedItem = rule.KeyAPI.ToString();
            if (rule.CombinedKeyStrokes.Count < 2)
            {
                for (int i = rule.CombinedKeyStrokes.Count; i < 2; i++)
                {
                    rule.CombinedKeyStrokes.Add(new KeyCodes());
                }
            }
            this.cmbKeyStroke1.SelectedItem = rule.CombinedKeyStrokes[0].ToString();
            this.cmbKeyStroke2.SelectedItem = rule.CombinedKeyStrokes[1].ToString();

            this.txtExpr.Text = rule.GetExpression();

            NoSelectedIndexDueToOngoingRefresh = false;
        }