/// <summary> /// CreateParaclient /// </summary> /// <param name="pfsparaclient">Opaque to PTS paragraph client</param> internal override void CreateParaclient( out IntPtr pfsparaclient) // OUT: opaque to PTS paragraph client { #pragma warning disable 6518 // Disable PRESharp warning 6518. TableParaClient is an UnmamangedHandle, that adds itself // to HandleMapper that holds a reference to it. PTS manages lifetime of this object, and // calls DestroyParaclient to get rid of it. DestroyParaclient will call Dispose() on the object // and remove it from HandleMapper. TableParaClient paraClient = new TableParaClient(this); pfsparaclient = paraClient.Handle; #pragma warning restore 6518 }
/// <summary> /// C'tor - Just needs the table and cell para clients. /// </summary> /// <param name="tpc">Table para client.</param> /// <param name="cpc">Cell Para client.</param> internal CellInfo(TableParaClient tpc, CellParaClient cpc) { _rectTable = new Rect(TextDpi.FromTextDpi(tpc.Rect.u), TextDpi.FromTextDpi(tpc.Rect.v), TextDpi.FromTextDpi(tpc.Rect.du), TextDpi.FromTextDpi(tpc.Rect.dv)); _rectCell = new Rect(TextDpi.FromTextDpi(cpc.Rect.u), TextDpi.FromTextDpi(cpc.Rect.v), TextDpi.FromTextDpi(cpc.Rect.du), TextDpi.FromTextDpi(cpc.Rect.dv)); _autofitWidth = tpc.AutofitWidth; _columnWidths = new double[tpc.CalculatedColumns.Length]; for(int index = 0; index < tpc.CalculatedColumns.Length; index++) { _columnWidths[index] = tpc.CalculatedColumns[index].DurWidth; } _cell = cpc.Cell; }
//------------------------------------------------------ // // Constructors // //------------------------------------------------------ #region Constructors /// <summary> /// Default constructor. /// </summary> /// <param name="cellParagraph">Cell paragraph.</param> /// <param name="tableParaClient">Table paraclient.</param> internal CellParaClient(CellParagraph cellParagraph, TableParaClient tableParaClient) : base(cellParagraph) { _tableParaClient = tableParaClient; }
/// <summary> /// Calculates width of cell /// </summary> /// <param name="tableParaClient">Table owner</param> /// <returns>Cell's width</returns> internal double CalculateCellWidth(TableParaClient tableParaClient) { Debug.Assert(tableParaClient != null); CalculatedColumn[] calculatedColumns = tableParaClient.CalculatedColumns; Debug.Assert( calculatedColumns != null && (Cell.ColumnIndex + Cell.ColumnSpan) <= calculatedColumns.Length); double durCellSpacing = Table.InternalCellSpacing; double durCellWidth = -durCellSpacing; // find the width sum of all columns the cell spans int i = Cell.ColumnIndex + Cell.ColumnSpan - 1; do { durCellWidth += calculatedColumns[i].DurWidth + durCellSpacing; } while (--i >= Cell.ColumnIndex); Debug.Assert(0 <= durCellWidth); return durCellWidth; }
internal void FormatCellFinite( TableParaClient tableParaClient, // IN: IntPtr pfsbrkcellIn, // IN: not NULL if cell broken from previous page/column IntPtr pfsFtnRejector, // IN: int fEmptyOK, // IN: uint fswdirTable, // IN: int dvrAvailable, // IN: out PTS.FSFMTR pfmtr, // OUT: out IntPtr ppfscell, // OUT: cell object out IntPtr pfsbrkcellOut, // OUT: break if cell does not fit in dvrAvailable out int dvrUsed) // OUT: height -- min height required { Debug.Assert(Cell.Index != -1 && Cell.ColumnIndex != -1, "Cell is not in a table"); CellParaClient cellParaClient; Size subpageSize; Debug.Assert(Cell.Table != null); cellParaClient = new CellParaClient(this, tableParaClient); subpageSize = new Size( cellParaClient.CalculateCellWidth(tableParaClient), Math.Max(TextDpi.FromTextDpi(dvrAvailable), 0)); cellParaClient.FormatCellFinite(subpageSize, pfsbrkcellIn, PTS.ToBoolean(fEmptyOK), fswdirTable, PTS.FSKSUPPRESSHARDBREAKBEFOREFIRSTPARA.fsksuppresshardbreakbeforefirstparaNone, out pfmtr, out dvrUsed, out pfsbrkcellOut); // initialize output parameters ppfscell = cellParaClient.Handle; if(pfmtr.kstop == PTS.FSFMTRKSTOP.fmtrNoProgressOutOfSpace) { cellParaClient.Dispose(); ppfscell = IntPtr.Zero; dvrUsed = 0; } if (dvrAvailable < dvrUsed) { if (PTS.ToBoolean(fEmptyOK)) { if (cellParaClient != null) { cellParaClient.Dispose(); } if (pfsbrkcellOut != IntPtr.Zero) { PTS.Validate(PTS.FsDestroySubpageBreakRecord(cellParaClient.PtsContext.Context, pfsbrkcellOut), cellParaClient.PtsContext); pfsbrkcellOut = IntPtr.Zero; } ppfscell = IntPtr.Zero; pfmtr.kstop = PTS.FSFMTRKSTOP.fmtrNoProgressOutOfSpace; dvrUsed = 0; } else { pfmtr.fForcedProgress = PTS.True; } } }
/// <summary> /// SetCellHeight /// </summary> /// <param name="cellParaClient">Cell para client</param> /// <param name="tableParaClient">Table para client</param> /// <param name="subpageBreakRecord">Break record if cell is broken</param> /// <param name="fBrokenHere">Cell broken on this page/column</param> /// <param name="fswdirTable">Flow direction</param> /// <param name="dvrActual">Actual height</param> internal void SetCellHeight( CellParaClient cellParaClient, // IN: cell object TableParaClient tableParaClient, // table's para client IntPtr subpageBreakRecord, // not NULL if cell broken from previous page/column int fBrokenHere, // TRUE if cell broken on this page/column: no reformatting uint fswdirTable, int dvrActual) { cellParaClient.ArrangeHeight = TextDpi.FromTextDpi(dvrActual); }
/// <summary> /// UpdateBottomlessCell /// </summary> /// <param name="cellParaClient">Current cell para client</param> /// <param name="tableParaClient">Table para cleint</param> /// <param name="fswdirTable">Flow direction</param> /// <param name="fmtrbl">Formatting result</param> /// <param name="dvrUsed">Height consumed</param> internal void UpdateBottomlessCell( CellParaClient cellParaClient, // IN: TableParaClient tableParaClient, // IN: uint fswdirTable, // IN: out PTS.FSFMTRBL fmtrbl, // OUT: out int dvrUsed) // OUT: height -- min height required { Debug.Assert(Cell.Index != -1 && Cell.ColumnIndex != -1, "Cell is not in a table"); Debug.Assert(Cell.Table != null); cellParaClient.UpdateBottomlessCell(fswdirTable, cellParaClient.CalculateCellWidth(tableParaClient), out fmtrbl, out dvrUsed); }
/// <summary> /// FormatCellBottomless /// </summary> /// <param name="tableParaClient">Table para client</param> /// <param name="fswdirTable">Flow direction</param> /// <param name="fmtrbl">Formatting result</param> /// <param name="ppfscell">Cell para client</param> /// <param name="dvrUsed">Height consumed</param> internal void FormatCellBottomless( TableParaClient tableParaClient, // IN: uint fswdirTable, // IN: out PTS.FSFMTRBL fmtrbl, // OUT: out IntPtr ppfscell, // OUT: cell object out int dvrUsed) // OUT: height -- min height // required { Debug.Assert(Cell.Index != -1 && Cell.ColumnIndex != -1, "Cell is not in a table"); Debug.Assert(Cell.Table != null); CellParaClient cellParaClient = new CellParaClient(this, tableParaClient); cellParaClient.FormatCellBottomless(fswdirTable, cellParaClient.CalculateCellWidth(tableParaClient), out fmtrbl, out dvrUsed); // initialize output parameters ppfscell = cellParaClient.Handle; }