internal protected override void Draw (Cairo.Context cr, Cairo.Rectangle area, LineSegment lineSegment, int line, double x, double y, double lineHeight) { cr.MoveTo (x + 0.5, y); cr.LineTo (x + 0.5, y + lineHeight); cr.Color = color; cr.Stroke (); }
public static int RemoveTabInLine (TextEditorData data, LineSegment line) { if (line.Length == 0) return 0; char ch = data.Document.GetCharAt (line.Offset); if (ch == '\t') { data.Remove (line.Offset, 1); return 1; } else if (ch == ' ') { int removeCount = 0; for (int i = 0; i < data.Options.IndentationSize;) { ch = data.Document.GetCharAt (line.Offset + i); if (ch == ' ') { removeCount ++; i++; } else if (ch == '\t') { removeCount ++; i += data.Options.TabSize; } else { break; } } data.Remove (line.Offset, removeCount); return removeCount; } return 0; }
public bool RemoveLine (LineSegment line) { if (!lineWidthDictionary.ContainsKey (line)) return false; lineWidthDictionary.Remove (line); return true; }
//(MonoDevelop.Projects.Dom.Error info, LineSegment line) //StyleTextMarker marker; public HoverMarker(LineSegment line,int startOffset, int endOffset) { this.Line = line; // may be null if no line is assigned to the error. //string underlineColor; = Mono.TextEditor.Highlighting.Style.WarningUnderlineString; marker = new UsageMarker (startOffset,endOffset); }
public void DrawIcon (Mono.TextEditor.TextEditor editor, Cairo.Context cr, LineSegment line, int lineNumber, double x, double y, double width, double height) { double size; if (width > height) { x += (width - height) / 2; size = height; } else { y += (height - width) / 2; size = width; } DrawIcon (cr, x, y, size); }
public override void Analyze (Document doc, LineSegment line, Chunk startChunk, int startOffset, int endOffset) { if (endOffset <= startOffset || startOffset >= doc.Length) return; string text = doc.GetTextAt (startOffset, endOffset - startOffset); int startColumn = startOffset - line.Offset; line.RemoveMarker (typeof(UrlMarker)); foreach (System.Text.RegularExpressions.Match m in urlRegex.Matches (text)) { line.AddMarker (new UrlMarker (line, m.Value, UrlType.Url, syntax, startColumn + m.Index, startColumn + m.Index + m.Length)); } foreach (System.Text.RegularExpressions.Match m in mailRegex.Matches (text)) { line.AddMarker (new UrlMarker (line, m.Value, UrlType.Email, syntax, startColumn + m.Index, startColumn + m.Index + m.Length)); } }
public void DrawIcon (Mono.TextEditor.TextEditor editor, Gdk.Drawable win, LineSegment line, int lineNumber, int x, int y, int width, int height) { int size; if (width > height) { x += (width - height) / 2; size = height; } else { y += (height - width) / 2; size = width; } using (Cairo.Context cr = Gdk.CairoHelper.Create (win)) { DrawIcon (cr, x, y, size); } }
//(MonoDevelop.Projects.Dom.Error info, LineSegment line) public ErrorMarker(LineSegment line) { //this.Info = info; this.Line = line; // may be null if no line is assigned to the error. string underlineColor; //if (info.ErrorType == ErrorType.Warning) // underlineColor = Mono.TextEditor.Highlighting.Style.WarningUnderlineString; //else underlineColor = Mono.TextEditor.Highlighting.Style.ErrorUnderlineString; marker = new UnderlineMarker (underlineColor, - 1, line.Length-1); //if (Info.Region.Start.Line == info.Region.End.Line) // marker = new UnderlineMarker (underlineColor, Info.Region.Start.Column - 1, info.Region.End.Column - 1); //else // marker = new UnderlineMarker (underlineColor, - 1, - 1); }
public override void Analyze (TextDocument doc, LineSegment line, Chunk startChunk, int startOffset, int endOffset) { if (endOffset <= startOffset || startOffset >= doc.TextLength || inUpdate) return; inUpdate = true; try { string text = doc.GetTextAt (startOffset, endOffset - startOffset); int startColumn = startOffset - line.Offset; var markers = new List <UrlMarker> (line.Markers.Where (m => m is UrlMarker).Cast<UrlMarker> ()); markers.ForEach (m => doc.RemoveMarker (m, false)); foreach (System.Text.RegularExpressions.Match m in UrlRegex.Matches (text)) { doc.AddMarker (line, new UrlMarker (doc, line, m.Value, UrlType.Url, syntax, startColumn + m.Index, startColumn + m.Index + m.Length), false); } foreach (System.Text.RegularExpressions.Match m in MailRegex.Matches (text)) { doc.AddMarker (line, new UrlMarker (doc, line, m.Value, UrlType.Email, syntax, startColumn + m.Index, startColumn + m.Index + m.Length), false); } } finally { inUpdate = false; } }
public void DrawIcon (TextEditor editor, Cairo.Context cr, LineSegment lineSegment, int lineNumber, double x, double y, double width, double height) { if (lineSegment.IsBookmarked) { Cairo.Color color1 = editor.ColorStyle.BookmarkColor1; Cairo.Color color2 = editor.ColorStyle.BookmarkColor2; DrawRoundRectangle (cr, x + 1, y + 1, 8, width - 4, height - 4); Cairo.Gradient pat = new Cairo.LinearGradient (x + width / 4, y, x + width / 2, y + height - 4); pat.AddColorStop (0, color1); pat.AddColorStop (1, color2); cr.Pattern = pat; cr.FillPreserve (); pat = new Cairo.LinearGradient (x, y + height, x + width, y); pat.AddColorStop (0, color2); //pat.AddColorStop (1, color1); cr.Pattern = pat; cr.Stroke (); } }
public void DrawIcon (TextEditor editor, Gdk.Drawable win, LineSegment lineSegment, int lineNumber, int x, int y, int width, int height) { if (lineSegment.IsBookmarked) { Cairo.Color color1 = Style.ToCairoColor (editor.ColorStyle.BookmarkColor1); Cairo.Color color2 = Style.ToCairoColor (editor.ColorStyle.BookmarkColor2); Cairo.Context cr = Gdk.CairoHelper.Create (win); DrawRoundRectangle (cr, x + 1, y + 1, 8, width - 4, height - 4); Cairo.Gradient pat = new Cairo.LinearGradient (x + width / 4, y, x + width / 2, y + height - 4); pat.AddColorStop (0, color1); pat.AddColorStop (1, color2); cr.Pattern = pat; cr.FillPreserve (); pat = new Cairo.LinearGradient (x, y + height, x + width, y); pat.AddColorStop (0, color2); //pat.AddColorStop (1, color1); cr.Pattern = pat; cr.Stroke (); ((IDisposable)cr).Dispose(); } }
public double GetLineHeight (LineSegment line) { if (line == null) return LineHeight; foreach (var marker in line.Markers) { IExtendingTextMarker extendingTextMarker = marker as IExtendingTextMarker; if (extendingTextMarker == null) continue; return extendingTextMarker.GetLineHeight (textEditor); } int lineNumber = textEditor.OffsetToLineNumber (line.Offset); var node = textEditor.GetTextEditorData ().HeightTree.GetNodeByLine (lineNumber); if (node == null) return LineHeight; return node.height / node.count; }
void GetSelectionOffsets (LineSegment line, out int selectionStart, out int selectionEnd) { selectionStart = -1; selectionEnd = -1; if (textEditor.IsSomethingSelected) { TextSegment segment = textEditor.SelectionRange; selectionStart = segment.Offset; selectionEnd = segment.EndOffset; if (textEditor.SelectionMode == SelectionMode.Block) { DocumentLocation start = textEditor.MainSelection.Anchor; DocumentLocation end = textEditor.MainSelection.Lead; DocumentLocation visStart = textEditor.LogicalToVisualLocation (start); DocumentLocation visEnd = textEditor.LogicalToVisualLocation (end); int lineOffset = line.Offset; int lineNumber = Document.OffsetToLineNumber (lineOffset); if (textEditor.MainSelection.MinLine <= lineNumber && lineNumber <= textEditor.MainSelection.MaxLine) { selectionStart = lineOffset + line.GetLogicalColumn (this.textEditor.GetTextEditorData (), System.Math.Min (visStart.Column, visEnd.Column)) - 1; selectionEnd = lineOffset + line.GetLogicalColumn (this.textEditor.GetTextEditorData (), System.Math.Max (visStart.Column, visEnd.Column)) - 1; } } } }
internal protected override void MouseHover (MarginMouseEventArgs args) { base.MouseHover (args); LineSegment lineSegment = null; if (args.LineSegment != null) { lineSegment = args.LineSegment; if (lineHover != lineSegment) { lineHover = lineSegment; editor.RedrawMargin (this); } } lineHover = lineSegment; bool found = false; foreach (FoldSegment segment in editor.Document.GetFoldingContaining (lineSegment)) { if (segment.StartLine.Offset == lineSegment.Offset) { found = true; break; } } delayTimer.Stop (); if (found) { foldings = editor.Document.GetFoldingContaining (lineSegment); if (editor.TextViewMargin.BackgroundRenderer == null) { delayTimer.Start (); } else { DelayTimerElapsed (this, null); } } else { RemoveBackgroundRenderer (); } }
public string GetLineIndent(LineSegment segment) { return(Document.GetLineIndent(segment)); }
public void DrawIcon (Mono.TextEditor.TextEditor editor, Cairo.Context cr, LineSegment line, int lineNumber, double x, double y, double width, double height) { if (DebuggingService.IsDebugging) return; // TODO: // win.DrawPixbuf (editor.Style.BaseGC (Gtk.StateType.Normal), errors.Any (e => e.IsError) ? errorPixbuf : warningPixbuf, 0, 0, x + (width - errorPixbuf.Width) / 2, y + (height - errorPixbuf.Height) / 2, errorPixbuf.Width, errorPixbuf.Height, Gdk.RgbDither.None, 0, 0); }
void RemoveDebugMarkers () { if (currentLineSegment != null) { widget.TextEditor.Document.RemoveMarker (currentDebugLineMarker); currentLineSegment = null; } if (debugStackSegment != null) { widget.TextEditor.Document.RemoveMarker (debugStackLineMarker); debugStackSegment = null; } }
public LayoutWrapper CreateLinePartLayout (ISyntaxMode mode, LineSegment line, int logicalRulerColumn, int offset, int length, int selectionStart, int selectionEnd) { bool containsPreedit = textEditor.ContainsPreedit (offset, length); LayoutDescriptor descriptor; if (!containsPreedit && layoutDict.TryGetValue (line, out descriptor)) { bool isInvalid; if (descriptor.Equals (line, offset, length, selectionStart, selectionEnd, out isInvalid) && descriptor.Layout != null) { return descriptor.Layout; } descriptor.Dispose (); layoutDict.Remove (line); } var wrapper = new LayoutWrapper (PangoUtil.CreateLayout (textEditor)); wrapper.IsUncached = containsPreedit; if (logicalRulerColumn < 0) logicalRulerColumn = line.GetLogicalColumn (textEditor.GetTextEditorData (), textEditor.Options.RulerColumn); var atts = new FastPangoAttrList (); wrapper.Layout.Alignment = Pango.Alignment.Left; wrapper.Layout.FontDescription = textEditor.Options.Font; wrapper.Layout.Tabs = tabArray; StringBuilder textBuilder = new StringBuilder (); var chunks = GetCachedChunks (mode, Document, textEditor.ColorStyle, line, offset, length); foreach (var chunk in chunks) { try { textBuilder.Append (Document.GetTextAt (chunk)); } catch { Console.WriteLine (chunk); } } var spanStack = line.StartSpan; int lineOffset = line.Offset; string lineText = textBuilder.ToString (); uint preeditLength = 0; if (containsPreedit) { lineText = lineText.Insert (textEditor.preeditOffset - offset, textEditor.preeditString); preeditLength = (uint)textEditor.preeditString.Length; } char[] lineChars = lineText.ToCharArray (); //int startOffset = offset, endOffset = offset + length; uint curIndex = 0, byteIndex = 0; uint curChunkIndex = 0, byteChunkIndex = 0; uint oldEndIndex = 0; foreach (Chunk chunk in chunks) { ChunkStyle chunkStyle = chunk != null ? textEditor.ColorStyle.GetChunkStyle (chunk) : null; spanStack = chunk.SpanStack ?? spanStack; foreach (TextMarker marker in line.Markers) chunkStyle = marker.GetStyle (chunkStyle); if (chunkStyle != null) { //startOffset = chunk.Offset; //endOffset = chunk.EndOffset; uint startIndex = (uint)(oldEndIndex); uint endIndex = (uint)(startIndex + chunk.Length); oldEndIndex = endIndex; HandleSelection (lineOffset, logicalRulerColumn, selectionStart, selectionEnd, chunk.Offset, chunk.EndOffset, delegate(int start, int end) { if (containsPreedit) { if (textEditor.preeditOffset < start) start += (int)preeditLength; if (textEditor.preeditOffset < end) end += (int)preeditLength; } var si = TranslateToUTF8Index (lineChars, (uint)(startIndex + start - chunk.Offset), ref curIndex, ref byteIndex); var ei = TranslateToUTF8Index (lineChars, (uint)(startIndex + end - chunk.Offset), ref curIndex, ref byteIndex); atts.AddForegroundAttribute (chunkStyle.Color, si, ei); if (!chunkStyle.TransparentBackround && GetPixel (ColorStyle.Default.BackgroundColor) != GetPixel (chunkStyle.BackgroundColor)) { wrapper.AddBackground (chunkStyle.CairoBackgroundColor, (int)si, (int)ei); } else if (chunk.SpanStack != null && ColorStyle != null) { foreach (var span in chunk.SpanStack) { if (span == null) continue; var spanStyle = ColorStyle.GetChunkStyle (span.Color); if (!spanStyle.TransparentBackround && GetPixel (ColorStyle.Default.BackgroundColor) != GetPixel (spanStyle.BackgroundColor)) { wrapper.AddBackground (spanStyle.CairoBackgroundColor, (int)si, (int)ei); break; } } } }, delegate(int start, int end) { if (containsPreedit) { if (textEditor.preeditOffset < start) start += (int)preeditLength; if (textEditor.preeditOffset < end) end += (int)preeditLength; } var si = TranslateToUTF8Index (lineChars, (uint)(startIndex + start - chunk.Offset), ref curIndex, ref byteIndex); var ei = TranslateToUTF8Index (lineChars, (uint)(startIndex + end - chunk.Offset), ref curIndex, ref byteIndex); atts.AddForegroundAttribute (SelectionColor.Color, si, ei); if (!wrapper.StartSet) wrapper.SelectionStartIndex = (int)si; wrapper.SelectionEndIndex = (int)ei; }); var translatedStartIndex = TranslateToUTF8Index (lineChars, (uint)startIndex, ref curChunkIndex, ref byteChunkIndex); var translatedEndIndex = TranslateToUTF8Index (lineChars, (uint)endIndex, ref curChunkIndex, ref byteChunkIndex); if (chunkStyle.Bold) atts.AddWeightAttribute (Pango.Weight.Bold, translatedStartIndex, translatedEndIndex); if (chunkStyle.Italic) atts.AddStyleAttribute (Pango.Style.Italic, translatedStartIndex, translatedEndIndex); if (chunkStyle.Underline) atts.AddUnderlineAttribute (Pango.Underline.Single, translatedStartIndex, translatedEndIndex); } } if (containsPreedit) { var si = TranslateToUTF8Index (lineChars, (uint)(textEditor.preeditOffset - offset), ref curIndex, ref byteIndex); var ei = TranslateToUTF8Index (lineChars, (uint)(textEditor.preeditOffset - offset + preeditLength), ref curIndex, ref byteIndex); atts.Splice (textEditor.preeditAttrs, (int)si, (int)(ei - si)); } wrapper.LineChars = lineChars; wrapper.Layout.SetText (lineText); wrapper.EolSpanStack = spanStack; atts.AssignTo (wrapper.Layout); atts.Dispose (); int w, h; wrapper.Layout.GetSize (out w, out h); wrapper.PangoWidth = w; selectionStart = System.Math.Max (line.Offset - 1, selectionStart); selectionEnd = System.Math.Min (line.EndOffsetIncludingDelimiter + 1, selectionEnd); descriptor = new LayoutDescriptor (line, offset, length, wrapper, selectionStart, selectionEnd); if (!containsPreedit) layoutDict[line] = descriptor; return wrapper; }
internal protected override void Draw(Cairo.Context cr, Cairo.Rectangle area, LineSegment lineSegment, int line, double x, double y, double lineHeight) { cr.MoveTo(x + 0.5, y); cr.LineTo(x + 0.5, y + lineHeight); cr.Color = color; cr.Stroke(); }
int FindNextWordOffset(Document doc, int offset, bool subword) { int lineNumber = doc.OffsetToLineNumber(offset); LineSegment line = doc.GetLine(lineNumber); if (line == null) { return(offset); } int result = offset; int endOffset = line.Offset + line.EditableLength; if (result == endOffset) { line = doc.GetLine(lineNumber + 1); if (line != null) { result = line.Offset; } return(result); } CharacterClass current = GetCharacterClass(doc.GetCharAt(result), subword, false); while (result < endOffset) { CharacterClass next = GetCharacterClass(doc.GetCharAt(result), subword, false); if (next != current) { // camelCase and PascalCase handling bool camelSkip = false; if (next == CharacterClass.LowercaseLetter && current == CharacterClass.UppercaseLetter) { if (result - 2 > line.Offset) { CharacterClass previous = GetCharacterClass(doc.GetCharAt(result - 2), subword, false); if (previous == CharacterClass.UppercaseLetter && result - 2 > offset) { result--; } else { camelSkip = true; } } } if (!camelSkip) { break; } } current = next; result++; } while (result < endOffset && GetCharacterClass(doc.GetCharAt(result), subword, false) == CharacterClass.Whitespace) { result++; } return(result); }
public LayoutDescriptor (LineSegment line, int offset, int length, LayoutWrapper layout, int selectionStart, int selectionEnd) : base(line, offset, length) { this.Layout = layout; if (selectionEnd >= 0) { this.SelectionStart = selectionStart; this.SelectionEnd = selectionEnd; } }
public void Draw(Cairo.Context cr, Cairo.Rectangle area, LineSegment lineSegment, double x, double y, double lineHeight) { int foundSegment = -1; if (lineSegment != null) { for (int i = 0; i < foldSegments.Count; i++) { FoldSegment segment = foldSegments[i]; if (segment.StartLine.Offset <= lineSegment.Offset && lineSegment.EndOffset <= segment.EndLine.EndOffset) { foundSegment = i; roles[i] = Roles.Between; if (segment.StartLine.Offset == lineSegment.Offset) { roles[i] |= Roles.Start; if (segment.IsFolded) { roles[i] |= Roles.End; } } if (segment.EndLine.Offset == lineSegment.Offset) { roles[i] |= Roles.End; } } } } TextViewMargin textViewMargin = editor.TextViewMargin; SyntaxMode mode = Document.SyntaxMode != null && editor.Options.EnableSyntaxHighlighting ? Document.SyntaxMode : SyntaxMode.Default; // Gdk.Rectangle lineArea = new Gdk.Rectangle (textViewMargin.XOffset, y, editor.Allocation.Width - textViewMargin.XOffset, editor.LineHeight); // Gdk.GC gc = new Gdk.GC (drawable); TextViewMargin.LayoutWrapper lineLayout = null; double brightness = HslColor.Brightness(editor.ColorStyle.Default.BackgroundColor); int colorCount = foldSegments.Count + 2; for (int segment = -1; segment <= foundSegment; segment++) { HslColor hslColor = new HslColor(editor.ColorStyle.Default.BackgroundColor); int colorPosition = segment + 1; if (segment == foldSegments.Count - 1) { colorPosition += 2; } if (brightness < 0.5) { hslColor.L = hslColor.L * 0.81 + hslColor.L * 0.25 * (colorCount - colorPosition) / colorCount; } else { hslColor.L = hslColor.L * 0.86 + hslColor.L * 0.1 * colorPosition / colorCount; } Roles role = Roles.Between; double xPos = textViewMargin.XOffset; double rectangleWidth = editor.Allocation.Width - xPos; if (segment >= 0) { LineSegment segmentStartLine = foldSegments[segment].StartLine; lineLayout = textViewMargin.CreateLinePartLayout(mode, segmentStartLine, segmentStartLine.Offset, segmentStartLine.EditableLength, -1, -1); Pango.Rectangle rectangle = lineLayout.Layout.IndexToPos(GetFirstNonWsIdx(lineLayout.Layout.Text)); xPos = System.Math.Max(textViewMargin.XOffset, (textViewMargin.XOffset + rectangle.X / Pango.Scale.PangoScale - editor.HAdjustment.Value)); LineSegment segmentEndLine = foldSegments[segment].EndLine; lineLayout = textViewMargin.CreateLinePartLayout(mode, segmentEndLine, segmentEndLine.Offset, segmentEndLine.EditableLength, -1, -1); rectangle = lineLayout.Layout.IndexToPos(GetFirstNonWsIdx(lineLayout.Layout.Text)); xPos = System.Math.Min(xPos, System.Math.Max(textViewMargin.XOffset, (textViewMargin.XOffset + rectangle.X / Pango.Scale.PangoScale - editor.HAdjustment.Value))); int width = editor.Allocation.Width; if (editor.HAdjustment.Upper > width) { width = (int)(textViewMargin.XOffset + editor.HAdjustment.Upper - editor.HAdjustment.Value); } rectangleWidth = (int)(width - xPos - 6 * (segment + 1)); role = roles[segment]; } DrawRoundRectangle(cr, (role & Roles.Start) == Roles.Start, (role & Roles.End) == Roles.End, xPos, y, editor.LineHeight / 2, rectangleWidth, lineHeight); cr.Color = ColorSheme.ToCairoColor(hslColor); cr.Fill(); /* if (segment == foldSegments.Count - 1) { * cr.Color = new Cairo.Color (0.5, 0.5, 0.5, 1); * cr.Stroke (); * }*/ if (lineLayout != null && lineLayout.IsUncached) { lineLayout.Dispose(); lineLayout = null; } } // gc.Dispose (); }
int FindPrevWordOffset(Document doc, int offset, bool subword) { int lineNumber = doc.OffsetToLineNumber(offset); LineSegment line = doc.GetLine(lineNumber); if (line == null) { return(offset); } int result = offset; if (result == line.Offset) { line = doc.GetLine(lineNumber - 1); if (line != null) { result = line.Offset + line.EditableLength; } return(result); } CharacterClass current = GetCharacterClass(doc.GetCharAt(result - 1), subword, false); if (current == CharacterClass.Whitespace && result - 1 > line.Offset) { result--; current = GetCharacterClass(doc.GetCharAt(result - 2), subword, false); } while (result > line.Offset) { CharacterClass prev = GetCharacterClass(doc.GetCharAt(result - 1), subword, false); if (prev != current) { // camelCase and PascalCase handling bool camelSkip = false; if (prev == CharacterClass.UppercaseLetter && current == CharacterClass.LowercaseLetter) { if (result - 2 > line.Offset) { CharacterClass back2 = GetCharacterClass(doc.GetCharAt(result - 2), subword, false); if (back2 == CharacterClass.UppercaseLetter) { result--; } else { camelSkip = true; } } } if (!camelSkip) { break; } } current = prev; result--; } return(result); }
public void CalculateLineStarts(out double x1, out double x2, out double delta) { TextEditor editor = mode.editor; LineSegment lineAbove = editor.Document.GetLine(mode.CurrentInsertionPoint.Line - 1); LineSegment lineBelow = editor.Document.GetLine(mode.CurrentInsertionPoint.Line); double aboveStart = 0, aboveEnd = editor.TextViewMargin.XOffset; double /*belowStart = 0,*/ belowEnd = editor.TextViewMargin.XOffset; int l = 0, tmp; if (lineAbove != null) { var wrapper = editor.TextViewMargin.GetLayout(lineAbove); wrapper.Layout.IndexToLineX(lineAbove.GetIndentation(editor.Document).Length, true, out l, out tmp); aboveStart = tmp / Pango.Scale.PangoScale; aboveEnd = wrapper.PangoWidth / Pango.Scale.PangoScale; if (wrapper.IsUncached) { wrapper.Dispose(); } } if (lineBelow != null) { var wrapper = editor.TextViewMargin.GetLayout(lineBelow); int index = lineAbove != null?lineAbove.GetIndentation(editor.Document).Length : 0; if (index == 0) { tmp = 0; } else if (index >= lineBelow.EditableLength) { tmp = wrapper.PangoWidth; } else { wrapper.Layout.IndexToLineX(index, true, out l, out tmp); } //belowStart = tmp / Pango.Scale.PangoScale; belowEnd = wrapper.PangoWidth / Pango.Scale.PangoScale; if (wrapper.IsUncached) { wrapper.Dispose(); } } delta = editor.LineHeight / 3; x1 = editor.TextViewMargin.XOffset - editor.HAdjustment.Value; x2 = x1; if (aboveStart < belowEnd) { //x1 += aboveStart; x2 += belowEnd; } else if (aboveStart > belowEnd) { delta *= -1; //x1 += belowEnd; x2 += aboveStart; } else { //x1 += System.Math.Min (aboveStart, belowStart); x2 += System.Math.Max(aboveEnd, belowEnd); if (x1 == x2) { x2 += 50; } } }
protected LineDescriptor (LineSegment line, int offset, int length) { this.Offset = offset; this.Length = length; this.MarkerLength = line.MarkerCount; this.Spans = line.StartSpan; }
void CalculateLineFit (TextEditor editor, LineSegment lineSegment) { KeyValuePair<int, int> textSize; if (!lineWidthDictionary.TryGetValue (lineSegment, out textSize)) { Pango.Layout textLayout = editor.TextViewMargin.GetLayout (lineSegment).Layout; int textWidth, textHeight; textLayout.GetPixelSize (out textWidth, out textHeight); textSize = new KeyValuePair<int, int> (textWidth, textHeight); if (textWidthDictionary.Count > 10000) textWidthDictionary.Clear (); lineWidthDictionary[lineSegment] = textSize; } EnsureLayoutCreated (editor); fitsInSameLine = editor.TextViewMargin.XOffset + textSize.Key + LayoutWidth + errorPixbuf.Width + border + editor.LineHeight / 2 < editor.Allocation.Width; }
public bool Equals (LineSegment line, int offset, int length, out bool isInvalid) { isInvalid = MarkerLength != line.MarkerCount || !line.StartSpan.Equals (Spans); return offset == Offset && Length == length && !isInvalid; }
internal protected abstract void Draw(Cairo.Context cr, Cairo.Rectangle area, LineSegment line, int lineNumber, double x, double y, double lineHeight);
public bool Equals (LineSegment line, int offset, int length, int selectionStart, int selectionEnd, out bool isInvalid) { int selStart = 0, selEnd = 0; if (selectionEnd >= 0) { selStart = selectionStart; selEnd = selectionEnd; } return base.Equals (line, offset, length, out isInvalid) && selStart == this.SelectionStart && selEnd == this.SelectionEnd; }
protected void InsertCharacter(uint unicodeKey) { if (!textEditorData.CanEdit(Data.Caret.Line)) { return; } HideMouseCursor(); Document.BeginAtomicUndo(); textEditorData.DeleteSelectedText(textEditorData.IsSomethingSelected ? textEditorData.MainSelection.SelectionMode != SelectionMode.Block : true); char ch = (char)unicodeKey; if (!char.IsControl(ch) && textEditorData.CanEdit(Caret.Line)) { LineSegment line = Document.GetLine(Caret.Line); if (Caret.IsInInsertMode || Caret.Column >= line.EditableLength + 1) { string text = Caret.Column > line.EditableLength + 1 ? textEditorData.GetVirtualSpaces(Caret.Line, Caret.Column) + ch.ToString() : ch.ToString(); if (textEditorData.IsSomethingSelected && textEditorData.MainSelection.SelectionMode == SelectionMode.Block) { int length = 0; for (int lineNumber = textEditorData.MainSelection.MinLine; lineNumber <= textEditorData.MainSelection.MaxLine; lineNumber++) { length = textEditorData.Insert(textEditorData.Document.GetLine(lineNumber).Offset + Caret.Column - 1, text); } Caret.PreserveSelection = true; Caret.Column += length - 1; textEditorData.MainSelection.Lead = new DocumentLocation(textEditorData.MainSelection.Lead.Line, Caret.Column + 1); textEditorData.MainSelection.Anchor = new DocumentLocation(textEditorData.MainSelection.Anchor.Line, Caret.Column + 1); Document.CommitMultipleLineUpdate(textEditorData.MainSelection.MinLine, textEditorData.MainSelection.MaxLine); } else { int length = textEditorData.Insert(Caret.Offset, text); Caret.Column += length - 1; } } else { int length = textEditorData.Replace(Caret.Offset, 1, ch.ToString()); if (length > 1) { Caret.Offset += length - 1; } } // That causes unnecessary redraws: // bool autoScroll = Caret.AutoScrollToCaret; Caret.Column++; if (Caret.PreserveSelection) { Caret.PreserveSelection = false; } // Caret.AutoScrollToCaret = autoScroll; // if (autoScroll) // Editor.ScrollToCaret (); // Document.RequestUpdate (new LineUpdate (Caret.Line)); // Document.CommitDocumentUpdate (); } Document.EndAtomicUndo(); Document.OptimizeTypedUndo(); }
public void RemoveCachedLine (LineSegment line) { if (line == null) return; LayoutDescriptor descriptor; if (layoutDict.TryGetValue (line, out descriptor)) { descriptor.Dispose (); layoutDict.Remove (line); } ChunkDescriptor chunkDesriptor; if (chunkDict.TryGetValue (line, out chunkDesriptor)) { chunkDict.Remove (line); } }
internal protected override void Draw(Cairo.Context cr, Cairo.Rectangle area, LineSegment lineSegment, int line, double x, double y, double lineHeight) { foldSegmentSize = marginWidth * 4 / 6; foldSegmentSize -= (foldSegmentSize) % 2; Cairo.Rectangle drawArea = new Cairo.Rectangle(x, y, marginWidth, lineHeight); Document.LineState state = editor.Document.GetLineState(line); bool isFoldStart = false; bool isContaining = false; bool isFoldEnd = false; bool isStartSelected = false; bool isContainingSelected = false; bool isEndSelected = false; if (line <= editor.Document.LineCount) { startFoldings.Clear(); containingFoldings.Clear(); endFoldings.Clear(); foreach (FoldSegment segment in editor.Document.GetFoldingContaining(lineSegment)) { if (segment.StartLine.Offset == lineSegment.Offset) { startFoldings.Add(segment); } else if (segment.EndLine.Offset == lineSegment.Offset) { endFoldings.Add(segment); } else { containingFoldings.Add(segment); } } isFoldStart = startFoldings.Count > 0; isContaining = containingFoldings.Count > 0; isFoldEnd = endFoldings.Count > 0; isStartSelected = this.lineHover != null && IsMouseHover(startFoldings); isContainingSelected = this.lineHover != null && IsMouseHover(containingFoldings); isEndSelected = this.lineHover != null && IsMouseHover(endFoldings); } var bgGC = foldBgGC; if (editor.TextViewMargin.BackgroundRenderer != null) { if (isContainingSelected || isStartSelected || isEndSelected) { bgGC = foldBgGC; } else { bgGC = foldLineHighlightedGCBg; } } cr.Rectangle(drawArea); cr.Color = bgGC; cr.Fill(); if (state == Document.LineState.Changed) { cr.Color = lineStateChangedGC; cr.Rectangle(x + 1, y, marginWidth / 3, lineHeight); cr.Fill(); } else if (state == Document.LineState.Dirty) { cr.Color = lineStateDirtyGC; cr.Rectangle(x + 1, y, marginWidth / 3, lineHeight); cr.Fill(); } if (line < editor.Document.LineCount) { double foldSegmentYPos = y + System.Math.Floor(editor.LineHeight - foldSegmentSize) / 2; double xPos = x + System.Math.Floor(marginWidth / 2) + 0.5; if (isFoldStart) { bool isVisible = true; bool moreLinedOpenFold = false; foreach (FoldSegment foldSegment in startFoldings) { if (foldSegment.IsFolded) { isVisible = false; } else { moreLinedOpenFold = foldSegment.EndLine.Offset > foldSegment.StartLine.Offset; } } bool isFoldEndFromUpperFold = false; foreach (FoldSegment foldSegment in endFoldings) { if (foldSegment.EndLine.Offset > foldSegment.StartLine.Offset && !foldSegment.IsFolded) { isFoldEndFromUpperFold = true; } } DrawFoldSegment(cr, x, y, isVisible, isStartSelected); if (isContaining || isFoldEndFromUpperFold) { cr.DrawLine(isContainingSelected ? foldLineHighlightedGC : foldLineGC, xPos, drawArea.Y, xPos, foldSegmentYPos - 2); } if (isContaining || moreLinedOpenFold) { cr.DrawLine(isEndSelected || (isStartSelected && isVisible) || isContainingSelected ? foldLineHighlightedGC : foldLineGC, xPos, foldSegmentYPos + foldSegmentSize + 2, xPos, drawArea.Y + drawArea.Height); } } else { if (isFoldEnd) { double yMid = drawArea.Y + drawArea.Height / 2; cr.DrawLine(isEndSelected ? foldLineHighlightedGC : foldLineGC, xPos, yMid, x + marginWidth - 2, yMid); cr.DrawLine(isContainingSelected || isEndSelected ? foldLineHighlightedGC : foldLineGC, xPos, drawArea.Y, xPos, yMid); if (isContaining) { cr.DrawLine(isContainingSelected ? foldLineHighlightedGC : foldLineGC, xPos, yMid + 1, xPos, drawArea.Y + drawArea.Height); } } else if (isContaining) { cr.DrawLine(isContainingSelected ? foldLineHighlightedGC : foldLineGC, xPos, drawArea.Y, xPos, drawArea.Y + drawArea.Height); } } } }
public MessageBubbleTextMarker (TextEditor editor, Task task, LineSegment lineSegment, bool isError, string errorMessage) { this.editor = editor; this.task = task; this.IsVisible = true; this.lineSegment = lineSegment; this.initialText = editor.Document.GetTextAt (lineSegment); this.Flags = TextMarkerFlags.DrawsSelection; AddError (isError, errorMessage); editor.EditorOptionsChanged += HandleEditorEditorOptionsChanged; errorPixbuf = ImageService.GetPixbuf (MonoDevelop.Ide.Gui.Stock.Error, Gtk.IconSize.Menu); warningPixbuf = ImageService.GetPixbuf (MonoDevelop.Ide.Gui.Stock.Warning, Gtk.IconSize.Menu); }
protected internal override void Draw (Cairo.Context cr, Cairo.Rectangle area, LineSegment line, int lineNr, double x, double y, double _lineHeight) { // double xStart = System.Math.Max (area.X, XOffset); // xStart = System.Math.Max (0, xStart); var lineArea = new Cairo.Rectangle (XOffset - 1, y, textEditor.Allocation.Width - XOffset + 1, _lineHeight); int width, height; double pangoPosition = (x - textEditor.HAdjustment.Value + TextStartPosition) * Pango.Scale.PangoScale; defaultBgColor = Document.ReadOnly ? ColorStyle.ReadOnlyTextBg : ColorStyle.Default.CairoBackgroundColor; // Draw the default back color for the whole line. Colors other than the default // background will be drawn when rendering the text chunks. DrawRectangleWithRuler (cr, x, lineArea, defaultBgColor, true); bool isSelectionDrawn = false; if (BackgroundRenderer != null) BackgroundRenderer.Draw (cr, area, line, x, y, _lineHeight); // Check if line is beyond the document length if (line == null) { if (textEditor.Options.ShowInvalidLines) DrawInvalidLineMarker (cr, pangoPosition / Pango.Scale.PangoScale, y); var marker = Document.GetExtendingTextMarker (lineNr); if (marker != null) marker.Draw (textEditor, cr, lineNr, lineArea); return; } IEnumerable<FoldSegment> foldings = Document.GetStartFoldings (line); int offset = line.Offset; int caretOffset = Caret.Offset; bool isEolFolded = false; restart: int logicalRulerColumn = line.GetLogicalColumn (textEditor.GetTextEditorData (), textEditor.Options.RulerColumn); foreach (FoldSegment folding in foldings) { int foldOffset = folding.StartLine.Offset + folding.Column - 1; if (foldOffset < offset) continue; if (folding.IsFolded) { DrawLinePart (cr, line, lineNr, logicalRulerColumn, offset, foldOffset - offset, ref pangoPosition, ref isSelectionDrawn, y, area.X + area.Width); offset = folding.EndLine.Offset + folding.EndColumn; markerLayout.SetText (folding.Description); markerLayout.GetSize (out width, out height); bool isFoldingSelected = !this.HideSelection && textEditor.IsSomethingSelected && textEditor.SelectionRange.Contains (folding.Segment); double pixelX = pangoPosition / Pango.Scale.PangoScale; double pixelWidth = (pangoPosition + width) / Pango.Scale.PangoScale - pixelX; var foldingRectangle = new Cairo.Rectangle (pixelX + 0.5, y + 0.5, pixelWidth - cr.LineWidth, this.LineHeight - cr.LineWidth); if (BackgroundRenderer == null) { cr.Color = isFoldingSelected ? SelectionColor.CairoBackgroundColor : defaultBgColor; cr.Rectangle (foldingRectangle); cr.Fill (); } cr.Color = isFoldingSelected ? SelectionColor.CairoColor : ColorStyle.FoldLine.CairoColor; cr.Rectangle (foldingRectangle); cr.Stroke (); cr.Save (); cr.Translate (pangoPosition / Pango.Scale.PangoScale, y); cr.Color = isFoldingSelected ? SelectionColor.CairoColor : ColorStyle.FoldLine.CairoColor; cr.ShowLayout (markerLayout); cr.Restore (); if (caretOffset == foldOffset && !string.IsNullOrEmpty (folding.Description)) SetVisibleCaretPosition ((int)(pangoPosition / Pango.Scale.PangoScale), y); pangoPosition += width; if (caretOffset == foldOffset + folding.Length && !string.IsNullOrEmpty (folding.Description)) SetVisibleCaretPosition ((int)(pangoPosition / Pango.Scale.PangoScale), y); if (folding.EndLine != line) { line = folding.EndLine; lineNr = Document.OffsetToLineNumber (line.Offset); foldings = Document.GetStartFoldings (line); isEolFolded = line.Length <= folding.EndColumn; goto restart; } isEolFolded = line.Length <= folding.EndColumn; } } // Draw remaining line - must be called for empty line parts as well because the caret may be at this positon // and the caret position is calculated in DrawLinePart. if (line.EndOffsetIncludingDelimiter - offset >= 0) DrawLinePart (cr, line, lineNr, logicalRulerColumn, offset, line.Offset + line.Length - offset, ref pangoPosition, ref isSelectionDrawn, y, area.X + area.Width); bool isEolSelected = !this.HideSelection && textEditor.IsSomethingSelected && textEditor.SelectionMode == SelectionMode.Normal && textEditor.SelectionRange.Contains (line.Offset + line.Length); lineArea = new Cairo.Rectangle (pangoPosition / Pango.Scale.PangoScale, lineArea.Y, textEditor.Allocation.Width - pangoPosition / Pango.Scale.PangoScale, lineArea.Height); if (textEditor.SelectionMode == SelectionMode.Block && textEditor.IsSomethingSelected && textEditor.SelectionRange.Contains (line.Offset + line.Length)) { DocumentLocation start = textEditor.MainSelection.Anchor; DocumentLocation end = textEditor.MainSelection.Lead; DocumentLocation visStart = textEditor.LogicalToVisualLocation (start); DocumentLocation visEnd = textEditor.LogicalToVisualLocation (end); double x1 = this.ColumnToX (line, visStart.Column); double x2 = this.ColumnToX (line, visEnd.Column); if (x1 > x2) { var tmp = x1; x1 = x2; x2 = tmp; } x1 += XOffset - textEditor.HAdjustment.Value; x2 += XOffset - textEditor.HAdjustment.Value; if (x2 > lineArea.X) { if (x1 - lineArea.X > 0) { DrawRectangleWithRuler (cr, x, new Cairo.Rectangle (lineArea.X, lineArea.Y, x1 - lineArea.X, lineArea.Height), defaultBgColor, false); lineArea = new Cairo.Rectangle (x1, lineArea.Y, lineArea.Width, lineArea.Height); } DrawRectangleWithRuler (cr, x, new Cairo.Rectangle (lineArea.X, lineArea.Y, x2 - lineArea.X, lineArea.Height), this.SelectionColor.CairoBackgroundColor, false); lineArea = new Cairo.Rectangle (x2, lineArea.Y, textEditor.Allocation.Width - lineArea.X, lineArea.Height); } } if (!isSelectionDrawn) { if (isEolSelected) { if (!Platform.IsMac) { // prevent "gaps" in the selection drawing ('fuzzy' lines problem) lineArea = new Cairo.Rectangle (pangoPosition / Pango.Scale.PangoScale, lineArea.Y, textEditor.Allocation.Width - pangoPosition / Pango.Scale.PangoScale + 1, lineArea.Height); } else { // prevent "gaps" in the selection drawing ('fuzzy' lines problem) lineArea = new Cairo.Rectangle (pangoPosition / Pango.Scale.PangoScale - 1, lineArea.Y, textEditor.Allocation.Width - pangoPosition / Pango.Scale.PangoScale + 1, lineArea.Height); } DrawRectangleWithRuler (cr, x, lineArea, this.SelectionColor.CairoBackgroundColor, false); } else if (!(HighlightCaretLine || textEditor.Options.HighlightCaretLine) || Caret.Line != lineNr) { LayoutWrapper wrapper = GetLayout (line); if (wrapper.EolSpanStack != null) { foreach (var span in wrapper.EolSpanStack) { var spanStyle = textEditor.ColorStyle.GetChunkStyle (span.Color); if (!spanStyle.TransparentBackround && GetPixel (ColorStyle.Default.BackgroundColor) != GetPixel (spanStyle.BackgroundColor)) { DrawRectangleWithRuler (cr, x, lineArea, spanStyle.CairoBackgroundColor, false); break; } } } } else { double xPos = pangoPosition / Pango.Scale.PangoScale; DrawCaretLineMarker (cr, xPos, y, lineArea.X + lineArea.Width - xPos); } } if (!isEolFolded && textEditor.Options.ShowEolMarkers) DrawEolMarker (cr, line, isEolSelected, pangoPosition / Pango.Scale.PangoScale, y); var extendingMarker = Document.GetExtendingTextMarker (lineNr); if (extendingMarker != null) extendingMarker.Draw (textEditor, cr, lineNr, lineArea); lastLineRenderWidth = pangoPosition / Pango.Scale.PangoScale; }
void UpdateExecutionLocation () { if (DebuggingService.IsDebugging && !DebuggingService.IsRunning) { var frame = CheckFrameIsInFile (DebuggingService.CurrentFrame) ?? CheckFrameIsInFile (DebuggingService.GetCurrentVisibleFrame ()); if (frame != null) { if (lastDebugLine == frame.SourceLocation.Line) return; RemoveDebugMarkers (); lastDebugLine = frame.SourceLocation.Line; var segment = widget.TextEditor.Document.GetLine (lastDebugLine); if (segment != null) { if (DebuggingService.CurrentFrameIndex == 0) { currentLineSegment = segment; widget.TextEditor.Document.AddMarker (segment, currentDebugLineMarker); } else { debugStackSegment = segment; widget.TextEditor.Document.AddMarker (segment, debugStackLineMarker); } widget.TextEditor.QueueDraw (); } return; } } if (currentLineSegment != null || debugStackSegment != null) { RemoveDebugMarkers (); lastDebugLine = -1; widget.TextEditor.QueueDraw (); } }
public DocumentLocation PointToLocation (double xp, double yp) { lineNumber = System.Math.Min (margin.YToLine (yp + margin.textEditor.VAdjustment.Value), margin.Document.LineCount); line = lineNumber <= margin.Document.LineCount ? margin.Document.GetLine (lineNumber) : null; if (line == null) return DocumentLocation.Empty; int offset = line.Offset; yp = ((int)yp % margin.LineHeight); xp -= margin.TextStartPosition; xp += margin.textEditor.HAdjustment.Value; xp *= Pango.Scale.PangoScale; yp *= Pango.Scale.PangoScale; yp = System.Math.Max (0, yp); if (xp < 0) return new DocumentLocation (lineNumber, DocumentLocation.MinColumn); int column = DocumentLocation.MinColumn; ISyntaxMode mode = margin.Document.SyntaxMode != null && margin.textEditor.Options.EnableSyntaxHighlighting ? margin.Document.SyntaxMode : new SyntaxMode (margin.Document); IEnumerable<FoldSegment> foldings = margin.Document.GetStartFoldings (line); bool done = false; Pango.Layout measueLayout = null; restart: int logicalRulerColumn = line.GetLogicalColumn(margin.textEditor.GetTextEditorData(), margin.textEditor.Options.RulerColumn); foreach (FoldSegment folding in foldings.Where(f => f.IsFolded)) { int foldOffset = folding.StartLine.Offset + folding.Column - 1; if (foldOffset < offset) continue; layoutWrapper = margin.CreateLinePartLayout(mode, line, logicalRulerColumn, line.Offset, foldOffset - offset, -1, -1); done |= ConsumeLayout ((int)(xp - xPos), (int)yp); if (done) break; int height, width; layoutWrapper.Layout.GetPixelSize (out width, out height); xPos += width * (int)Pango.Scale.PangoScale; if (measueLayout == null) { measueLayout = PangoUtil.CreateLayout (margin.textEditor, folding.Description); measueLayout.FontDescription = margin.textEditor.Options.Font; } int delta; measueLayout.GetPixelSize (out delta, out height); delta *= (int)Pango.Scale.PangoScale; xPos += delta; if (xPos - delta / 2 >= xp) { index = foldOffset - offset; done = true; break; } offset = folding.EndLine.Offset + folding.EndColumn; DocumentLocation foldingEndLocation = margin.Document.OffsetToLocation(offset); lineNumber = foldingEndLocation.Line; column = foldingEndLocation.Column; if (xPos >= xp) { index = 0; done = true; break; } if (folding.EndLine != line) { line = folding.EndLine; foldings = margin.Document.GetStartFoldings (line); goto restart; } } if (!done) { layoutWrapper = margin.CreateLinePartLayout(mode, line, logicalRulerColumn, offset, line.Offset + line.Length - offset, -1, -1); ConsumeLayout ((int)(xp - xPos), (int)yp); } if (measueLayout != null) measueLayout.Dispose (); return new DocumentLocation (lineNumber, column + index); }
public ErrorMarker (MonoDevelop.Projects.Dom.Error info, LineSegment line) { this.Info = info; this.Line = line; // may be null if no line is assigned to the error. string underlineColor; if (info.ErrorType == ErrorType.Warning) underlineColor = Mono.TextEditor.Highlighting.Style.WarningUnderlineString; else underlineColor = Mono.TextEditor.Highlighting.Style.ErrorUnderlineString; if (Info.Region.Start.Line == info.Region.End.Line) marker = new UnderlineMarker (underlineColor, Info.Region.Start.Column, info.Region.End.Column); else marker = new UnderlineMarker (underlineColor, 0, 0); }
public double ColumnToX (LineSegment line, int column) { column--; if (line == null || line.Length == 0 || column < 0) return 0; int logicalRulerColumn = line.GetLogicalColumn (textEditor.GetTextEditorData (), textEditor.Options.RulerColumn); int lineOffset = line.Offset; StringBuilder textBuilder = new StringBuilder (); ISyntaxMode mode = Document.SyntaxMode != null && textEditor.Options.EnableSyntaxHighlighting ? Document.SyntaxMode : new SyntaxMode (Document); var startChunk = GetCachedChunks (mode, Document, textEditor.ColorStyle, line, lineOffset, line.Length); foreach (Chunk chunk in startChunk) { try { textBuilder.Append (Document.GetTextAt (chunk)); } catch (Exception e) { Console.WriteLine (e); return 0; } } string lineText = textBuilder.ToString (); char[] lineChars = lineText.ToCharArray (); bool containsPreedit = textEditor.ContainsPreedit (lineOffset, line.Length); uint preeditLength = 0; if (containsPreedit) { lineText = lineText.Insert (textEditor.preeditOffset - lineOffset, textEditor.preeditString); preeditLength = (uint)textEditor.preeditString.Length; } if (column < lineText.Length) lineText = lineText.Substring (0, column); var layout = PangoUtil.CreateLayout (textEditor, lineText); layout.Alignment = Pango.Alignment.Left; layout.FontDescription = textEditor.Options.Font; layout.Tabs = tabArray; int startOffset = lineOffset, endOffset = lineOffset + line.Length; uint curIndex = 0, byteIndex = 0; uint curChunkIndex = 0, byteChunkIndex = 0; List<Pango.Attribute> attributes = new List<Pango.Attribute> (); uint oldEndIndex = 0; foreach (Chunk chunk in startChunk) { ChunkStyle chunkStyle = chunk != null ? textEditor.ColorStyle.GetChunkStyle (chunk) : null; foreach (TextMarker marker in line.Markers) chunkStyle = marker.GetStyle (chunkStyle); if (chunkStyle != null) { startOffset = chunk.Offset; endOffset = chunk.EndOffset; uint startIndex = (uint)(oldEndIndex); uint endIndex = (uint)(startIndex + chunk.Length); oldEndIndex = endIndex; if (containsPreedit) { if (textEditor.preeditOffset < startOffset) startIndex += preeditLength; if (textEditor.preeditOffset < endOffset) endIndex += preeditLength; } HandleSelection (lineOffset, logicalRulerColumn, - 1, -1, chunk.Offset, chunk.EndOffset, delegate(int start, int end) { Pango.AttrForeground foreGround = new Pango.AttrForeground (chunkStyle.Color.Red, chunkStyle.Color.Green, chunkStyle.Color.Blue); foreGround.StartIndex = TranslateToUTF8Index (lineChars, (uint)(startIndex + start - chunk.Offset), ref curIndex, ref byteIndex); foreGround.EndIndex = TranslateToUTF8Index (lineChars, (uint)(startIndex + end - chunk.Offset), ref curIndex, ref byteIndex); attributes.Add (foreGround); if (!chunkStyle.TransparentBackround) { var background = new Pango.AttrBackground (chunkStyle.BackgroundColor.Red, chunkStyle.BackgroundColor.Green, chunkStyle.BackgroundColor.Blue); background.StartIndex = foreGround.StartIndex; background.EndIndex = foreGround.EndIndex; attributes.Add (background); } }, delegate(int start, int end) { Pango.AttrForeground selectedForeground = new Pango.AttrForeground (SelectionColor.Color.Red, SelectionColor.Color.Green, SelectionColor.Color.Blue); selectedForeground.StartIndex = TranslateToUTF8Index (lineChars, (uint)(startIndex + start - chunk.Offset), ref curIndex, ref byteIndex); selectedForeground.EndIndex = TranslateToUTF8Index (lineChars, (uint)(startIndex + end - chunk.Offset), ref curIndex, ref byteIndex); attributes.Add (selectedForeground); }); var translatedStartIndex = TranslateToUTF8Index (lineChars, (uint)startIndex, ref curChunkIndex, ref byteChunkIndex); var translatedEndIndex = TranslateToUTF8Index (lineChars, (uint)endIndex, ref curChunkIndex, ref byteChunkIndex); if (chunkStyle.Bold) { Pango.AttrWeight attrWeight = new Pango.AttrWeight (Pango.Weight.Bold); attrWeight.StartIndex = translatedStartIndex; attrWeight.EndIndex = translatedEndIndex; attributes.Add (attrWeight); } if (chunkStyle.Italic) { Pango.AttrStyle attrStyle = new Pango.AttrStyle (Pango.Style.Italic); attrStyle.StartIndex = translatedStartIndex; attrStyle.EndIndex = translatedEndIndex; attributes.Add (attrStyle); } if (chunkStyle.Underline) { Pango.AttrUnderline attrUnderline = new Pango.AttrUnderline (Pango.Underline.Single); attrUnderline.StartIndex = translatedStartIndex; attrUnderline.EndIndex = translatedEndIndex; attributes.Add (attrUnderline); } } } Pango.AttrList attributeList = new Pango.AttrList (); attributes.ForEach (attr => attributeList.Insert (attr)); layout.Attributes = attributeList; Pango.Rectangle ink_rect, logical_rect; layout.GetExtents (out ink_rect, out logical_rect); attributes.ForEach (attr => attr.Dispose ()); attributeList.Dispose (); layout.Dispose (); return (logical_rect.Width + Pango.Scale.PangoScale - 1) / Pango.Scale.PangoScale; }
internal protected override void MouseLeft () { base.MouseLeft (); if (lineHover != null) { lineHover = null; editor.RedrawMargin (this); } delayTimer.Stop (); RemoveBackgroundRenderer (); }
public abstract void Analyze(Document doc, LineSegment line, Chunk startChunk, int startOffset, int endOffset);