private LayoutSpan FindSpan(Point ptClient, LayoutLine line) { foreach (var span in line.Spans) { if (span.ContentExtent.Contains(ptClient)) { return(span); } } return(null); }
private RectangleF SpanPositionToClient(Graphics g, TextPointer pos, LayoutLine line, StyleStack styleStack) { var iSpan = pos.Span; if (iSpan < 0 || iSpan >= line.Spans.Length) { return(line.Extent); } var span = line.Spans[iSpan]; return(CharPositionToClient(g, pos, span, styleStack)); }
public void AddLayoutLine(LineSpan line, ref RectangleF rcLine /* put in state */) { float cyLine = MeasureLineHeight(line); rcLine.Height = cyLine; var spans = ComputeSpanLayouts(line.TextSpans, rcLine); var ll = new LayoutLine(line.Position) { Extent = LineExtent(rcLine, spans), Spans = spans, }; this.visibleLines.Add(rcLine.Top, ll); rcLine.Offset(0, cyLine); }
private TextPointer FindSpanPosition(Graphics g, Point ptClient, LayoutLine line, StyleStack styleStack) { int iSpan = 0; foreach (var span in line.Spans) { if (span.ContentExtent.Contains(ptClient)) { int iChar = GetCharPosition(g, ptClient, span, styleStack); return(new TextPointer(line.Position, iSpan, iChar)); } ++iSpan; } return(new TextPointer(line.Position, iSpan, 0)); }
private void PaintLine(LayoutLine line) { this.line = line; // Paint the last piece of the line RectangleF rcTrailer = line.Extent; float xMax = 0; if (line.Spans.Length > 0) { xMax = line.Spans[line.Spans.Length - 1].ContentExtent.Right; } var cx = extent.Width - xMax; if (cx > 0) { rcTrailer.X = xMax; rcTrailer.Width = cx; graphics.FillRectangle( styleStack.GetBackground(defaultBgColor), rcTrailer); } for (int iSpan = 0; iSpan < line.Spans.Length; ++iSpan) { this.span = line.Spans[iSpan]; this.styleStack.PushStyle(span.Style); var pos = new TextPointer(line.Position, iSpan, 0); var insideSelection = outer.ComparePositions(selStart, pos) <= 0 && outer.ComparePositions(pos, selEnd) < 0; this.fg = styleStack.GetForegroundColor(defaultFgColor); this.bg = styleStack.GetBackground(defaultBgColor); this.font = styleStack.GetFont(defaultFont); this.rcContent = span.ContentExtent; this.rcTotal = span.PaddedExtent; if (!insideSelection) { if (selStart.Line == line.Position && selStart.Span == iSpan) { // Selection starts inside the current span. Write // any unselected text first. if (selStart.Character > 0) { DrawTextSegment(0, selStart.Character, false); } if (selEnd.Line == line.Position && selEnd.Span == iSpan) { // Selection ends inside the current span. Write // selected text. DrawTextSegment(selStart.Character, selEnd.Character - selStart.Character, true); DrawTrailingTextSegment(selEnd.Character, false); } else { // Select all the way to the end of the span. DrawTrailingTextSegment(selStart.Character, true); } } else { // Not in selection at all. DrawText(span.Text, false); } } else { // Inside selection. Does it end? if (selEnd.Line == line.Position && selEnd.Span == iSpan) { // Selection ends inside the current span. Write // selected text. DrawTextSegment(0, selEnd.Character, true); DrawTrailingTextSegment(selEnd.Character, false); } else { DrawText(span.Text, true); } } #if DEBUG var text = span.Text; if (line.Position == selStart.Line && iSpan == selStart.Span) { var textFrag = text.Substring(0, selStart.Character); var sz = outer.MeasureText(graphics, textFrag, font); graphics.FillRectangle( Brushes.Red, span.ContentExtent.Left + sz.Width, line.Extent.Top, 1, line.Extent.Height); } if (line.Position == selEnd.Line && iSpan == selEnd.Span) { var textFrag = text.Substring(0, selEnd.Character); var sz = outer.MeasureText(graphics, textFrag, font); graphics.FillRectangle( Brushes.Blue, span.ContentExtent.Left + sz.Width, line.Extent.Top, 1, line.Extent.Height); } #endif styleStack.PopStyle(); } }