/// <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); } }
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); }