/// <summary> /// Проходит рекурсивно по всем узлам дерева, отыскивает табличные секции верхнего уровня, подцепляет к ним данные по нижележащим параметрам /// </summary> private void AddDataTable(FlexNodeReport parentNode, long idfObservation) { //если была создана табличная секция и она верхнего уровня (т.е. над ней нет других табличных секций), то //именно она будет нести пользовательские данные if (parentNode == null) { return; } var flexTableItem = parentNode.DataItem as FlexTableItem; if (flexTableItem != null && !(parentNode.ParentNode.DataItem is FlexTableItem)) { //собираем рекурсивно все нижележащие параметры, которые уже отсортированы по порядку следования var parameters = new List <Tuple <long, string> >(); CollectParametersUnderSection(parentNode, parameters); flexTableItem.BodyData = GetDataTableForTemplate(idfObservation, parameters); //вычисляем актуальную ширину этой секции как совокупность ширин входящих в неё объектов flexTableItem.Width = CalculateWidthTotal(parentNode); } //рекурсивно по всем потомкам foreach (var childNode in parentNode.ChildList) { AddDataTable((FlexNodeReport)childNode, idfObservation); } }
/// <summary> /// Добавляет лейбл с простым текстовым полем /// </summary> /// <param name="caption"></param> public FlexNodeReport Add(string caption) { var labelItem = new FlexLabelItem(caption, new Size(50, 50)); var result = new FlexNodeReport(this, labelItem); //выставляем размеры и положение для контейнера дин. параметров //отыщем среди них самый нижний (вложенные не учитываем) int top; int height; GetCorrectSize(ChildList, out top, out height); labelItem.Top = top + height; ChildList.Add(result); return(result); }
/// <summary> /// Расчёт совокупной ширины объекта, исходя из ширин, входящих в него объектов /// </summary> /// <param name="parentNode"></param> /// <returns></returns> private int CalculateWidthTotal(FlexNodeReport parentNode) { var result = 0; if (parentNode.ChildListCount > 0) { result += parentNode.ChildList.Sum(node => CalculateWidthTotal((FlexNodeReport)node)); parentNode.DataItem.Width = result; } else { result = parentNode.DataItem.Width; } return(result); }
public FlexNodeReport Add(ParametersDeletedFromTemplate rowParameter, bool isParameterInSection) { var rowParameterItem = new FlexLabelItem(rowParameter, isParameterInSection); //пересчитываем правильно его координаты //отыщем среди них самый нижний (вложенные не учитываем) int top; int height; GetCorrectSize(ChildList, out top, out height); rowParameterItem.Top = top + height + 10; var result = new FlexNodeReport(this, rowParameterItem); ChildList.Add(result); return(result); }
public void Add (ParametersDeletedFromTemplate rowParameter, ActivityParameter activityParametersRow, out Size size) { var node = Add(rowParameter, false); var parametersItem = new FlexLabelItem(rowParameter, activityParametersRow) { IsParameterValue = true, Top = node.DataItem.Top }; var nodeAp = new FlexNodeReport(this, parametersItem); ChildList.Add(nodeAp); //нод, который отвечает за контрол, выводится с фиксированной высотой nodeAp.DataItem.Height = DefaultControlHeight; size = new Size(rowParameter.intWidth, rowParameter.intHeight); }
internal static int CompareNodesByOrder(FlexNodeReport x, FlexNodeReport y) { int result; if (TryCompareNullNodes(x, y, out result)) { return(result); } if (x.DataItem.Order < y.DataItem.Order) { result = -1; } else if (x.DataItem.Order > y.DataItem.Order) { result = 1; } return(result); }
public void Add (ParameterTemplate parameterTemplateRow, ActivityParameter activityParametersRow) { Add(parameterTemplateRow, false); var parametersItem = new FlexLabelItem(parameterTemplateRow, activityParametersRow) { IsParameterValue = true }; var nodeAp = new FlexNodeReport(this, parametersItem); //нод, который отвечает за контрол, выводится с фиксированной высотой nodeAp.DataItem.Height = DefaultControlHeight; if (nodeAp.DataItem.Height > parametersItem.Height) { nodeAp.DataItem.Height = parametersItem.Height; } ChildList.Add(nodeAp); }
/* * /// <summary> * /// Перегоняет шаблон с Summary в древовидную форму (шаблон уже должен быть загружен) * /// </summary> * /// <returns></returns> * public FlexNode GetFlexNodeFromTemplateSummary() * { * var rootNode = FlexNode.CreateRoot(); * FillFlexNodeForSection(rootNode, null, IdfObservationSummary, IdfsFormTemplateSummary); //начинаем с корня шаблона и внутрь * //для каждой табличной секции верхнего уровня, входящей в шаблон, подцепим таблицу с данными * AddDataTable(rootNode, IdfObservationSummary); * * return rootNode; * } */ /// <summary> /// Собирает рекурсивно все нижележащие параметры, которые уже отсортированы по порядку следования /// </summary> /// <param name="parentNode"></param> /// <param name="parameters"></param> private void CollectParametersUnderSection(FlexNodeReport parentNode, List <Tuple <long, string> > parameters) { if (parentNode.DataItem != null) { var parameterTemplateRow = parentNode.DataItem.LinkedObject as ParameterTemplate; if (parameterTemplateRow != null) { parameters.Add(new Tuple <long, string>(parameterTemplateRow.idfsParameter, parameterTemplateRow.NationalName)); } else { var ps = parentNode.DataItem.LinkedObject as PredefinedStub; if (ps != null && ps.idfsParameter.HasValue) { parameters.Add(new Tuple <long, string>(ps.idfsParameter.Value, ps.strNameValue)); } } } //рекурсивно по всем потомкам foreach (var childNode in parentNode.ChildList) { CollectParametersUnderSection((FlexNodeReport)childNode, parameters); } }
public abstract void Visit(FlexNodeReport node);