internal override void PerformAction()
        {
            foreach (TreeListNode node in _senderNodes)
            {
                PolicyTreeListTag    polTag = node.Tag as PolicyTreeListTag;
                FunctionTreeListTag  funTag = node.Tag as FunctionTreeListTag;
                ParameterTreeListTag parTag = node.Tag as ParameterTreeListTag;

                if (polTag != null)
                {
                    foreach (CountryConfig.PolicyRow policyRow in polTag.GetPolicyRows())
                    {
                        policyRow.Private = policyRow.Private == DefPar.Value.YES ? DefPar.Value.NO : DefPar.Value.YES;
                    }
                    node.StateImageIndex = polTag.GetDefaultPolicyRow().Private == DefPar.Value.YES ? DefGeneral.IMAGE_IND_PRIV_POL : DefGeneral.IMAGE_IND_POL;
                }
                else if (funTag != null)
                {
                    foreach (CountryConfig.FunctionRow funRow in funTag.GetFunctionRows())
                    {
                        funRow.Private = funRow.Private == DefPar.Value.YES ? DefPar.Value.NO : DefPar.Value.YES;
                    }
                    node.StateImageIndex = funTag.GetDefaultFunctionRow().Private == DefPar.Value.YES ? DefGeneral.IMAGE_IND_PRIV_FUN : DefGeneral.IMAGE_IND_FUN;
                }
                else if (parTag != null)
                {
                    foreach (CountryConfig.ParameterRow parRow in parTag.GetParameterRows())
                    {
                        parRow.Private = parRow.Private == DefPar.Value.YES ? DefPar.Value.NO : DefPar.Value.YES;
                    }
                    node.StateImageIndex = parTag.GetDefaultParameterRow().Private == DefPar.Value.YES ? DefGeneral.IMAGE_IND_PRIV_PAR : -1;
                }
            }
        }
        List <IntelliItem> GetIntelliItems()
        {
            List <IntelliItem> intelliItems = new List <IntelliItem>();

            intelliItems.Clear();

            try
            {
                if (_treeList.FocusedNode.Tag == null)
                {
                    return(intelliItems); //should not happen
                }
                BaseTreeListTag   nodeTag   = _treeList.FocusedNode.Tag as BaseTreeListTag;
                SystemTreeListTag systemTag = null;

                //first assess which intelli-items should be shown in dependece of the edited cell ...
                List <int> specficIntelliItems = null;
                if (TreeListBuilder.IsPolicyColumn(_treeList.FocusedColumn)) //editited cell is an exceptionally editable policy-column-cell (e.g. functions DefIL, DefConst, SetDefault, etc.)
                {
                    //take system specific intelli-items (e.g. incomelists) from any existing system, as one cannot know for which system the user wants to define the parameter
                    TreeListColumn anySystemColumn = _treeList.Columns.ColumnByName(nodeTag.GetDefaultPolicyRow().SystemRow.Name);
                    if (anySystemColumn != null)
                    {
                        systemTag = anySystemColumn.Tag as SystemTreeListTag;
                    }
                    //in dependence of the function define the available intelli-items (e.g. only variables or variables and incomelists, etc.)
                    specficIntelliItems = GetIntelliItemsForEditablePolicyColumn(nodeTag.GetDefaultFunctionRow().Name);
                }
                else if (TreeListBuilder.IsSystemColumn(_treeList.FocusedColumn))
                {
                    //in dependence of the parameter-value-type define the available intelli-items (usually everything, but e.g. for output_variables only variables)
                    systemTag           = _treeList.FocusedColumn.Tag as SystemTreeListTag;
                    specficIntelliItems = nodeTag.GetTypeSpecificIntelliItems(systemTag);
                }
                else
                {
                    return(intelliItems); //should not happen
                }
                //... then gather the respective intelli-items
                //constants defined by function DefConst
                if ((specficIntelliItems == null || specficIntelliItems.Contains(_intelliContainsDefConst)) && systemTag != null)
                {
                    foreach (DataSets.CountryConfig.ParameterRow parameterRow in systemTag.GetParameterRowsConstants())
                    {
                        if (parameterRow.Name.ToLower() == DefPar.DefVar.EM2_Var_Name.ToLower())
                        {
                            intelliItems.Add(new IntelliItem(parameterRow.Value, parameterRow.Comment, _intelliImageConstant));
                        }
                        else if (parameterRow.Name.ToLower() == DefPar.DefConst.Condition.ToLower())
                        {
                            continue;
                        }
                        else
                        {
                            intelliItems.Add(new IntelliItem(parameterRow.Name, GetConstDescription(parameterRow) + " " + parameterRow.Comment, _intelliImageConstant));
                        }
                    }
                }

                //variables defined by function DefVar
                if ((specficIntelliItems == null || specficIntelliItems.Contains(_intelliContainsDefVar)) && systemTag != null)
                {
                    foreach (DataSets.CountryConfig.ParameterRow parameterRow in systemTag.GetParameterRowsDefVariables())
                    {
                        if (parameterRow.Name.ToLower() == DefPar.DefVar.EM2_Var_Name.ToLower())
                        {
                            intelliItems.Add(new IntelliItem(parameterRow.Value, parameterRow.Comment, _intelliImageVariable));
                        }
                        else
                        {
                            intelliItems.Add(new IntelliItem(parameterRow.Name, parameterRow.Comment, _intelliImageVariable));
                        }
                    }
                }

                // uprating factors
                if (specficIntelliItems == null || specficIntelliItems.Contains(_intelliContainsUpRateFactor))
                {
                    string cc = EM_AppContext.Instance.GetActiveCountryMainForm().GetCountryShortName();
                    CountryConfigFacade ccf = CountryAdministration.CountryAdministrator.GetCountryConfigFacade(cc);
                    foreach (CountryConfig.UpratingIndexRow ur in ccf.GetUpratingIndices())
                    {
                        intelliItems.Add(new IntelliItem(ur.Reference, ur.Description, _intelliImageConstant));
                    }
                }

                //standard variables defined in VarConfig (idhh, yem, poa, ...)
                if (specficIntelliItems == null || specficIntelliItems.Contains(_intelliContainsStandardVar))
                {
                    string countryShortName = systemTag == null ? string.Empty : systemTag.GetSystemRow().CountryRow.ShortName;
                    Dictionary <string, string> standardVariables = EM_AppContext.Instance.GetVarConfigFacade().GetVariables_NamesAndDescriptions(countryShortName);
                    foreach (string standardVariable in standardVariables.Keys)
                    {
                        intelliItems.Add(new IntelliItem(standardVariable, standardVariables[standardVariable], _intelliImageVariable));
                    }
                }

                //incomelists defined by function DefIL
                if ((specficIntelliItems == null || specficIntelliItems.Contains(_intelliContainsDefIL)) && systemTag != null)
                {
                    foreach (DataSets.CountryConfig.ParameterRow parameterRow in systemTag.GetParameterRowsILs())
                    {
                        intelliItems.Add(new IntelliItem(parameterRow.Value, systemTag.GetILTUComment(parameterRow), _intelliImageIL));
                    }
                }

                //queries (IsDepChild, ...)
                if (specficIntelliItems == null || specficIntelliItems.Contains(_intelliContainsQueries))
                {
                    foreach (var q in DefinitionAdmin.GetQueryNamesAndDesc())
                    {
                        string queryName = q.Key, queryDesc = q.Value;
                        intelliItems.Add(new IntelliItem(queryName, queryDesc, _intelliImageConfiguration)); //first add normally ...
                        intelliItems.Add(new IntelliItem(_queryPrefix + queryName,                           //.. then add with query prefix to allow users to see all available queries (is removed before query is inserted)
                                                         queryDesc, _intelliImageConfiguration));
                    }
                }

                //footnotes
                if (specficIntelliItems == null || specficIntelliItems.Contains(_intelliContainsFootnotes))
                {
                    //placeholders for new footnote parameters (#x1[_Level], #x2[_UpLim], etc.)
                    Dictionary <string, string> footnotes = GetFootnoteParametersForIntelli();
                    foreach (string footnote in footnotes.Keys)
                    {
                        intelliItems.Add(new IntelliItem(footnote, footnotes[footnote], _intelliImageFootnote));
                    }

                    //existing footnote amount parameters (#_Amount reverserd to Amount#x)
                    footnotes = TreeListManager.GetFunctionsExistingAmountParameters(_treeList.FocusedNode.ParentNode, _treeList.FocusedColumn.GetCaption());
                    foreach (string footnote in footnotes.Keys)
                    {
                        intelliItems.Add(new IntelliItem(footnote, footnotes[footnote], _intelliImageFootnote));
                    }

                    //other existing footnote parameters (#_Level, #_UpLim, etc.)
                    footnotes = TreeListManager.GetFunctionsExistingFootnoteParameters(_treeList.FocusedNode.ParentNode, _treeList.FocusedColumn.GetCaption());
                    foreach (string footnote in footnotes.Keys)
                    {
                        intelliItems.Add(new IntelliItem(footnote, footnotes[footnote], _intelliImageFootnote));
                    }
                }

                if (specficIntelliItems == null || specficIntelliItems.Contains(_intelliContainsRandAbsMinMax))
                {
                    intelliItems.Add(new IntelliItem("rand", "Random number", _intelliImageConfiguration));
                    intelliItems.Add(new IntelliItem("<abs>()", "Absolute value operator", _intelliImageConfiguration));
                    intelliItems.Add(new IntelliItem("<min> ", "Minimum operator", _intelliImageConfiguration));
                    intelliItems.Add(new IntelliItem("<max> ", "Maximum operator", _intelliImageConfiguration));
                }

                // special case for parameter DefTU/Members: show the options, e.g. Partner, OwnDepChild, ...
                if (specficIntelliItems != null && specficIntelliItems.Contains(_intelliContainsDefTUMembers))
                {
                    ParameterTreeListTag parTag = nodeTag as ParameterTreeListTag;
                    if (parTag != null)
                    {
                        foreach (string tuMember in new List <string>()
                        {
                            DefPar.DefTu.MEMBER_TYPE.PARTNER_CAMEL_CASE, DefPar.DefTu.MEMBER_TYPE.OWNCHILD_CAMEL_CASE,
                            DefPar.DefTu.MEMBER_TYPE.DEPCHILD_CAMEL_CASE, DefPar.DefTu.MEMBER_TYPE.OWNDEPCHILD_CAMEL_CASE, DefPar.DefTu.MEMBER_TYPE.LOOSEDEPCHILD_CAMEL_CASE,
                            DefPar.DefTu.MEMBER_TYPE.DEPPARENT_CAMEL_CASE, DefPar.DefTu.MEMBER_TYPE.DEPRELATIVE_CAMEL_CASE
                        })
                        {
                            intelliItems.Add(new IntelliItem(tuMember, string.Empty, _intelliImageConfiguration));
                        }
                    }
                }

                //taxunits defined by function DefTU: only for add-ons, which use formulas for all parameters (i.e. also for taxunit parameters)
                if ((_treeList.Parent as EM_UI_MainForm)._isAddOn && systemTag != null)
                {
                    foreach (DataSets.CountryConfig.ParameterRow parameterRow in systemTag.GetParameterRowsTUs())
                    {
                        intelliItems.Add(new IntelliItem(parameterRow.Value, systemTag.GetILTUComment(parameterRow), _intelliImageTU));
                    }
                }
                return(intelliItems);
            }
            catch
            {
                //do not jeopardise the UI-stability because IntelliItems cannot be gathered but try if problem can be fixed by updating the info
                UpdateInfo();
                return(intelliItems);
            }

            List <int> GetIntelliItemsForEditablePolicyColumn(string functionName)
            {
                functionName = functionName.ToLower();
                List <int> items = new List <int>();

                if (functionName == DefFun.SetDefault.ToLower() || functionName == DefFun.Uprate.ToLower())
                {
                    items.Add(_intelliContainsStandardVar);
                    items.Add(_intelliContainsDefVar); //not sure whether variables defined by DefVar should be displayed (?)
                }
                if (functionName == DefFun.DefIl.ToLower())
                {
                    items.Add(_intelliContainsStandardVar);
                    items.Add(_intelliContainsDefVar);
                    items.Add(_intelliContainsDefConst);
                    items.Add(_intelliContainsDefIL);
                }
                //other functions with editable policy column (DefConst, DefVar): no intelliItems (i.e. no suggestions for e.g. constant names)
                return(items);
            }
        }
        public override void Execute(TreeListNode senderNode)
        {
            if (senderNode.Tag == null || (senderNode.Tag as BaseTreeListTag).GetParameterName() == null)
            {
                return; //policy- or function-node
            }
            ParameterTreeListTag nodeTag = senderNode.Tag as ParameterTreeListTag;

            UsedComponent usedComponent = new UsedComponent();

            foreach (CountryConfig.ParameterRow parameterRow in nodeTag.GetParameterRows())
            {
                if (!_systemIDs.Contains(parameterRow.FunctionRow.PolicyRow.SystemID))
                {
                    continue;
                }

                if (_ignoreIfSwitchedOff && (parameterRow.FunctionRow.Switch.ToLower() == DefPar.Value.OFF ||
                                             parameterRow.FunctionRow.PolicyRow.Switch.ToLower() == DefPar.Value.OFF))
                {
                    continue;
                }

                //formulas and conditions need a special comparison operation ...
                if (parameterRow.ValueType.ToLower() == DefinitionAdmin.ParTypeToString(DefPar.PAR_TYPE.CONDITION).ToLower() ||
                    parameterRow.ValueType.ToLower() == DefinitionAdmin.ParTypeToString(DefPar.PAR_TYPE.FORMULA).ToLower())
                {
                    if (!_doPatternSearch)
                    {
                        if (!EM_Helpers.DoesFormulaContainComponent(parameterRow.Value, _componentName))
                        {
                            continue;
                        }
                    }
                    else
                    {
                        if (!EM_Helpers.DoesValueMatchPattern(_componentName, parameterRow.Value, false, true))
                        {
                            continue;
                        }
                    }
                }
                //... for other parameter types it's enough to compare the value
                else
                {
                    if (!_doPatternSearch)
                    {
                        if (parameterRow.Value.ToLower() != _componentName.ToLower())
                        {
                            continue;
                        }
                    }
                    else
                    {
                        if (!EM_Helpers.DoesValueMatchPattern(_componentName, parameterRow.Value, false, true))
                        {
                            continue;
                        }
                    }
                }

                usedComponent._systemNames.Add(parameterRow.FunctionRow.PolicyRow.SystemRow.Name);
            }

            //take account of the fact that the policy column also may contain components (i.e. variables in DefIL, SetDefault, Uprate, etc.)
            if (nodeTag.IsPolicyColumnEditable())
            {
                string contentPolicyColumn = senderNode.GetDisplayText(senderNode.TreeList.Columns.ColumnByName(TreeListBuilder._policyColumnName));
                if (EM_Helpers.DoesValueMatchPattern(_componentName, contentPolicyColumn, false, false))
                {
                    usedComponent._row = TreeListManager.GetNodeRowNumber(senderNode, senderNode.ParentNode);
                }
            }

            if (usedComponent._systemNames.Count == 0 && usedComponent._row == string.Empty)
            {
                return;
            }

            usedComponent._policyName   = nodeTag.GetPolicyName();
            usedComponent._functionName = nodeTag.GetFunctionName();
            if (usedComponent._row == string.Empty)
            {
                usedComponent._parameterName = nodeTag.GetParameterName();
            }
            usedComponent._row  = TreeListManager.GetNodeRowNumber(senderNode, senderNode.ParentNode);
            usedComponent._node = senderNode;
            _usedComponents.Add(usedComponent);
        }