/// <summary>
        /// Criterion action combobox value changed
        /// </summary>
        private void Box_SelectedIndexChanged(object sender, EventArgs e)
        {
            ComboBox cBox = (sender as ComboBox);

            if (cBox.SelectedIndex == -1)
            {
                return;
            }
            if (ignoreLocRecalculation)
            {
                return;                         // ignore the change (set in ResetFilterSettings())
            }
            try {
                string critName = (string)cBox.Tag;
                if (Enum.IsDefined(typeof(LocalizationCriterionAction), cBox.SelectedIndex))   // it is a standard criterion action (Force localization, Ignore...)
                {
                    LocalizationCriterionAction newAction = (LocalizationCriterionAction)cBox.SelectedIndex;

                    filterCriteriaCopy[critName].Action = newAction;               // set the value in local copy of criteria
                    ToolGrid.RecalculateLocProbability(filterCriteriaCopy, false); // recalculate localization probability
                }
                else                                                               // it is a special action (Check, Uncheck, ...)
                {
                    LocalizationCriterionAction2 newAction = (LocalizationCriterionAction2)(cBox.SelectedIndex - Enum.GetValues(typeof(LocalizationCriterionAction)).Length);

                    ToolGrid.ApplyFilterAction(filterCriteriaCopy[critName], newAction); // apply the action
                }
            } catch (Exception ex) {
                VLOutputWindow.VisualLocalizerPane.WriteException(ex);
                VisualLocalizer.Library.Components.MessageBox.ShowException(ex);
            }
        }
        /// <summary>
        /// Creates new instance
        /// </summary>
        public AbstractLocalizationCriterion(string name, LocalizationCriterionAction action, int weight)
        {
            if (name == null)
            {
                throw new ArgumentNullException("name");
            }

            this.Action = action;
            this.Weight = weight;
            this.Name   = name;
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="LocalizationCommonCriterion"/> class, with given name, description, criterion action and weight and predicate to test a result item.
        /// </summary>
        public LocalizationCommonCriterion(string name, string description, LocalizationCriterionAction option, int weight, Func <CodeStringResultItem, bool?> predicate)
            : base(name, option, weight)
        {
            if (description == null)
            {
                throw new ArgumentNullException("description");
            }
            if (predicate == null)
            {
                throw new ArgumentNullException("predicate");
            }

            this.Description = description;
            this.Predicate   = predicate;
        }
        /// <summary>
        /// Returns human-readable name of the criterion action
        /// </summary>
        public static string ToHumanForm(this LocalizationCriterionAction act)
        {
            switch (act)
            {
            case LocalizationCriterionAction.FORCE_ENABLE:
                return("force localize");

            case LocalizationCriterionAction.FORCE_DISABLE:
                return("force NOT localize");

            case LocalizationCriterionAction.VALUE:
                return("set value");

            case LocalizationCriterionAction.IGNORE:
                return("ignore");

            default:
                throw new Exception("Unknown LocalizationCriterionAction: " + act);
            }
        }
        /// <summary>
        /// When "Apply" button of the settings dialog was hit; save the GUI state in the settings
        /// </summary>
        protected override void OnApply(PageApplyEventArgs e)
        {
            if (e.ApplyBehavior == ApplyKind.Apply)
            {
                try {
                    SettingsObject.Instance.IgnorePropertyChanges = true;

                    bool revalidate = SettingsObject.Instance.ShowContextColumn != contextBox.Checked;
                    SettingsObject.Instance.ShowContextColumn  = contextBox.Checked;
                    SettingsObject.Instance.UseReflectionInAsp = reflectionBox.Checked;

                    foreach (var pair in SettingsObject.Instance.CommonLocalizabilityCriteria)
                    {
                        LocalizationCommonCriterion crit = pair.Value;
                        DataGridViewRow             row  = commonCriteriaGrid.Rows[commonCriteriaRowMap[crit.Name]];

                        crit.Action = (LocalizationCriterionAction)actionColumn.Items.IndexOf(row.Cells[1].Value);

                        int    w   = 0;
                        object val = row.Cells[2].Value;
                        if (val == null || !int.TryParse(val.ToString(), out w) || w < -100 || w > 100)
                        {
                            throw new Exception("Error on '" + crit.Description + "' - invalid value '" + val + "'. Please enter an integer from -100 to 100.");
                        }

                        crit.Weight = w;
                    }

                    SettingsObject.Instance.CustomLocalizabilityCriteria.Clear();
                    for (int i = 0; i < customCriteriaTable.RowCount - 1; i++)
                    {
                        TableLayoutPanel t            = (TableLayoutPanel)customCriteriaTable.GetControlFromPosition(0, i);
                        ComboBox         targetBox    = (ComboBox)t.GetControlFromPosition(1, 0);
                        ComboBox         predicateBox = (ComboBox)t.GetControlFromPosition(2, 0);
                        TextBox          regexBox     = (TextBox)t.GetControlFromPosition(1, 1);
                        ComboBox         actionBox    = (ComboBox)t.GetControlFromPosition(1, 2);
                        NumericUpDown    valueBox     = (NumericUpDown)t.GetControlFromPosition(2, 2);

                        if (actionBox.SelectedIndex == -1)
                        {
                            throw new Exception("Error on custom rule no. " + (i + 1) + " - must select action.");
                        }
                        LocalizationCriterionAction action = (LocalizationCriterionAction)actionBox.SelectedIndex;

                        LocalizationCustomCriterion crit = new LocalizationCustomCriterion(action, (int)valueBox.Value);
                        if (!string.IsNullOrEmpty(t.Name))
                        {
                            crit.Name = t.Name;
                        }

                        if (predicateBox.SelectedIndex == -1)
                        {
                            throw new Exception("Error on custom rule no. " + (i + 1) + " - must select predicate.");
                        }
                        crit.Predicate = (LocalizationCriterionPredicate)predicateBox.SelectedIndex;

                        if (targetBox.SelectedIndex == -1)
                        {
                            throw new Exception("Error on custom rule no. " + (i + 1) + " - must select target.");
                        }
                        crit.Target = (LocalizationCriterionTarget)targetBox.SelectedIndex;

                        new Regex(regexBox.Text); // throws exception if regex is not valid
                        crit.Regex = regexBox.Text;

                        SettingsObject.Instance.CustomLocalizabilityCriteria.Add(crit);
                    }

                    if (revalidate)
                    {
                        SettingsObject.Instance.NotifyRevalidationRequested();
                    }
                } catch (Exception ex) {
                    VLOutputWindow.VisualLocalizerPane.WriteException(ex);
                    VisualLocalizer.Library.Components.MessageBox.ShowException(ex);
                    e.ApplyBehavior = ApplyKind.CancelNoNavigate;
                } finally {
                    SettingsObject.Instance.IgnorePropertyChanges = false;
                    SettingsObject.Instance.NotifyPropertyChanged(CHANGE_CATEGORY.FILTER);
                }
            }
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="LocalizationCustomCriterion"/> class with given criterion action and weight.
 /// </summary>
 public LocalizationCustomCriterion(LocalizationCriterionAction action, int weight)
     : base("x" + rnd.Next().ToString(), action, weight)
 {
 }