internal override void Render(IRenderData renderData, int page) { if (IsNotVisible(renderData)) { return; } var pushTextForwardOnPages = 0; if (Visibility == PageVisibility.LastPage && renderData.PageNumberInfo.TotalPages != page) { pushTextForwardOnPages = renderData.PageNumberInfo.TotalPages.Value - 1; } if (_pageRowSet == null) { throw new InvalidOperationException("PreRendering has not yet been performed."); } renderData.ElementBounds = GetBounds(renderData.ParentBounds); if (!renderData.IncludeBackground && IsBackground) { return; } var headerFont = new XFont(_headerFont.GetName(renderData.Section), _headerFont.GetSize(renderData.Section), _headerFont.GetStyle(renderData.Section)); var headerBrush = new XSolidBrush(XColor.FromArgb(_headerFont.GetColor(renderData.Section))); var lineFont = new XFont(_contentFont.GetName(renderData.Section), _contentFont.GetSize(renderData.Section), _contentFont.GetStyle(renderData.Section)); var lineBrush = new XSolidBrush(XColor.FromArgb(_contentFont.GetColor(renderData.Section))); var groupFont = new XFont(_groupFont.GetName(renderData.Section), _groupFont.GetSize(renderData.Section), _groupFont.GetStyle(renderData.Section)); var firstColumn = _columns.FirstOrDefault(); if (firstColumn.Value == null) { return; } var headerSize = renderData.Graphics.MeasureString(firstColumn.Value.Title, headerFont, XStringFormats.TopLeft); var stdLineSize = renderData.Graphics.MeasureString(firstColumn.Value.Title, lineFont, XStringFormats.TopLeft); if (renderData.DebugData != null) { renderData.Graphics.DrawString(string.Format("Table: {0}", Name), renderData.DebugData.Font, renderData.DebugData.Brush, renderData.ElementBounds.Center); } if (renderData.DocumentData != null) { var dataTable = renderData.DocumentData.GetDataTable(Name); if (dataTable != null) { var columnPadding = ColumnPadding.ToXUnit(renderData.ElementBounds.Width); foreach (var column in _columns.Where(x => x.Value.WidthMode == WidthMode.Auto).ToList()) { //Get the size of the columnt title text var stringSize = renderData.Graphics.MeasureString(column.Value.Title, headerFont, XStringFormats.TopLeft); var wd = UnitValue.Parse((stringSize.Width + columnPadding).ToString(CultureInfo.InvariantCulture) + "px"); //If there is a fixed width value, start with that. if (column.Value.Width == null) { column.Value.Width = wd; } //If the column header title is greater than if (column.Value.Width.Value < wd) { column.Value.Width = wd; } foreach (var row in dataTable.Rows) { if (row is DocumentDataTableData) { var rowData = row as DocumentDataTableData; var cellData = GetValue(column.Key, rowData.Columns); stringSize = renderData.Graphics.MeasureString(cellData, lineFont, XStringFormats.TopLeft); wd = UnitValue.Parse((stringSize.Width + columnPadding).ToString(CultureInfo.InvariantCulture) + "px"); if (column.Value.Width < wd) { column.Value.Width = wd; } } } } foreach (var column in _columns.ToList()) { if (column.Value.HideValue != null) { column.Value.Hide = true; } foreach (var row in dataTable.Rows) { if (row is DocumentDataTableData) { var rowData = row as DocumentDataTableData; var cellData = GetValue(column.Key, rowData.Columns); var parsedHideValue = GetValue(column.Value.HideValue, rowData.Columns); if (parsedHideValue != cellData) { column.Value.Hide = false; } } } if (column.Value.Hide) { column.Value.Width = new UnitValue(); if (HideTableWhenColumnIsHidden == column.Key) { //Hide the entire table return; } } } RenderBorder(renderData.ElementBounds, renderData.Graphics, headerSize); var totalWidth = renderData.ElementBounds.Width; var nonSpringWidth = _columns.Where(x => x.Value.WidthMode != WidthMode.Spring).Sum(x => x.Value.Width != null ? x.Value.Width.Value.ToXUnit(totalWidth) : 0); var springCount = _columns.Count(x => x.Value.WidthMode == WidthMode.Spring && !x.Value.Hide); if (springCount > 0) { foreach (var column in _columns.Where(x => x.Value.WidthMode == WidthMode.Spring && !x.Value.Hide).ToList()) { if (column.Value.Width == null) { column.Value.Width = "0"; } var calculatedWidth = new UnitValue((renderData.ElementBounds.Width - nonSpringWidth) / springCount, UnitValue.EUnit.Point); if (calculatedWidth > column.Value.Width) { column.Value.Width = calculatedWidth; } } } AssureTotalColumnWidth(renderData.ElementBounds.Width); //Create header double left = 0; var tableColumns = _columns.Values.Where(x => !x.Hide).ToList(); foreach (var column in tableColumns) { var alignmentJusttification = 0D; if (column.Align == Alignment.Right) { var stringSize = renderData.Graphics.MeasureString(column.Title, headerFont, XStringFormats.TopLeft); alignmentJusttification = column.Width.Value.ToXUnit(renderData.ElementBounds.Width) - stringSize.Width - (columnPadding / 2); } else { alignmentJusttification += columnPadding / 2; } renderData.Graphics.DrawString(column.Title, headerFont, headerBrush, new XPoint(renderData.ElementBounds.Left + left + alignmentJusttification, renderData.ElementBounds.Top), XStringFormats.TopLeft); left += column.Width.Value.ToXUnit(renderData.ElementBounds.Width); if (renderData.DebugData != null) { renderData.Graphics.DrawLine(renderData.DebugData.Pen, renderData.ElementBounds.Left + left, renderData.ElementBounds.Top, renderData.ElementBounds.Left + left, renderData.ElementBounds.Bottom); } } var top = headerSize.Height + RowPadding.ToXUnit(renderData.ElementBounds.Height); var pageIndex = 1; var defaultRowset = true; var pageRowSet = new PageRowSet { FromRow = 1 }; var index = page - renderData.Section.GetPageOffset() - pushTextForwardOnPages; if (_pageRowSet.Count > index) { try { defaultRowset = false; pageRowSet = _pageRowSet[index]; } catch (Exception exception) { throw new InvalidOperationException(string.Format("_pageRowSet.Count={0}, index={1}", _pageRowSet.Count, index), exception); } } //Draw column separator lines if (ColumnBorderColor != null) { left = 0; var borderPen = new XPen(ColumnBorderColor.Value, 0.1); //TODO: Set the thickness of the boarder foreach (var column in _columns.Where(x => !x.Value.Hide).TakeAllButLast().ToList()) { left += column.Value.Width.Value.ToXUnit(renderData.ElementBounds.Width); renderData.Graphics.DrawLine(borderPen, renderData.ElementBounds.Left + left, renderData.ElementBounds.Top, renderData.ElementBounds.Left + left, renderData.ElementBounds.Bottom); } } for (var i = pageRowSet.FromRow; i < pageRowSet.ToRow + 1; i++) { DocumentDataTableLine row; try { row = dataTable.Rows[i]; } catch (Exception exception) { var msg = string.Format("Looping from {0} to {1}. Currently at {2}, collection has {3} lines.", pageRowSet.FromRow, pageRowSet.ToRow + 1, i, dataTable.Rows.Count); throw new InvalidOperationException(msg + string.Format("dataTable.Rows.Count={0}, i={1}, pageIndex={2}, page={3}, GetPageOffset={4}, index={5}, FromRow={6}, ToRow={7}, _pageRowSet.Count={8}, defaultRowset={9}", dataTable.Rows.Count, i, pageIndex, page, renderData.Section.GetPageOffset(), index, pageRowSet.FromRow, pageRowSet.ToRow, _pageRowSet.Count, defaultRowset), exception); } left = 0; var lineSize = stdLineSize; if (row is DocumentDataTableData) { var rowData = row as DocumentDataTableData; foreach (var column in _columns.Where(x => !x.Value.Hide).ToList()) { var cellData = GetValue(column.Key, rowData.Columns); var alignmentJusttification = 0D; if (column.Value.Align == Alignment.Right) { var stringSize = renderData.Graphics.MeasureString(cellData, lineFont, XStringFormats.TopLeft); alignmentJusttification = column.Value.Width.Value.ToXUnit(renderData.ElementBounds.Width) - stringSize.Width - (columnPadding / 2); } else { alignmentJusttification += columnPadding / 2; } var parsedHideValue = GetValue(column.Value.HideValue, rowData.Columns); if (parsedHideValue == cellData) { cellData = string.Empty; } //TODO: If the string is too long. Cut the string down. var calculatedCellData = AssureThatTextFitsInColumn(renderData, cellData, column, columnPadding, lineFont); renderData.Graphics.DrawString(calculatedCellData, lineFont, lineBrush, new XPoint(renderData.ElementBounds.Left + left + alignmentJusttification, renderData.ElementBounds.Top + top), XStringFormats.TopLeft); left += column.Value.Width.Value.ToXUnit(renderData.ElementBounds.Width); } if (_skipLine != null && pageIndex % SkipLine.Interval == 0) { var skipLineHeight = SkipLine.Height.ToXUnit(renderData.ElementBounds.Height); if (SkipLine.BorderColor != null) { renderData.Graphics.DrawLine(new XPen(XColor.FromArgb((Color)SkipLine.BorderColor), 0.1), renderData.ElementBounds.Left, renderData.ElementBounds.Top + top + lineSize.Height + skipLineHeight / 2, renderData.ElementBounds.Right, renderData.ElementBounds.Top + top + lineSize.Height + skipLineHeight / 2); } top += skipLineHeight; } } else if (row is DocumentDataTableGroup) { var group = row as DocumentDataTableGroup; if (pageIndex != 1) { top += GroupSpacing.ToXUnit(renderData.ElementBounds.Height); } var groupData = group.Content; var stringSize = renderData.Graphics.MeasureString(groupData, groupFont, XStringFormats.TopLeft); lineSize = stringSize; var topLeftBox = new XPoint(renderData.ElementBounds.Left + left, renderData.ElementBounds.Top + top); var topLeftText = new XPoint(renderData.ElementBounds.Left + left + (columnPadding / 2), renderData.ElementBounds.Top + top); if (GroupBackgroundColor != null) { var brush = new XSolidBrush(XColor.FromArgb(GroupBackgroundColor.Value)); var rect = new XRect(topLeftBox, new XSize(renderData.ElementBounds.Width, stringSize.Height)); renderData.Graphics.DrawRectangle(new XPen(XColor.FromArgb(GroupBorderColor ?? GroupBackgroundColor.Value), 0.1), brush, rect); } else if (GroupBorderColor != null) { var rect = new XRect(topLeftBox, new XSize(renderData.ElementBounds.Width, stringSize.Height)); renderData.Graphics.DrawRectangle(new XPen(XColor.FromArgb(GroupBorderColor.Value), 0.1), rect); } renderData.Graphics.DrawString(groupData, groupFont, lineBrush, topLeftText, XStringFormats.TopLeft); pageIndex = 0; } top += lineSize.Height; top += RowPadding.ToXUnit(renderData.ElementBounds.Height); pageIndex++; } ////Draw column separator lines //if (ColumnBorderColor != null) //{ // left = 0; // var borderPen = new XPen(ColumnBorderColor.Value, 0.1); //TODO: Set the thickness of the boarder // foreach (var column in _columns.Where(x => !x.Value.Hide).TakeAllButLast().ToList()) // { // left += column.Value.Width.Value.GetXUnitValue(renderData.ElementBounds.Width); // renderData.Graphics.DrawLine(borderPen, renderData.ElementBounds.Left + left, renderData.ElementBounds.Top, renderData.ElementBounds.Left + left, renderData.ElementBounds.Bottom); // } //} } } if (renderData.DebugData != null) { renderData.Graphics.DrawRectangle(renderData.DebugData.Pen, renderData.ElementBounds); } }
/// <inheritdoc/> public override async Task SetParametersAsync(ParameterView parameters) { if (Rendered) { var decimalsChanged = isIntegerType ? false : parameters.TryGetValue <int>(nameof(Decimals), out var paramDecimals) && !Decimals.IsEqual(paramDecimals); var decimalSeparatorChanged = parameters.TryGetValue <string>(nameof(DecimalSeparator), out var paramDecimalSeparator) && !DecimalSeparator.IsEqual(paramDecimalSeparator); var alternativeDecimalSeparatorChanged = parameters.TryGetValue <string>(nameof(AlternativeDecimalSeparator), out var paramAlternativeDecimalSeparator) && !AlternativeDecimalSeparator.IsEqual(paramAlternativeDecimalSeparator); var groupSeparatorChanged = parameters.TryGetValue <string>(nameof(GroupSeparator), out var paramGroupSeparator) && !GroupSeparator.IsEqual(paramGroupSeparator); var groupSpacingChanged = parameters.TryGetValue <string>(nameof(GroupSpacing), out var paramGroupSpacing) && !GroupSpacing.IsEqual(paramGroupSpacing); var currencySymbolChanged = parameters.TryGetValue <string>(nameof(CurrencySymbol), out var paramCurrencySymbol) && !CurrencySymbol.IsEqual(paramCurrencySymbol); var currencySymbolPlacementChanged = parameters.TryGetValue <CurrencySymbolPlacement>(nameof(CurrencySymbolPlacement), out var paramCurrencySymbolPlacement) && !CurrencySymbolPlacement.IsEqual(paramCurrencySymbolPlacement); var roundingMethodChanged = parameters.TryGetValue <NumericRoundingMethod>(nameof(RoundingMethod), out var paramRoundingMethod) && !RoundingMethod.IsEqual(paramRoundingMethod); var minChanged = parameters.TryGetValue <TValue>(nameof(Min), out var paramMin) && !Min.IsEqual(paramMin); var maxChanged = parameters.TryGetValue <TValue>(nameof(Max), out var paramMax) && !Max.IsEqual(paramMax); var minMaxLimitsOverrideChanged = parameters.TryGetValue <NumericMinMaxLimitsOverride>(nameof(MinMaxLimitsOverride), out var paramMinMaxLimitsOverride) && !MinMaxLimitsOverride.IsEqual(paramMinMaxLimitsOverride); var selectAllOnFocusChanged = parameters.TryGetValue <bool>(nameof(SelectAllOnFocus), out var paramSelectAllOnFocus) && !SelectAllOnFocus.IsEqual(paramSelectAllOnFocus); var allowDecimalPaddingChanged = parameters.TryGetValue <NumericAllowDecimalPadding>(nameof(AllowDecimalPadding), out var paramAllowDecimalPadding) && !AllowDecimalPadding.IsEqual(paramAllowDecimalPadding); var alwaysAllowDecimalSeparatorChanged = parameters.TryGetValue <bool>(nameof(AlwaysAllowDecimalSeparator), out var paramAlwaysAllowDecimalSeparator) && !AlwaysAllowDecimalSeparator.IsEqual(paramAlwaysAllowDecimalSeparator); var modifyValueOnWheelChanged = parameters.TryGetValue <bool>(nameof(ModifyValueOnWheel), out var paramModifyValueOnWheel) && !ModifyValueOnWheel.IsEqual(paramModifyValueOnWheel); var wheelOnChanged = parameters.TryGetValue <NumericWheelOn>(nameof(WheelOn), out var paramWheelOn) && !WheelOn.IsEqual(paramWheelOn); if (decimalsChanged || decimalSeparatorChanged || alternativeDecimalSeparatorChanged || groupSeparatorChanged || groupSpacingChanged || currencySymbolChanged || currencySymbolPlacementChanged || roundingMethodChanged || minChanged || maxChanged || selectAllOnFocusChanged || allowDecimalPaddingChanged || alwaysAllowDecimalSeparatorChanged || modifyValueOnWheelChanged) { ExecuteAfterRender(async() => await JSModule.UpdateOptions(ElementRef, ElementId, new { Decimals = new { Changed = decimalsChanged, Value = GetDecimals() }, DecimalSeparator = new { Changed = decimalSeparatorChanged, Value = paramDecimalSeparator }, AlternativeDecimalSeparator = new { Changed = alternativeDecimalSeparatorChanged, Value = paramAlternativeDecimalSeparator }, GroupSeparator = new { Changed = groupSeparatorChanged, Value = paramGroupSeparator }, GroupSpacing = new { Changed = groupSpacingChanged, Value = paramGroupSpacing }, CurrencySymbol = new { Changed = currencySymbolChanged, Value = paramCurrencySymbol }, CurrencySymbolPlacement = new { Changed = currencySymbolPlacementChanged, Value = paramCurrencySymbolPlacement.ToCurrencySymbolPlacement() }, RoundingMethod = new { Changed = roundingMethodChanged, Value = paramRoundingMethod.ToNumericRoundingMethod() }, AllowDecimalPadding = new { Changed = allowDecimalPaddingChanged, Value = paramAllowDecimalPadding.ToNumericDecimalPadding() }, AlwaysAllowDecimalSeparator = new { Changed = alwaysAllowDecimalSeparatorChanged, Value = paramAlwaysAllowDecimalSeparator }, Min = new { Changed = minChanged, Value = paramMin }, Max = new { Changed = maxChanged, Value = paramMax }, MinMaxLimitsOverride = new { Changed = minMaxLimitsOverrideChanged, Value = paramMinMaxLimitsOverride }, SelectAllOnFocus = new { Changed = selectAllOnFocusChanged, Value = paramSelectAllOnFocus }, ModifyValueOnWheel = new { Changed = modifyValueOnWheelChanged, Value = paramModifyValueOnWheel }, WheelOn = new { Changed = wheelOnChanged, Value = paramWheelOn }, })); } var valueChanged = parameters.TryGetValue <TValue>(nameof(Value), out var paramValue) && !Value.IsEqual(paramValue); if (valueChanged) { ExecuteAfterRender(async() => await JSModule.UpdateValue(ElementRef, ElementId, paramValue)); } } // This make sure we know that Min or Max parameters are defined and can be checked against the current value. // Without we cannot determine if Min or Max has a default value when TValue is non-nullable type. MinDefined = parameters.TryGetValue <TValue>(nameof(Min), out var min); MaxDefined = parameters.TryGetValue <TValue>(nameof(Max), out var max); await base.SetParametersAsync(parameters); if (ParentValidation != null) { if (parameters.TryGetValue <Expression <Func <TValue> > >(nameof(ValueExpression), out var expression)) { await ParentValidation.InitializeInputExpression(expression); } if (parameters.TryGetValue <string>(nameof(Pattern), out var pattern)) { // make sure we get the newest value var value = parameters.TryGetValue <TValue>(nameof(Value), out var inValue) ? inValue : InternalValue; await ParentValidation.InitializeInputPattern(pattern, value); } await InitializeValidation(); } }
internal override int PreRender(IRenderData renderData) { _pageRowSet = new List <PageRowSet>(); renderData.ElementBounds = GetBounds(renderData.ParentBounds); if (IsBackground && !renderData.IncludeBackground) { return(0); } var headerFont = new XFont(_headerFont.GetName(renderData.Section), _headerFont.GetSize(renderData.Section), _headerFont.GetStyle(renderData.Section)); var lineFont = new XFont(_contentFont.GetName(renderData.Section), _contentFont.GetSize(renderData.Section), _contentFont.GetStyle(renderData.Section)); var groupFont = new XFont(_groupFont.GetName(renderData.Section), _groupFont.GetSize(renderData.Section), _groupFont.GetStyle(renderData.Section)); var firstColumn = _columns.FirstOrDefault(); if (firstColumn.Value == null) { return(0); } var headerSize = renderData.Graphics.MeasureString(firstColumn.Value.Title, headerFont, XStringFormats.TopLeft); var stdLineSize = renderData.Graphics.MeasureString(firstColumn.Value.Title, lineFont, XStringFormats.TopLeft); if (renderData.DocumentData != null) { var dataTable = renderData.DocumentData.GetDataTable(Name); if (dataTable != null) { var top = headerSize.Height + RowPadding.ToXUnit(renderData.ElementBounds.Height); var pageIndex = 1; var firstLineOnPage = 0; for (var i = 0; i < dataTable.Rows.Count; i++) { var lineSize = stdLineSize; if (dataTable.Rows[i] is DocumentDataTableData) { if (_skipLine != null && pageIndex % SkipLine.Interval == 0) { top += SkipLine.Height.ToXUnit(renderData.ElementBounds.Height); } } else if (dataTable.Rows[i] is DocumentDataTableGroup) { top += GroupSpacing.ToXUnit(renderData.ElementBounds.Height); lineSize = renderData.Graphics.MeasureString("X", groupFont, XStringFormats.TopLeft); pageIndex = 0; } top += lineSize.Height; top += RowPadding.ToXUnit(renderData.ElementBounds.Height); pageIndex++; if (top > renderData.ElementBounds.Height - lineSize.Height) { _pageRowSet.Add(new PageRowSet { FromRow = firstLineOnPage, ToRow = i }); firstLineOnPage = i + 1; top = headerSize.Height + RowPadding.ToXUnit(renderData.ElementBounds.Height); } } if (firstLineOnPage != dataTable.Rows.Count) { _pageRowSet.Add(new PageRowSet { FromRow = firstLineOnPage, ToRow = dataTable.Rows.Count - 1 }); } } } return(_pageRowSet.Count); }