示例#1
0
        /// <summary>
        /// Updates entry of BreakRecordTable with new data.
        /// </summary>
        /// <param name="pageNumber">Index of the entry to update.</param>
        /// <param name="page">DocumentPage object that has been just created.</param>
        /// <param name="brOut">Output BreakRecord for created page.</param>
        /// <param name="dependentMax">Last content position that can affect the output break record.</param>
        internal void UpdateEntry(int pageNumber, FlowDocumentPage page, PageBreakRecord brOut, TextPointer dependentMax)
        {
            ITextView             textView;
            BreakRecordTableEntry entry;
            bool isClean;

            Invariant.Assert(pageNumber >= 0 && pageNumber <= _breakRecords.Count, "The previous BreakRecord does not exist.");
            Invariant.Assert(page != null && page != DocumentPage.Missing, "Cannot update BRT with an invalid document page.");

            // Get TextView for DocumentPage. This TextView is used to access list of
            // content ranges. Those serve as optimalization in finding affeceted pages.
            textView = (ITextView)((IServiceProvider)page).GetService(typeof(ITextView));
            Invariant.Assert(textView != null, "Cannot access ITextView for FlowDocumentPage.");

            // Get current state of BreakRecordTable
            isClean = this.IsClean;

            // Add new entry into BreakRecordTable
            entry              = new BreakRecordTableEntry();
            entry.BreakRecord  = brOut;
            entry.DocumentPage = new WeakReference(page);
            entry.TextSegments = textView.TextSegments;
            entry.DependentMax = dependentMax;
            if (pageNumber == _breakRecords.Count)
            {
                _breakRecords.Add(entry);

                // Raise PaginationProgress event only if we did not have valid
                // entry for specified page number.
                _owner.OnPaginationProgress(pageNumber, 1);
            }
            else
            {
                // If old Page and/or BreakRecord are not changing, do not dispose them.
                if (_breakRecords[pageNumber].BreakRecord != null &&
                    _breakRecords[pageNumber].BreakRecord != entry.BreakRecord)
                {
                    _breakRecords[pageNumber].BreakRecord.Dispose();
                }
                if (_breakRecords[pageNumber].DocumentPage != null &&
                    _breakRecords[pageNumber].DocumentPage.Target != null &&
                    _breakRecords[pageNumber].DocumentPage.Target != entry.DocumentPage.Target)
                {
                    ((FlowDocumentPage)_breakRecords[pageNumber].DocumentPage.Target).Dispose();
                }
                _breakRecords[pageNumber] = entry;
            }

            // Raise PaginationCompleted event only if the BreakRecordTable just
            // become clean.
            if (!isClean && this.IsClean)
            {
                _owner.OnPaginationCompleted();
            }
        }
示例#2
0
        /// <summary>
        /// Updates entry of BreakRecordTable with new data.
        /// </summary>
        /// <param name="pageNumber">Index of the entry to update.</param>
        /// <param name="page">DocumentPage object that has been just created.</param>
        /// <param name="brOut">Output BreakRecord for created page.</param>
        /// <param name="dependentMax">Last content position that can affect the output break record.</param>
        internal void UpdateEntry(int pageNumber, FlowDocumentPage page, PageBreakRecord brOut, TextPointer dependentMax)
        {
            ITextView textView;
            BreakRecordTableEntry entry;
            bool isClean;

            Invariant.Assert(pageNumber >= 0 && pageNumber <= _breakRecords.Count, "The previous BreakRecord does not exist.");
            Invariant.Assert(page != null && page != DocumentPage.Missing, "Cannot update BRT with an invalid document page.");
            
            // Get TextView for DocumentPage. This TextView is used to access list of
            // content ranges. Those serve as optimalization in finding affeceted pages.
            textView = (ITextView)((IServiceProvider)page).GetService(typeof(ITextView));
            Invariant.Assert(textView != null, "Cannot access ITextView for FlowDocumentPage.");

            // Get current state of BreakRecordTable
            isClean = this.IsClean;

            // Add new entry into BreakRecordTable
            entry = new BreakRecordTableEntry();
            entry.BreakRecord = brOut;
            entry.DocumentPage = new WeakReference(page);
            entry.TextSegments = textView.TextSegments;
            entry.DependentMax = dependentMax;
            if (pageNumber == _breakRecords.Count)
            {
                _breakRecords.Add(entry);

                // Raise PaginationProgress event only if we did not have valid
                // entry for specified page number.
                _owner.OnPaginationProgress(pageNumber, 1);
            }
            else
            {
                // If old Page and/or BreakRecord are not changing, do not dispose them.
                if (_breakRecords[pageNumber].BreakRecord != null && 
                    _breakRecords[pageNumber].BreakRecord != entry.BreakRecord)
                {
                    _breakRecords[pageNumber].BreakRecord.Dispose();
                }
                if (_breakRecords[pageNumber].DocumentPage != null && 
                    _breakRecords[pageNumber].DocumentPage.Target != null &&
                    _breakRecords[pageNumber].DocumentPage.Target != entry.DocumentPage.Target)
                {
                    ((FlowDocumentPage)_breakRecords[pageNumber].DocumentPage.Target).Dispose();
                }
                _breakRecords[pageNumber] = entry;
            }

            // Raise PaginationCompleted event only if the BreakRecordTable just
            // become clean.
            if (!isClean && this.IsClean)
            {
                _owner.OnPaginationCompleted();
            }
        }