コード例 #1
0
        /// <summary>
        /// Formats and Highlights the text of a block.
        /// </summary>
        private void formatBlock(InnerTextBlock currentBlock, InnerTextBlock previousBlock)
        {
            currentBlock.FormattedText = GetFormattedText(currentBlock.RawText);
            var previousCode = previousBlock != null ? previousBlock.Code : -1;

            currentBlock.Code = getHighlighter().Highlight(currentBlock.FormattedText, previousCode);
        }
コード例 #2
0
        private void updateBlocks()
        {
            if (_blocks.Count == 0)
            {
                return;
            }

            // While something is visible after last block...
            while (!_blocks.Last().IsLast&& _blocks.Last().Position.Y + _blockHeight - this.TextBox1.VerticalOffset < ActualHeight)
            {
                int firstLineIndex = _blocks.Last().LineEndIndex + 1;
                int lastLineIndex  = firstLineIndex + _maxLineCountInBlock - 1;
                lastLineIndex = lastLineIndex <= _totalLineCount - 1 ? lastLineIndex : _totalLineCount - 1;

                int charStart     = _blocks.Last().CharEndIndex + 1;
                int lastCharIndex = TextUtilities.GetLastCharIndexFromLineIndex(this.TextBox1.Text, lastLineIndex); // to be optimized (forward search)

                if (lastCharIndex <= charStart)
                {
                    _blocks.Last().IsLast = true;
                    return;
                }

                var block = new InnerTextBlock(
                    charStart,
                    lastCharIndex,
                    _blocks.Last().LineEndIndex + 1,
                    lastLineIndex,
                    LineHeight);
                block.RawText     = block.GetSubString(this.TextBox1.Text);
                block.LineNumbers = getFormattedLineNumbers(block.LineStartIndex, block.LineEndIndex);
                _blocks.Add(block);
                formatBlock(block, _blocks.Count > 1 ? _blocks[_blocks.Count - 2] : null);
            }
        }
コード例 #3
0
        private void DrawBlocks()
        {
            if (!IsLoaded || _renderCanvas == null || _lineNumbersCanvas == null)
            {
                return;
            }

            if (!IsLineNumbersMarginVisible)
            {
                _lineNumbersCanvas.Visibility    = Visibility.Collapsed;
                _lineNumbersSeparator.Visibility = Visibility.Collapsed;
            }

            var dc  = _renderCanvas.GetContext();
            var dc2 = _lineNumbersCanvas.GetContext();

            for (int i = 0; i < _blocks.Count; i++)
            {
                InnerTextBlock block    = _blocks[i];
                Point          blockPos = block.Position;
                double         top      = blockPos.Y - this.TextBox1.VerticalOffset;
                double         bottom   = top + _blockHeight;
                if (top < ActualHeight && bottom > 0)
                {
                    dc.DrawText(block.FormattedText, new Point(2 - this.TextBox1.HorizontalOffset, block.Position.Y - this.TextBox1.VerticalOffset));
                    if (IsLineNumbersMarginVisible)
                    {
                        _lineNumbersCanvas.Width = GetFormattedTextWidth(string.Format("{0:0000}", _totalLineCount)) + 5;
                        dc2.DrawText(block.LineNumbers, new Point(_lineNumbersCanvas.ActualWidth, 1 + block.Position.Y - this.TextBox1.VerticalOffset));
                    }
                }
            }
            dc.Close();
            dc2.Close();
        }
コード例 #4
0
        private void invalidateBlocks(int changeOffset)
        {
            InnerTextBlock blockChanged = null;

            for (int i = 0; i < _blocks.Count; i++)
            {
                if (_blocks[i].CharStartIndex <= changeOffset && changeOffset <= _blocks[i].CharEndIndex + 1)
                {
                    blockChanged = _blocks[i];
                    break;
                }
            }

            if (blockChanged == null && changeOffset > 0)
            {
                blockChanged = _blocks.Last();
            }

            int fvline = blockChanged != null ? blockChanged.LineStartIndex : 0;
            int lvline = GetIndexOfLastVisibleLine();
            int fvchar = blockChanged != null ? blockChanged.CharStartIndex : 0;
            int lvchar = TextUtilities.GetLastCharIndexFromLineIndex(this.TextBox1.Text, lvline);

            if (blockChanged != null)
            {
                _blocks.RemoveRange(_blocks.IndexOf(blockChanged), _blocks.Count - _blocks.IndexOf(blockChanged));
            }

            int localLineCount = 1;
            int charStart      = fvchar;
            int lineStart      = fvline;

            for (int i = fvchar; i < this.TextBox1.Text.Length; i++)
            {
                if (this.TextBox1.Text[i] == '\n')
                {
                    localLineCount += 1;
                }
                if (i == this.TextBox1.Text.Length - 1)
                {
                    string blockText = this.TextBox1.Text.Substring(charStart);
                    var    block     = new InnerTextBlock(
                        charStart,
                        i, lineStart,
                        lineStart + TextUtilities.GetLineCount(blockText) - 1,
                        LineHeight);
                    block.RawText     = block.GetSubString(this.TextBox1.Text);
                    block.LineNumbers = getFormattedLineNumbers(block.LineStartIndex, block.LineEndIndex);
                    block.IsLast      = true;

                    foreach (InnerTextBlock b in _blocks)
                    {
                        if (b.LineStartIndex == block.LineStartIndex)
                        {
                            throw new Exception();
                        }
                    }

                    _blocks.Add(block);
                    formatBlock(block, _blocks.Count > 1 ? _blocks[_blocks.Count - 2] : null);
                    break;
                }
                if (localLineCount > _maxLineCountInBlock)
                {
                    var block = new InnerTextBlock(
                        charStart,
                        i,
                        lineStart,
                        lineStart + _maxLineCountInBlock - 1,
                        LineHeight);
                    block.RawText     = block.GetSubString(this.TextBox1.Text);
                    block.LineNumbers = getFormattedLineNumbers(block.LineStartIndex, block.LineEndIndex);

                    foreach (InnerTextBlock b in _blocks)
                    {
                        if (b.LineStartIndex == block.LineStartIndex)
                        {
                            throw new Exception();
                        }
                    }

                    _blocks.Add(block);
                    formatBlock(block, _blocks.Count > 1 ? _blocks[_blocks.Count - 2] : null);

                    charStart      = i + 1;
                    lineStart     += _maxLineCountInBlock;
                    localLineCount = 1;

                    if (i > lvchar)
                    {
                        break;
                    }
                }
            }
        }
コード例 #5
0
        private void updateBlocks()
        {
            if (_blocks.Count == 0)
                return;

            // While something is visible after last block...
            while (!_blocks.Last().IsLast && _blocks.Last().Position.Y + _blockHeight - this.TextBox1.VerticalOffset < ActualHeight)
            {
                int firstLineIndex = _blocks.Last().LineEndIndex + 1;
                int lastLineIndex = firstLineIndex + _maxLineCountInBlock - 1;
                lastLineIndex = lastLineIndex <= _totalLineCount - 1 ? lastLineIndex : _totalLineCount - 1;

                int charStart = _blocks.Last().CharEndIndex + 1;
                int lastCharIndex = TextUtilities.GetLastCharIndexFromLineIndex(this.TextBox1.Text, lastLineIndex); // to be optimized (forward search)

                if (lastCharIndex <= charStart)
                {
                    _blocks.Last().IsLast = true;
                    return;
                }

                var block = new InnerTextBlock(
                    charStart,
                    lastCharIndex,
                    _blocks.Last().LineEndIndex + 1,
                    lastLineIndex,
                    LineHeight);
                block.RawText = block.GetSubString(this.TextBox1.Text);
                block.LineNumbers = getFormattedLineNumbers(block.LineStartIndex, block.LineEndIndex);
                _blocks.Add(block);
                formatBlock(block, _blocks.Count > 1 ? _blocks[_blocks.Count - 2] : null);
            }
        }
コード例 #6
0
        private void invalidateBlocks(int changeOffset)
        {
            InnerTextBlock blockChanged = null;
            for (int i = 0; i < _blocks.Count; i++)
            {
                if (_blocks[i].CharStartIndex <= changeOffset && changeOffset <= _blocks[i].CharEndIndex + 1)
                {
                    blockChanged = _blocks[i];
                    break;
                }
            }

            if (blockChanged == null && changeOffset > 0)
                blockChanged = _blocks.Last();

            int fvline = blockChanged != null ? blockChanged.LineStartIndex : 0;
            int lvline = GetIndexOfLastVisibleLine();
            int fvchar = blockChanged != null ? blockChanged.CharStartIndex : 0;
            int lvchar = TextUtilities.GetLastCharIndexFromLineIndex(this.TextBox1.Text, lvline);

            if (blockChanged != null)
                _blocks.RemoveRange(_blocks.IndexOf(blockChanged), _blocks.Count - _blocks.IndexOf(blockChanged));

            int localLineCount = 1;
            int charStart = fvchar;
            int lineStart = fvline;
            for (int i = fvchar; i < this.TextBox1.Text.Length; i++)
            {
                if (this.TextBox1.Text[i] == '\n')
                {
                    localLineCount += 1;
                }
                if (i == this.TextBox1.Text.Length - 1)
                {
                    string blockText = this.TextBox1.Text.Substring(charStart);
                    var block = new InnerTextBlock(
                        charStart,
                        i, lineStart,
                        lineStart + TextUtilities.GetLineCount(blockText) - 1,
                        LineHeight);
                    block.RawText = block.GetSubString(this.TextBox1.Text);
                    block.LineNumbers = getFormattedLineNumbers(block.LineStartIndex, block.LineEndIndex);
                    block.IsLast = true;

                    foreach (InnerTextBlock b in _blocks)
                        if (b.LineStartIndex == block.LineStartIndex)
                            throw new Exception();

                    _blocks.Add(block);
                    formatBlock(block, _blocks.Count > 1 ? _blocks[_blocks.Count - 2] : null);
                    break;
                }
                if (localLineCount > _maxLineCountInBlock)
                {
                    var block = new InnerTextBlock(
                        charStart,
                        i,
                        lineStart,
                        lineStart + _maxLineCountInBlock - 1,
                        LineHeight);
                    block.RawText = block.GetSubString(this.TextBox1.Text);
                    block.LineNumbers = getFormattedLineNumbers(block.LineStartIndex, block.LineEndIndex);

                    foreach (InnerTextBlock b in _blocks)
                        if (b.LineStartIndex == block.LineStartIndex)
                            throw new Exception();

                    _blocks.Add(block);
                    formatBlock(block, _blocks.Count > 1 ? _blocks[_blocks.Count - 2] : null);

                    charStart = i + 1;
                    lineStart += _maxLineCountInBlock;
                    localLineCount = 1;

                    if (i > lvchar)
                        break;
                }
            }
        }
コード例 #7
0
 /// <summary>
 /// Formats and Highlights the text of a block.
 /// </summary>
 private void formatBlock(InnerTextBlock currentBlock, InnerTextBlock previousBlock)
 {
     currentBlock.FormattedText = GetFormattedText(currentBlock.RawText);
     var previousCode = previousBlock != null ? previousBlock.Code : -1;
     currentBlock.Code = getHighlighter().Highlight(currentBlock.FormattedText, previousCode);
 }