private void BuildColumns() { // Hidden expander column TreeViewColumn col = new TreeViewColumn(); col.Visible = false; AppendColumn(col); ExpanderColumn = col; source_column = new TreeViewColumn(); source_column.Sizing = TreeViewColumnSizing.Autosize; uint xpad = 2; // Special renderer for header rows; hidden for normal source rows header_renderer = new CellRendererText() { Xpad = xpad, Ypad = 4, Ellipsize = Pango.EllipsizeMode.End, Weight = (int)Pango.Weight.Bold, Variant = Pango.Variant.SmallCaps }; // Renderer for source rows; hidden for header rows source_renderer = new SourceRowRenderer(); source_renderer.Xpad = xpad; source_column.PackStart(header_renderer, true); source_column.SetCellDataFunc(header_renderer, new Gtk.CellLayoutDataFunc((layout, cell, model, iter) => { var type = (SourceModel.EntryType)model.GetValue(iter, (int)SourceModel.Columns.Type); header_renderer.Visible = type == SourceModel.EntryType.Group; source_renderer.Visible = type == SourceModel.EntryType.Source; if (type == SourceModel.EntryType.Group) { var source = model.GetValue(iter, (int)SourceModel.Columns.Source) as Source; header_renderer.Visible = true; header_renderer.Text = source.Name; } else { header_renderer.Visible = false; } })); int width, height; Gtk.Icon.SizeLookup(IconSize.Menu, out width, out height); source_renderer.RowHeight = RowHeight.Get(); source_renderer.RowHeight = height; source_renderer.Ypad = (uint)RowPadding.Get(); source_renderer.Ypad = 2; source_column.PackStart(source_renderer, true); source_column.SetCellDataFunc(source_renderer, new CellLayoutDataFunc(SourceRowRenderer.CellDataHandler)); AppendColumn(source_column); HeadersVisible = false; }
private void BuildColumns() { // Hidden expander column TreeViewColumn col = new TreeViewColumn(); col.Visible = false; AppendColumn(col); ExpanderColumn = col; focus_column = new TreeViewColumn(); renderer = new SourceRowRenderer(); renderer.RowHeight = RowHeight.Get(); renderer.Padding = RowPadding.Get(); focus_column.PackStart(renderer, true); focus_column.SetCellDataFunc(renderer, new CellLayoutDataFunc(SourceRowRenderer.CellDataHandler)); AppendColumn(focus_column); HeadersVisible = false; }
private void BuildColumns() { // Hidden expander column TreeViewColumn col = new TreeViewColumn(); col.Visible = false; AppendColumn(col); ExpanderColumn = col; source_column = new TreeViewColumn(); source_column.Sizing = TreeViewColumnSizing.Autosize; uint xpad = 2; // Special renderer for header rows; hidden for normal source rows header_renderer = new CellRendererText() { Xpad = xpad, Ypad = 4, Ellipsize = Pango.EllipsizeMode.End, Weight = (int)Pango.Weight.Bold, Variant = Pango.Variant.SmallCaps }; // Renderer for source rows; hidden for header rows source_renderer = new SourceRowRenderer(); source_renderer.Xpad = xpad; source_column.PackStart(header_renderer, true); source_column.SetCellDataFunc(header_renderer, new Gtk.CellLayoutDataFunc((layout, cell, model, iter) => { if (model == null) { throw new ArgumentNullException("model"); } // be paranoid about the values returned from model.GetValue(), they may be null or have unexpected types, see bgo#683359 var obj_type = model.GetValue(iter, (int)SourceModel.Columns.Type); if (obj_type == null || !(obj_type is SourceModel.EntryType)) { var source = model.GetValue(iter, (int)SourceModel.Columns.Source) as Source; var source_name = source == null ? "some source" : String.Format("source {0}", source.Name); Log.ErrorFormat( "SourceView of {0} could not render its source column because its type value returned {1} from the iter", source_name, obj_type == null ? "null" : String.Format("an instance of {0}", obj_type.GetType().FullName)); header_renderer.Visible = false; source_renderer.Visible = false; return; } var type = (SourceModel.EntryType)obj_type; header_renderer.Visible = type == SourceModel.EntryType.Group; source_renderer.Visible = type == SourceModel.EntryType.Source; if (type == SourceModel.EntryType.Group) { var source = (Source)model.GetValue(iter, (int)SourceModel.Columns.Source); header_renderer.Visible = true; header_renderer.Text = source.Name; } else { header_renderer.Visible = false; } })); int width, height; Gtk.Icon.SizeLookup(IconSize.Menu, out width, out height); source_renderer.RowHeight = RowHeight.Get(); source_renderer.RowHeight = height; source_renderer.Ypad = (uint)RowPadding.Get(); source_renderer.Ypad = 2; source_column.PackStart(source_renderer, true); source_column.SetCellDataFunc(source_renderer, new CellLayoutDataFunc(SourceRowRenderer.CellDataHandler)); AppendColumn(source_column); HeadersVisible = false; }
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); } }
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); }