// Token: 0x06004143 RID: 16707 RVA: 0x0012A510 File Offset: 0x00128710
        private TextRun HandleText(StaticTextPointer position)
        {
            StaticTextPointer position2 = this._owner.Host.TextContainer.Highlights.GetNextPropertyChangePosition(position, LogicalDirection.Forward);

            if (position.GetOffsetToPosition(position2) > 4096)
            {
                position2 = position.CreatePointer(4096);
            }
            Highlights highlights = position.TextContainer.Highlights;
            TextDecorationCollection textDecorationCollection = highlights.GetHighlightValue(position, LogicalDirection.Forward, typeof(SpellerHighlightLayer)) as TextDecorationCollection;
            TextRunProperties        textRunProperties        = this._lineProperties.DefaultTextRunProperties;

            if (textDecorationCollection != null)
            {
                if (this._spellerErrorProperties == null)
                {
                    this._spellerErrorProperties = new TextProperties((TextProperties)textRunProperties, textDecorationCollection);
                }
                textRunProperties = this._spellerErrorProperties;
            }
            ITextSelection textSelection = position.TextContainer.TextSelection;
            TextEditor     textEditor    = (textSelection != null) ? textSelection.TextEditor : null;

            if (textEditor != null)
            {
                ITextView textView = textEditor.TextView;
                if (((textView != null) ? new bool?(textView.RendersOwnSelection) : null) == true && highlights.GetHighlightValue(position, LogicalDirection.Forward, typeof(TextSelection)) != DependencyProperty.UnsetValue)
                {
                    TextProperties   textProperties   = new TextProperties((TextProperties)textRunProperties, textDecorationCollection);
                    FrameworkElement frameworkElement = (textEditor != null) ? textEditor.UiScope : null;
                    if (frameworkElement != null)
                    {
                        textProperties.SetBackgroundBrush(null);
                        Brush brush = frameworkElement.GetValue(TextBoxBase.SelectionTextBrushProperty) as Brush;
                        if (brush != null)
                        {
                            textProperties.SetForegroundBrush(brush);
                        }
                    }
                    textRunProperties = textProperties;
                }
            }
            char[] array     = new char[position.GetOffsetToPosition(position2)];
            int    textInRun = position.GetTextInRun(LogicalDirection.Forward, array, 0, array.Length);

            Invariant.Assert(textInRun == array.Length);
            return(new TextCharacters(array, 0, textInRun, textRunProperties));
        }
예제 #2
0
        //-------------------------------------------------------------------
        //
        //  Private Methods
        //
        //-------------------------------------------------------------------

        #region Private Methods

        /// <summary>
        /// Fetch the next run at text position.
        /// </summary>
        private TextRun HandleText(StaticTextPointer position)
        {
            // Calculate the end of the run by finding either:
            //      a) the next intersection of highlight ranges, or
            //      b) the natural end of this textrun
            StaticTextPointer endOfRunPosition = _owner.Host.TextContainer.Highlights.GetNextPropertyChangePosition(position, LogicalDirection.Forward);

            // Clamp the text run at an arbitrary limit, so we don't make
            // an unbounded allocation.
            if (position.GetOffsetToPosition(endOfRunPosition) > 4096)
            {
                endOfRunPosition = position.CreatePointer(4096);
            }

            var highlights = position.TextContainer.Highlights;

            // Factor in any speller error squiggles on the run.
            TextDecorationCollection highlightDecorations = highlights.GetHighlightValue(position, LogicalDirection.Forward, typeof(SpellerHighlightLayer)) as TextDecorationCollection;

            TextRunProperties properties = _lineProperties.DefaultTextRunProperties;

            if (highlightDecorations != null)
            {
                if (_spellerErrorProperties == null)
                {
                    _spellerErrorProperties = new TextProperties((TextProperties)properties, highlightDecorations);
                }
                properties = _spellerErrorProperties;
            }

            var textEditor = position.TextContainer.TextSelection?.TextEditor;

            // DDVSO:405199
            // Apply selection highlighting if needed
            if ((textEditor?.TextView?.RendersOwnSelection == true) &&
                highlights.GetHighlightValue(position, LogicalDirection.Forward, typeof(TextSelection)) != DependencyProperty.UnsetValue)
            {
                // We need to create a new TextProperties instance here since we are going to change the Foreground and Background.
                var selectionProps = new TextProperties((TextProperties)properties, highlightDecorations);

                // The UiScope that owns this line should be the source for text/highlight properties
                var uiScope = textEditor?.UiScope;

                if (uiScope != null)
                {
                    // All selection properties are taken from TextBoxBase
                    bool isSelectionActive = (bool)uiScope.GetValue(TextBoxBase.IsSelectionActiveProperty);
                    bool isInactiveSelectionHighlightEnabled = (bool)uiScope.GetValue(TextBoxBase.IsInactiveSelectionHighlightEnabledProperty);

                    Brush selectionTextBrush = SystemColors.HighlightTextBrush;

                    // If we have an inactive selection and we allow the highlight, set the appropriate brush for the text here.
                    if (!isSelectionActive && isInactiveSelectionHighlightEnabled)
                    {
                        selectionTextBrush = SystemColors.InactiveSelectionHighlightTextBrush;
                    }

                    // Background should not be drawn since the selection is drawn below us
                    selectionProps.SetBackgroundBrush(null);
                    selectionProps.SetForegroundBrush(selectionTextBrush);
                }

                properties = selectionProps;
            }

            // Get character buffer for the text run.
            char[] textBuffer = new char[position.GetOffsetToPosition(endOfRunPosition)];

            // Copy characters from text run into buffer. Since we are dealing with plain text content,
            // we expect to get all the characters from position to endOfRunPosition.
            int charactersCopied = position.GetTextInRun(LogicalDirection.Forward, textBuffer, 0, textBuffer.Length);

            Invariant.Assert(charactersCopied == textBuffer.Length);

            // Create text run, using characters copied as length
            return(new TextCharacters(textBuffer, 0, charactersCopied, properties));
        }