示例#1
0
        /// <summary>
        /// Create FlexNode For Section
        /// </summary>
        /// <param name="parentNode"></param>
        /// <param name="parentSection"></param>
        /// <param name="template"></param>
        /// <param name="activityParameters"></param>
        /// <param name="predefinedStubRows"></param>
        /// <param name="model"></param>
        /// <returns></returns>
        private static void CreateFlexNodeForSection(FlexNode parentNode, SectionTemplate parentSection, Template template, EditableList <ActivityParameter> activityParameters, List <PredefinedStub> predefinedStubRows, FFPresenterModel model)
        {
            //для табличной секции верхнего уровня следует добавить пользовательские данные

            var sectionList = parentSection != null
                                  ? template.GetSectionTemplateChildren(parentSection).ToList()
                                  : template.GetSectionTemplateRoot().ToList();

            var parameterList = parentSection != null
                                    ? template.GetParameterTemplateChildren(parentSection).ToList()
                                    : template.GetParameterTemplateRoot().ToList();

            var labelList = parentSection != null
                                    ? template.GetLabelChildren(parentSection).ToList()
                                    : template.GetLabelRoot().ToList();

            //рекурсивно транслируем в узлы каждую секцию с её содержимым
            foreach (var sectionTemplate in sectionList)
            {
                FlexNode node;
                if (sectionTemplate.blnGrid && (parentSection == null))
                {
                    node = parentNode.Add(sectionTemplate, activityParameters, model);

                    if (predefinedStubRows != null)
                    {
                        sectionTemplate.PredefinedStubRows = predefinedStubRows;

                        #region Добавление параметров-столбцов боковика

                        //параметры боковика не имеют секции над собой, всегда крайние слева
                        //вынимаем уникальные параметры из данных боковика (spGetPredefinedStub)
                        var usedParams = new List <long>();
                        //for (var index = predefinedStubRows.Count - 1; index >= 0; index--)
                        var nodes = new List <FlexNode>();
                        foreach (var predefinedStubRow in predefinedStubRows)
                        {
                            if (!predefinedStubRow.idfsParameter.HasValue)
                            {
                                continue;
                            }
                            if (usedParams.Contains(predefinedStubRow.idfsParameter.Value))
                            {
                                continue;
                            }
                            usedParams.Add(predefinedStubRow.idfsParameter.Value);
                            predefinedStubRow.intOrder = usedParams.Count - 1;
                            var nodePred = node.Add(predefinedStubRow, null, predefinedStubRow.intOrder, model);
                            nodePred.Order = predefinedStubRow.intOrder;
                            nodes.Add(nodePred);
                        }
                        //у каждого нода боковика должен быть отрицательный индекс в порядке возрастания
                        for (var index = 0; index < nodes.Count; index++)
                        {
                            nodes[index].Order = index - nodes.Count;
                        }

                        #endregion
                    }
                }
                else
                {
                    node = parentNode.Add(sectionTemplate, activityParameters, model);
                }
                if (sectionTemplate.intOrder.HasValue)
                {
                    node.Order = sectionTemplate.intOrder.Value;
                }
                node.FormKey = parentNode.FormKey;

                CreateFlexNodeForSection(node, sectionTemplate, template, activityParameters, predefinedStubRows, model);
            }

            //транслируем все параметры, находящиеся на этом уровне
            foreach (var parameterTemplate in parameterList)
            {
                //parameterTemplate.RootKeyID = template.RootKeyID;
                var node = parentNode.Add(parameterTemplate, activityParameters, model);
                node.FormKey = parentNode.FormKey;
                node.Order   = parameterTemplate.intOrder;
            }

            //транслируем лейблы
            foreach (var label in labelList)
            {
                parentNode.Add(label, model);
            }
        }
示例#2
0
        public static FlexNode CreateFlexNodeForTemplate(this Template template, long?idfObservation, EditableList <ActivityParameter> activityParameters, List <PredefinedStub> predefinedStubRows, FFPresenterModel model)
        {
            var rootNode = new FlexNode(null, null, null, null)
            {
                FormKey = idfObservation.HasValue
                    ? DataHelper.GetFFParameterKey(template.idfsFormTemplate, idfObservation.Value)
                    : DataHelper.GetFFParameterSimpleKey(template.idfsFormTemplate)
            };

            //начинаем с корня шаблона и внутрь
            CreateFlexNodeForSection(rootNode, null, template, activityParameters, predefinedStubRows, model);
            //рекурсивная сортировка узлов
            rootNode.SortRecursive();
            //динамические параметры
            FlexNode dynamicSectNode = null;

            if (idfObservation.HasValue)
            {
                var deletedFromTemplates = FFHelper.GetDeletedParameters(activityParameters, idfObservation.Value, template);
                if (deletedFromTemplates.Count > 0 || model.DynamicParameterEnabled)
                {
                    FlexNode prevNode = rootNode.ChildListCount == 0 ? null : (FlexNode)rootNode.ChildList[rootNode.ChildListCount - 1];

                    var sectCaption = new SectionDeletedFromTemplate(EidssMessages.Get("DynamicParametersGroupControlCaption"));
                    sectCaption.intLeft   = prevNode == null ? 4 : prevNode.Coord.X;
                    sectCaption.intTop    = prevNode == null ? 4 : prevNode.Coord.Y + prevNode.Height;
                    sectCaption.intOrder  = prevNode == null ? 1 : prevNode.Order + 1;
                    sectCaption.intHeight = 0;

                    //создаём псевдосекцию, в которой будем размещать эти параметры
                    dynamicSectNode = new FlexNode(null, new FlexItem(sectCaption), activityParameters, model);
                    for (var i = 0; i < deletedFromTemplates.Count; i++)
                    {
                        var dp = deletedFromTemplates[i];

                        // calculate section size from its content
                        if (sectCaption.intWidth == null || dp.intWidth > sectCaption.intWidth)
                        {
                            sectCaption.intWidth = dp.intWidth;
                        }
                        dp.intTop              = sectCaption.Height + 4;
                        sectCaption.intHeight += dp.intHeight + 4;
                        dp.intLeft             = sectCaption.Left;

                        var ap = activityParameters.FirstOrDefault(c => c.idfsParameter == dp.idfsParameter);
                        if (ap != null)
                        {
                            ap.IsDynamicParameter = true;
                        }
                        var node = dynamicSectNode.Add(dp, activityParameters, model);
                        node.FormKey = dynamicSectNode.FormKey;
                        node.Order   = i;
                    }
                    //если динамическая секция есть, то добавляем её в самый конец списка
                    if (dynamicSectNode != null)
                    {
                        rootNode.Add(dynamicSectNode);
                    }
                }
            }

            return(rootNode);
        }