Пример #1
0
 private void DrawLine(VisualTextLine line) {
     if (line.Index < visuals.Count) {
         visuals.Insert(line.Index, line);
         visuals.RemoveAt(line.Index + 1);
         line.Draw();
     } else {
         visuals.Add(line);
         line.Draw();
     }
 }
Пример #2
0
        private void RedrawCollapsedLine(VisualTextLine collapsedLine, int line) {
            if (line >= visuals.Count) {
                visuals.Add(null);
            } else {
                visuals[line] = null;
            }

            visuals[line] = collapsedLine;

            collapsedLine.Draw();
        }
        public IEnumerable<VisualTextLine> GetLinesToRedrawAfterCollapse(IReadOnlyList<VisualTextLine> visuals, VisualTextLine collapsedLine, TextRange range) {
            var linesToRedraw = new List<VisualTextLine>();

            if (range.StartPosition.Line == range.EndPosition.Line) {
                return linesToRedraw;
            }

            var collapseEndLine = range.EndPosition.Line;

            for (int i = collapseEndLine + 1, newIndex = collapsedLine.Index + 1; i < visuals.Count; i++, newIndex++) {
                var line = visuals[i].CloneWithIndexChange(newIndex);

                linesToRedraw.Add(line);
            }

            return linesToRedraw;
        }
        private VisualTextLine GetPartialLineBeforeCollapse(IEnumerable<CharInfo> charInfos, VisualTextLine line, int startIndex, int count) {
            var collapseInfo = charInfos.First(info => !info.IsCharacter);
            var contents = line.RenderedText;
            var textBeforeCollapse = string.Empty;

            if (collapseInfo.PrevCharPosition.Column >= startIndex) {
                textBeforeCollapse = contents.Substring(startIndex, collapseInfo.PrevCharPosition.Column);
            } else {
                textBeforeCollapse = contents.Substring(startIndex);
            }

            var diff = 0;

            if (startIndex + count >= collapseInfo.NextCharPosition.Column) {
                diff = (startIndex + count) - collapseInfo.NextCharPosition.Column;
            }

            var textAfterCollapse = string.Join("", contents.Skip(collapseInfo.NextCharPosition.Column).Take(diff));

            return VisualTextLine.Create(textBeforeCollapse + textAfterCollapse, line.Index);
        }
        private VisualTextLine GetPartialLineAfterCollapse(VisualTextLine line, int startIndex, int count) {
            var firstPart = line.RenderedText.Substring(startIndex, count);

            return VisualTextLine.Create(firstPart, line.Index);
        }
        private VisualTextLine CutStandardLine(VisualTextLine line, int startIndex, int count) {
            var contents = line.GetStringContents()[0];
            var newText = string.Empty;

            if (startIndex + count == line.Length) {
                newText = contents.Substring(startIndex);
            } else {
                newText = contents.Substring(startIndex, count - startIndex);
            }

            return VisualTextLine.Create(newText, line.Index);
        }
        private VisualTextLine Cut(VisualTextLine line, int startIndex, int? count = null) {
            var substringLength = count == null ? line.Length - startIndex : count.Value;

            if (line is CollapsedVisualTextLine) {
                var charInfos = Enumerable.Range(startIndex, substringLength).Select(index => line.GetCharInfoAt(index));

                if (charInfos.Any(info => !info.IsCharacter)) {
                    return GetPartialLineBeforeCollapse(charInfos, line, startIndex, substringLength);
                } else {
                    return GetPartialLineAfterCollapse(line, startIndex, substringLength);
                }                
            } else {
                return CutStandardLine(line, startIndex, substringLength);
            }
        }
        private int[] GetCollapseSelectionRange(TextPosition clickPosition, VisualTextLine activeLine, int lineLength) {
            var startColumn = clickPosition.Column;
            var endColumn = clickPosition.Column;

            if (endColumn + 1 <= lineLength) {
                endColumn += 1;
            } else {
                startColumn -= 1;
            }
            // move left from current position
            for (var i = clickPosition.Column; i >= 0; i--) {
                var charInfo = activeLine.GetCharInfoAt(i);

                if (!charInfo.IsCharacter && !char.IsLetterOrDigit(charInfo.Text[0])) {
                    startColumn = i;
                } else {
                    break;
                }
            }
            // move right from current position
            for (var i = clickPosition.Column; i < lineLength; i++) {
                var charInfo = activeLine.GetCharInfoAt(i);

                if (!charInfo.IsCharacter && !char.IsLetterOrDigit(charInfo.Text[0])) {
                    endColumn = i + 1;
                } else {
                    break;
                }
            }

            return new[] { startColumn, endColumn };
        }