/// <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;
        }
示例#5
0
        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;
                }
            }
        } 
示例#6
0
 /// <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); 
 }
示例#7
0
        /// <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);
        }
示例#8
0
        /// <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; 
        }