/// <summary> /// Converts Flowchart.NET table into SVG /// </summary> /// <param name="newTable">Table reference</param> /// <returns>TRUE if successfull otherwise FALSE</returns> private bool CreateTable(MindFusion.FlowChartX.Table newTable) { bool bOk = false; float fX = 0, fY = 0, fW = 0, fH = 0, fLine = 0; long lLine = 0; XmlNode last_node = null; ArrayList spannedCells = new ArrayList(); try { fX = newTable.BoundingRect.X; fY = newTable.BoundingRect.Y; fW = newTable.BoundingRect.Width; fH = newTable.BoundingRect.Height; fLine = newTable.Pen.Width; lLine = Unit2Pix(fLine); if (lLine == 0) { lLine = 1; } last_node = sMan.AddRect(String.Format("{0}px", Unit2Pix(fX)), String.Format("{0}px", Unit2Pix(fY)), String.Format("{0}px", Unit2Pix(fW)), String.Format("{0}px", Unit2Pix(newTable.CaptionHeight)), String.Format("{0}px", lLine), newTable.FillColor, newTable.FrameColor, null, null, newTable.Image); sMan.AddGradient(last_node, newTable.Brush); sMan.AddText(null, newTable.Caption, newTable.Font, new RectangleF(fX, fY, fW, newTable.CaptionHeight), newTable.CaptionColor, pChart.TextFormat, newTable.EnableStyledText); last_node = sMan.AddRect(String.Format("{0}px", Unit2Pix(fX)), String.Format("{0}px", Unit2Pix(fY + newTable.CaptionHeight)), String.Format("{0}px", Unit2Pix(fW)), String.Format("{0}px", Unit2Pix(fH - newTable.CaptionHeight)), String.Format("{0}px", lLine), newTable.FillColor, newTable.FrameColor, null, null, newTable.Image); sMan.AddGradient(last_node, newTable.Brush); fW = 0; fH = 0; int RowCount = newTable.CurrScrollRow, ColCount = 0, AutoColls = 0; float fCellW = 0, fCellH = 0, fCellX = 0, fCellY = 0, rh = 0, fStepW = 0, fSumW = 0; bool CellIsSpanned = false; fCellX = fX; fCellY = fY + newTable.CaptionHeight; AutoColls = 0; fSumW = 0; foreach (Table.Column col in newTable.Columns) { if (col.ColumnStyle == MindFusion.FlowChartX.ColumnStyle.AutoWidth) { AutoColls++; } else { fSumW += col.Width; } } while (RowCount < newTable.Rows.Count) { if (RowCount != newTable.CurrScrollRow) { rh = newTable.Rows[RowCount - 1].Height; } else { rh = 0; } fCellY += rh; if (fCellY > newTable.BoundingRect.Bottom - rh) { break; } while (ColCount < newTable.Columns.Count) { if (ColCount != 0) { fCellX += newTable.Columns[ColCount - 1].Width; } Table.Cell cell = newTable[ColCount, RowCount]; if (!spannedCells.Contains(cell)) { fCellH = 0; for (int i = RowCount; i < RowCount + cell.RowSpan; i++) { fCellH += newTable.Rows[i].Height; fCellW = 0; bool bPass = true; for (int j = ColCount; j < ColCount + cell.ColumnSpan; j++) { if ((newTable.Columns[ColCount].ColumnStyle == MindFusion.FlowChartX.ColumnStyle.AutoWidth) && bPass) { fStepW = (newTable.BoundingRect.Width - fSumW) / AutoColls; bPass = false; } else { fStepW = newTable.Columns[j].Width; } fCellW += fStepW; spannedCells.Add(newTable[j, i]); //Trace.WriteLine(String.Format("Pos ({0}, {1} ) Spanned ({2},{3})", RowCount, ColCount, i,j)); } } if (AutoColls == 0) { if (ColCount == (newTable.Columns.Count - 1)) { fCellW += (newTable.BoundingRect.Width - fSumW); } //fCellW = newTable.BoundingRect.Right - fCellX + ( cell.Text == "" ? 0 : 15) ; } RectangleF cellRect = new RectangleF(fCellX, fCellY, fCellW, fCellH); CellIsSpanned = ((cell.ColumnSpan > 1) || (cell.RowSpan > 1)); sMan.AddText(CellIsSpanned ? null : newTable, cell.Text, newTable.Font, cellRect, newTable.TextColor, cell.TextFormat, newTable.EnableStyledText); sMan.AddRect(Unit2PixStr(cellRect.X), Unit2PixStr(cellRect.Y), Unit2PixStr(cellRect.Width), Unit2PixStr(cellRect.Height), "1px", Color.Transparent, Color.Transparent, null, null, cell.Image, newTable.FillColor, cell.ImageAlign, cellRect); if (newTable.CellFrameStyle != CellFrameStyle.None) { sMan.AddRect(Unit2PixStr(cellRect.X), Unit2PixStr(cellRect.Y), Unit2PixStr(cellRect.Width), Unit2PixStr(cellRect.Height), "1px", Color.Transparent, newTable.FrameColor); } } ColCount++; } fCellX = fX; ColCount = 0; RowCount++; } bOk = true; } catch (Exception ex) { Trace.WriteLine(String.Format("{0} error {1}\n", "CreateTable", ex.Message)); bOk = false; } return(bOk); }