//----------------------------------------------------------------------------------------------------x /// <summary>Creates a row definition object.</summary> /// <param name="tlmBase">Table layout manager of this row</param> /// <param name="tlmRow_Prev">The new row will be inserted after <paramref name="tlmRow_Prev"/> or at the beginning if it is <see langword="null"/>.</param> /// <param name="aCellCreateType">Array with the cell creation data for each column</param> /// <exception cref="ReportException">The row cannot be created.</exception> internal TlmRow(TlmBase tlmBase) { tlmBase.CheckStatus_Open("cannot create a row."); this.tlmBase = tlmBase; tlmCellEnumerator = new TlmCellEnumerator(this); aTlmCell = new ArrayTlmCell(tlmBase.list_TlmColumn.Count); rPreferredHeight = tlmBase.tlmRowDef_Default.rPreferredHeight; }
//----------------------------------------------------------------------------------------------------x /// <summary>Creates a row definition object.</summary> /// <param name="tlmBase">Table layout manager of this row</param> /// <param name="tlmRow_Prev">The new row will be inserted after <paramref name="tlmRow_Prev"/> or at the beginning if it is <see langword="null"/>.</param> /// <param name="aCellCreateType">Array with the cell creation data for each column</param> /// <exception cref="ReportException">The row cannot be created.</exception> internal TlmRow(TlmBase tlmBase, TlmRow tlmRow_Prev, TlmBase.CellCreateType[] aCellCreateType) { tlmBase.CheckStatus_Open("cannot create a row."); if (tlmBase.al_TlmColumn.Count != aCellCreateType.Length) { throw new ReportException("The length of the cell create type array must be equal to the number of coulmns that are defined for this table layout manager."); } this.tlmBase = tlmBase; tlmCellEnumerator = new TlmCellEnumerator(this); aTlmCell = new ArrayTlmCell(tlmBase.al_TlmColumn.Count); for (Int32 iCol = 0; iCol < tlmBase.al_TlmColumn.Count; iCol++) { TlmColumn col = tlmBase.al_TlmColumn[iCol]; switch (aCellCreateType[iCol]) { case TlmBase.CellCreateType.New: { aTlmCell.SetCell(iCol, new TlmCell(col, col, this)); break; } case TlmBase.CellCreateType.MergedV: { if (tlmRow_Prev == null) { throw new ReportException("First row cannot be merged vertically."); } TlmCell cell_Prev = tlmRow_Prev.aTlmCell[iCol]; if (cell_Prev.tlmColumn_Start.iIndex != iCol) { throw new ReportException("Vertically merged cells must start in the same column."); } Debug.Assert(cell_Prev.tlmRow_End.iIndex == tlmRow_Prev.iIndex); cell_Prev.tlmRow_End = this; while (true) { aTlmCell.SetCell(iCol, cell_Prev); if (iCol >= cell_Prev.tlmColumn_End.iIndex) { break; } iCol++; if (aCellCreateType[iCol] != TlmBase.CellCreateType.MergedH) { throw new ReportException("Invalid cell create type of column " + iCol.ToString() + "; 'MergedH' expected"); } } break; } case TlmBase.CellCreateType.MergedH: { if (iCol == 0) { throw new ReportException("First column cannot be merged horizonally."); } TlmCell cell_Left = aTlmCell[iCol - 1]; if (!Object.ReferenceEquals(cell_Left.tlmRow_Start, this)) { throw new ReportException("Horizontally merged cells must start in the same row."); } aTlmCell.SetCell(iCol, cell_Left); Debug.Assert(cell_Left.tlmColumn_End.iIndex + 1 == iCol); cell_Left.tlmColumn_End = col; break; } case TlmBase.CellCreateType.Empty: { break; } default: { Debug.Fail("unknown cell create type"); break; } } } tlmBase.InsertRow(tlmRow_Prev, this); rPreferredHeight = tlmBase.rowDef.rPreferredHeight; tlmBase.OnNewRow(this); }