Beispiel #1
0
        //returns the footnote parameters which need to be added when a formula was changed
        //e.g. formula contains 'Amount#4711' (and did not contain that before the change): footnote parameter #Amount with group 4711 must be added
        internal static Dictionary <KeyValuePair <string, string>, DefinitionAdmin.Par> GetFootnoteParametersToAdd(TreeListNode node, ref string formulaText)
        {
            Dictionary <KeyValuePair <string, string>, DefinitionAdmin.Par> footnoteParametersToAdd =
                new Dictionary <KeyValuePair <string, string>,       //name and group of new footnote parameter
                                DefinitionAdmin.Par>();              //definition (from config file) of new parameter

            int    nextFootnote = TreeListManager.GetNextAvailableFootnoteCounter(node.ParentNode);
            string functionName = node.ParentNode.GetDisplayText(TreeListBuilder._policyColumnName);

            //search for Amount#xi (i.e Amount#x1, Amount#x2, etc.)
            for (int indexLabelAmount = formulaText.ToLower().IndexOf(DefPar.Value.AMOUNT.ToLower() + "#x"), indexNonDigit;
                 indexLabelAmount >= 0;
                 indexLabelAmount = formulaText.ToLower().IndexOf(DefPar.Value.AMOUNT.ToLower() + "#x"))
            {
                for (indexNonDigit = indexLabelAmount + DefPar.Value.AMOUNT.Length + 2;
                     indexNonDigit < formulaText.Length && EM_Helpers.IsDigit(formulaText.ElementAt(indexNonDigit));
                     ++indexNonDigit)
                {
                    ;                                              //search first non digit after Amount#x
                }
                string parameterName = "#_" + DefPar.Value.AMOUNT; //#_Amount
                DefinitionAdmin.Par           parDef = DefinitionAdmin.GetParDefinition(functionName, parameterName);
                KeyValuePair <string, string> parameterNameAndGroup = new KeyValuePair <string, string>(parameterName, nextFootnote.ToString());
                footnoteParametersToAdd.Add(parameterNameAndGroup, parDef);                           //put parameter into list of footnote parameters which need to be generated
                string toReplace = SubstringFromTo(formulaText, indexLabelAmount, indexNonDigit - 1); //Amount#xi (e.g. Amount#x1)
                string replaceBy = DefPar.Value.AMOUNT + "#" + nextFootnote.ToString();               //Amount#f (e.g. Amount#x3)
                formulaText = formulaText.Replace(toReplace, replaceBy);                              //replace all occurrences (there might be more than one)
                ++nextFootnote;
            }

            //search for #xi[_yyy] (i.e. #x1[_Level], #x2[_Level], #x1[_UpLim], etc.)
            for (int indexPlaceholder = formulaText.IndexOf("[_");
                 indexPlaceholder >= 0;
                 indexPlaceholder = formulaText.IndexOf("[_"))
            {
                int iStart = formulaText.Substring(0, indexPlaceholder).LastIndexOf("#x");
                int iEnd   = formulaText.Substring(indexPlaceholder).IndexOf("]") + indexPlaceholder;
                if (iStart >= 0 && iEnd >= 0 &&
                    EM_Helpers.IsNonNegInteger(SubstringFromTo(formulaText, iStart + 2, indexPlaceholder - 1)))
                {
                    string parameterName       = "#" + SubstringFromTo(formulaText, indexPlaceholder + 1, iEnd - 1); //#_yyy (e.g. #_Level)
                    DefinitionAdmin.Fun funDef = DefinitionAdmin.GetFunDefinition(functionName, false);              // check if function allows for this footnote
                    if (funDef != null && (from p in funDef.GetParList() where p.Value.isFootnote && p.Key.ToLower() == parameterName.ToLower() select p).Count() > 0)
                    {
                        DefinitionAdmin.Par           parDef = DefinitionAdmin.GetParDefinition(functionName, parameterName);
                        KeyValuePair <string, string> parameterNameAndGroup = new KeyValuePair <string, string>(parameterName, nextFootnote.ToString());
                        footnoteParametersToAdd.Add(parameterNameAndGroup, parDef);    //put parameter into list of footnote parameters which need to be generated
                        string toReplace = SubstringFromTo(formulaText, iStart, iEnd); //#xi_yyy (e.g. #x1[_Level])
                        string replaceBy = "#" + nextFootnote.ToString();              //#f_yyy (e.g. #4)
                        formulaText = formulaText.Replace(toReplace, replaceBy);       //replace all occurrences (there might be more than one)
                        ++nextFootnote;
                    }
                    else
                    {
                        break; //should not happen (though can), but to avoid infinite loop
                    }
                }
                else
                {
                    break; //should not happen (though can), but to avoid infinite loop
                }
            }

            //search for query#x (e.g. isNtoMchild#x)
            for (int indexPlaceholder = formulaText.IndexOf("#x");
                 indexPlaceholder >= 0;
                 indexPlaceholder = formulaText.IndexOf("#x"))
            {
                string theQuery = string.Empty;
                foreach (string queryName in DefinitionAdmin.GetQueryNamesAndDesc().Keys)
                {
                    string potQueryName = SubstringFromTo(formulaText, indexPlaceholder - (queryName.Length - 2), indexPlaceholder + 1).ToLower();
                    if (potQueryName == queryName.ToLower())
                    {
                        theQuery = queryName;
                        break;
                    }
                }
                if (theQuery == string.Empty)
                {
                    formulaText = formulaText.Substring(0, indexPlaceholder) + "#°" +
                                  formulaText.Substring(indexPlaceholder + 2);   //no query found, replace #x preliminary by #° (change back below)
                }
                else //add all parameters of the query
                {
                    Dictionary <string, DefinitionAdmin.Par> queryParameters = new Dictionary <string, DefinitionAdmin.Par>();
                    DefinitionAdmin.GetQueryDefinition(theQuery, out DefinitionAdmin.Query queryDef, out string dummy, false);
                    if (queryDef != null)
                    {
                        queryParameters = queryDef.par;
                    }
                    List <string> alreadyCoveredByAlias = new List <string>(); // avoid adding e.g. #_income as well as #_info
                    foreach (var q in queryParameters)
                    {
                        string queryParName = q.Key; DefinitionAdmin.Par queryParDef = q.Value;
                        if (alreadyCoveredByAlias.Contains(queryParName))
                        {
                            continue;
                        }
                        footnoteParametersToAdd.Add(new KeyValuePair <string, string>(queryParName, nextFootnote.ToString()), queryParDef); //put parameter into list of footnote parameters which need to be generated
                        alreadyCoveredByAlias.AddRange(queryParDef.substitutes);
                    }
                    formulaText = formulaText.Substring(0, indexPlaceholder) + "#" + nextFootnote.ToString() +
                                  formulaText.Substring(indexPlaceholder + 2); //replace #x by #f (e.g. #x by #5)
                    ++nextFootnote;
                }
            }
            formulaText = formulaText.Replace("#°", "#x");

            return(footnoteParametersToAdd);
        }