本文整理汇总了C#中Cairo.ShowLayout方法的典型用法代码示例。如果您正苦于以下问题:C# Cairo.ShowLayout方法的具体用法?C# Cairo.ShowLayout怎么用?C# Cairo.ShowLayout使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Cairo
的用法示例。
在下文中一共展示了Cairo.ShowLayout方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: DrawTextLine
void DrawTextLine (Cairo.Context g, IReadonlyTextDocument document, int lineNumber, ref int y)
{
using (var drawingLayout = new Pango.Layout (this.PangoContext)) {
drawingLayout.FontDescription = fontDescription;
var line = document.GetLine (lineNumber);
var correctedIndentLength = CorrectIndent (document, line, indentLength);
drawingLayout.SetText (document.GetTextAt (line.Offset + Math.Min (correctedIndentLength, line.Length), Math.Max (0, line.Length - correctedIndentLength)));
g.Save ();
g.Translate (textBorder, y);
g.ShowLayout (drawingLayout);
g.Restore ();
y += lineHeight;
}
}
示例2: Draw
protected internal override void Draw (Cairo.Context cr, Cairo.Rectangle area, DocumentLine line, int lineNr, double x, double y, double _lineHeight)
{
// double xStart = System.Math.Max (area.X, XOffset);
// xStart = System.Math.Max (0, xStart);
var correctedXOffset = System.Math.Floor (XOffset) - 1;
var lineArea = new Cairo.Rectangle (correctedXOffset, y, textEditor.Allocation.Width - correctedXOffset, _lineHeight);
int width, height;
double pangoPosition = (x - textEditor.HAdjustment.Value + TextStartPosition) * Pango.Scale.PangoScale;
defaultBgColor = Document.ReadOnly ? ColorStyle.BackgroundReadOnly.Color : ColorStyle.PlainText.Background;
// Draw the default back color for the whole line. Colors other than the default
// background will be drawn when rendering the text chunks.
if (BackgroundRenderer == null)
DrawRectangleWithRuler (cr, x, lineArea, defaultBgColor, true);
bool isSelectionDrawn = false;
// Check if line is beyond the document length
if (line == null) {
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);
if ((HighlightCaretLine || textEditor.Options.HighlightCaretLine) && Caret.Line == lineNr)
DrawCaretLineMarker (cr, x, y, TextStartPosition, _lineHeight);
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, _lineHeight);
offset = folding.EndLine.Offset + folding.EndColumn - 1;
markerLayout.SetText (folding.Description);
markerLayout.GetSize (out width, out height);
bool isFoldingSelected = !this.HideSelection && textEditor.IsSomethingSelected && textEditor.SelectionRange.Contains (folding.Segment);
double pixelX = 0.5 + System.Math.Floor (pangoPosition / Pango.Scale.PangoScale);
double foldXMargin = foldMarkerXMargin * textEditor.Options.Zoom;
double pixelWidth = System.Math.Floor ((pangoPosition + width) / Pango.Scale.PangoScale - pixelX + foldXMargin * 2);
var foldingRectangle = new Cairo.Rectangle (
pixelX,
y,
pixelWidth,
this.LineHeight);
if (BackgroundRenderer == null && isFoldingSelected) {
cr.Color = SelectionColor.Background;
cr.Rectangle (foldingRectangle);
cr.Fill ();
}
if (isFoldingSelected && SelectionColor.TransparentForeground) {
cr.Color = ColorStyle.CollapsedText.Foreground;
} else {
cr.Color = isFoldingSelected ? SelectionColor.Foreground : ColorStyle.CollapsedText.Foreground;
}
var boundingRectangleHeight = foldingRectangle.Height - 1;
var boundingRectangleY = System.Math.Floor (foldingRectangle.Y + (foldingRectangle.Height - boundingRectangleHeight) / 2);
RoundedRectangle (cr,
System.Math.Floor (foldingRectangle.X) + 0.5,
boundingRectangleY + 0.5,
System.Math.Floor (foldingRectangle.Width - cr.LineWidth),
System.Math.Floor (boundingRectangleHeight - cr.LineWidth),
LineHeight / 8, CairoCorners.All, false);
cr.Stroke ();
cr.Save ();
cr.Translate (
pangoPosition / Pango.Scale.PangoScale + foldXMargin,
System.Math.Floor (boundingRectangleY + (boundingRectangleHeight - System.Math.Floor (height / Pango.Scale.PangoScale)) / 2));
cr.ShowLayout (markerLayout);
cr.Restore ();
if (caretOffset == foldOffset && !string.IsNullOrEmpty (folding.Description)) {
var cx = (int)(pangoPosition / Pango.Scale.PangoScale);
SetVisibleCaretPosition (cx, y, cx, y);
}
pangoPosition += foldingRectangle.Width * Pango.Scale.PangoScale;
if (caretOffset == foldOffset + folding.Length && !string.IsNullOrEmpty (folding.Description)) {
var cx = (int)(pangoPosition / Pango.Scale.PangoScale);
SetVisibleCaretPosition (cx, y, cx, y);
}
if (folding.EndLine != line) {
line = folding.EndLine;
lineNr = line.LineNumber;
foldings = Document.GetStartFoldings (line);
//.........这里部分代码省略.........
示例3: DrawAfterEol
public override void DrawAfterEol (TextEditor textEditor, Cairo.Context g, double y, EndOfLineMetrics metrics)
{
if (!IsVisible)
return;
EnsureLayoutCreated (editor);
int errorCounterWidth = 0, eh = 0;
if (errorCountLayout != null) {
errorCountLayout.GetPixelSize (out errorCounterWidth, out eh);
errorCounterWidth = Math.Max (15, Math.Max (errorCounterWidth + 3, (int)(editor.LineHeight * 3 / 4)));
}
var sx = metrics.TextRenderEndPosition;
var width = LayoutWidth + errorCounterWidth + editor.LineHeight;
var drawLayout = layouts[0].Layout;
int ex = 0 , ey = 0;
bool customLayout = true; //sx + width > editor.Allocation.Width;
bool hideText = false;
bubbleIsReduced = customLayout;
var showErrorCount = errorCounterWidth > 0 && errorCountLayout != null;
if (customLayout) {
width = editor.Allocation.Width - sx;
string text = layouts[0].Layout.Text;
drawLayout = new Pango.Layout (editor.PangoContext);
drawLayout.FontDescription = cache.fontDescription;
var paintWidth = (width - errorCounterWidth - editor.LineHeight + 4);
var minWidth = Math.Max (17, errorCounterWidth) + editor.LineHeight;
if (paintWidth < minWidth) {
hideText = true;
drawLayout.SetMarkup ("<span weight='heavy'>···</span>");
width = minWidth;
showErrorCount = false;
sx = Math.Min (sx, editor.Allocation.Width - width);
} else {
drawLayout.Ellipsize = Pango.EllipsizeMode.End;
drawLayout.Width = (int)(paintWidth * Pango.Scale.PangoScale);
drawLayout.SetText (text);
int w2, h2;
drawLayout.GetPixelSize (out w2, out h2);
width = w2 + errorCounterWidth + editor.LineHeight;
}
}
bubbleDrawX = sx - editor.TextViewMargin.XOffset;
bubbleDrawY = y;
bubbleWidth = width;
var bubbleHeight = editor.LineHeight - 1;
g.RoundedRectangle (sx, y + 1, width, bubbleHeight, editor.LineHeight / 2 - 1);
g.SetSourceColor (TagColor.Color);
g.Fill ();
// Draw error count icon
if (showErrorCount) {
var errorCounterHeight = bubbleHeight - 2;
var errorCounterX = sx + width - errorCounterWidth - 3;
var errorCounterY = y + 1 + (bubbleHeight - errorCounterHeight) / 2;
g.RoundedRectangle (
errorCounterX - 1,
errorCounterY - 1,
errorCounterWidth + 2,
errorCounterHeight + 2,
editor.LineHeight / 2 - 3
);
g.SetSourceColor (new Cairo.Color (0, 0, 0, 0.081));
g.Fill ();
g.RoundedRectangle (
errorCounterX,
errorCounterY,
errorCounterWidth,
errorCounterHeight,
editor.LineHeight / 2 - 3
);
using (var lg = new Cairo.LinearGradient (errorCounterX, errorCounterY, errorCounterX, errorCounterY + errorCounterHeight)) {
lg.AddColorStop (0, CounterColor.Color);
lg.AddColorStop (1, CounterColor.Color.AddLight (-0.1));
g.Pattern = lg;
g.Fill ();
}
g.Save ();
int ew;
errorCountLayout.GetPixelSize (out ew, out eh);
g.Translate (
errorCounterX + (errorCounterWidth - ew) / 2,
errorCounterY + (errorCounterHeight - eh) / 2
);
g.SetSourceColor (CounterColor.SecondColor);
g.ShowLayout (errorCountLayout);
g.Restore ();
}
// Draw label text
if (!showErrorCount || !hideText) {
g.Save ();
g.Translate (sx + editor.LineHeight / 2, y + (editor.LineHeight - layouts [0].Height) / 2 + 1);
//.........这里部分代码省略.........
示例4: DrawLinePart
//.........这里部分代码省略.........
// highlight search results
TextSegment firstSearch;
int o = offset;
uint curIndex = 0, byteIndex = 0;
if (textEditor.HighlightSearchPattern) {
while (!(firstSearch = GetFirstSearchResult (o, offset + length)).IsInvalid) {
double x = position;
HandleSelection (lineOffset, logicalRulerColumn, selectionStartOffset, selectionEndOffset, System.Math.Max (lineOffset, firstSearch.Offset), System.Math.Min (lineOffset + line.Length, firstSearch.EndOffset), delegate(int start, int end) {
uint startIndex = (uint)(start - offset);
uint endIndex = (uint)(end - offset);
if (startIndex < endIndex && endIndex <= layout.LineChars.Length) {
uint startTranslated = TranslateToUTF8Index (layout.LineChars, startIndex, ref curIndex, ref byteIndex);
uint endTranslated = TranslateToUTF8Index (layout.LineChars, endIndex, ref curIndex, ref byteIndex);
int l, x1, x2;
layout.Layout.IndexToLineX ((int)startTranslated, false, out l, out x1);
layout.Layout.IndexToLineX ((int)endTranslated, false, out l, out x2);
int w = (int) System.Math.Ceiling ((x2 - x1) / Pango.Scale.PangoScale);
int s = (int) System.Math.Floor (x1 / Pango.Scale.PangoScale + x);
double corner = System.Math.Min (4, width) * textEditor.Options.Zoom;
cr.SetSourceColor (MainSearchResult.IsInvalid || MainSearchResult.Offset != firstSearch.Offset ? ColorStyle.SearchResult.Color : ColorStyle.SearchResultMain.Color);
FoldingScreenbackgroundRenderer.DrawRoundRectangle (cr, true, true, s, y, corner, w + 1, LineHeight);
cr.Fill ();
}
}, null);
o = System.Math.Max (firstSearch.EndOffset, o + 1);
}
}
cr.Save ();
cr.Translate (xPos, y);
cr.ShowLayout (layout.Layout);
cr.Restore ();
if (offset == line.Offset) {
DrawIndent (cr, layout, line, xPos, y);
}
if (textEditor.Options.ShowWhitespaces != ShowWhitespaces.Never && !(BackgroundRenderer != null && textEditor.Options.ShowWhitespaces == ShowWhitespaces.Selection))
DecorateTabsAndSpaces (cr, layout, offset, xPos, y, selectionStartOffset, selectionEndOffset);
if (textEditor.IsSomethingSelected && !isSelectionDrawn && BackgroundRenderer == null) {
if (lineNumber == textEditor.MainSelection.End.Line && textEditor.MainSelection.End.Column > line.Length + 1) {
using (var wrapper = GetVirtualSpaceLayout (line, textEditor.MainSelection.End)) {
double startX;
double endX;
startX = xPos;
endX = position + wrapper.Width + layout.Width;
DrawRectangleWithRuler (cr, xPos + textEditor.HAdjustment.Value - TextStartPosition, new Cairo.Rectangle (startX, y, endX - startX, _lineHeight), this.SelectionColor.Background, true);
if (lineNumber == Caret.Line &&
textEditor.Options.ShowWhitespaces == ShowWhitespaces.Selection &&
textEditor.IsSomethingSelected &&
(selectionStartOffset < offset || selectionStartOffset == selectionEndOffset) &&
BackgroundRenderer == null) {
DecorateTabsAndSpaces (cr, wrapper, offset, xPos, y, selectionStartOffset, selectionEndOffset + wrapper.LineChars.Length);
}
}
}
}
if (lineNumber == Caret.Line) {
int caretOffset = Caret.Offset;
示例5: DrawLinePart
//.........这里部分代码省略.........
// highlight search results
TextSegment firstSearch;
int o = offset;
uint curIndex = 0, byteIndex = 0;
if (textEditor.HighlightSearchPattern) {
while (!(firstSearch = GetFirstSearchResult (o, offset + length)).IsInvalid) {
double x = pangoPosition;
HandleSelection (lineOffset, logicalRulerColumn, selectionStart, selectionEnd, System.Math.Max (lineOffset, firstSearch.Offset), System.Math.Min (lineOffset + line.Length, firstSearch.EndOffset), delegate(int start, int end) {
uint startIndex = (uint)(start - offset);
uint endIndex = (uint)(end - offset);
if (startIndex < endIndex && endIndex <= layout.LineChars.Length) {
uint startTranslated = TranslateToUTF8Index (layout.LineChars, startIndex, ref curIndex, ref byteIndex);
uint endTranslated = TranslateToUTF8Index (layout.LineChars, endIndex, ref curIndex, ref byteIndex);
int l, x1, x2;
layout.Layout.IndexToLineX ((int)startTranslated, false, out l, out x1);
layout.Layout.IndexToLineX ((int)endTranslated, false, out l, out x2);
int w = (int) System.Math.Ceiling ((x2 - x1) / Pango.Scale.PangoScale);
int s = (int) System.Math.Floor ((x1 + x) / Pango.Scale.PangoScale);
double corner = System.Math.Min (4, width) * textEditor.Options.Zoom;
cr.Color = MainSearchResult.IsInvalid || MainSearchResult.Offset != firstSearch.Offset ? ColorStyle.SearchResult.Color : ColorStyle.SearchResultMain.Color;
FoldingScreenbackgroundRenderer.DrawRoundRectangle (cr, true, true, s, y, corner, w + 1, LineHeight);
cr.Fill ();
}
}, null);
o = System.Math.Max (firstSearch.EndOffset, o + 1);
}
}
cr.Save ();
cr.Translate (xPos, y);
cr.ShowLayout (layout.Layout);
cr.Restore ();
if (offset == line.Offset) {
DrawIndent (cr, layout, line, xPos, y);
}
if (textEditor.Options.ShowWhitespaces != ShowWhitespaces.Never && !(BackgroundRenderer != null && textEditor.Options.ShowWhitespaces == ShowWhitespaces.Selection))
DecorateTabsAndSpaces (cr, layout, offset, length, xPos, y, selectionStart, selectionEnd);
if (lineNumber == Caret.Line) {
int caretOffset = Caret.Offset;
if (offset <= caretOffset && caretOffset <= offset + length) {
int index = caretOffset - offset;
if (Caret.Column > line.Length + 1) {
string virtualSpace = "";
var data = textEditor.GetTextEditorData ();
if (data.HasIndentationTracker && line.Length == 0) {
virtualSpace = this.textEditor.GetTextEditorData ().GetIndentationString (Caret.Location);
}
if (Caret.Column > line.Length + 1 + virtualSpace.Length)
virtualSpace += new string (' ', Caret.Column - line.Length - 1 - virtualSpace.Length);
// predit layout already contains virtual space.
if (!string.IsNullOrEmpty (textEditor.preeditString))
virtualSpace = "";
LayoutWrapper wrapper = new LayoutWrapper (PangoUtil.CreateLayout (textEditor));
wrapper.LineChars = virtualSpace.ToCharArray ();
wrapper.Layout.SetText (virtualSpace);
wrapper.Layout.Tabs = tabArray;
wrapper.Layout.FontDescription = textEditor.Options.Font;
int vy, vx;
wrapper.Layout.GetSize (out vx, out vy);
示例6: Draw
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;
//.........这里部分代码省略.........
示例7: DrawBackground
//.........这里部分代码省略.........
g.LineTo (new Cairo.PointD (x2 + 0.5, y2Bottom));
} else {
g.MoveTo (new Cairo.PointD (x2 + 0.5, y2 - 1));
g.LineTo (new Cairo.PointD (x2 + 0.5, y2Bottom + 1));
}
g.Color = colorMatrix[active, BOTTOM, LINE, highlighted, selected];
g.Stroke ();
// stroke top line
if (fitsInSameLine) {
g.Color = colorMatrix[active, BOTTOM, LINE, highlighted, selected];
g.MoveTo (new Cairo.PointD (right, y2));
g.LineTo (new Cairo.PointD (x2 + 0.5, y2));
g.Stroke ();
}
}
if (editor.Options.ShowRuler) {
double divider = Math.Max (editor.TextViewMargin.XOffset, x + editor.TextViewMargin.RulerX);
if (divider >= x2) {
g.MoveTo (new Cairo.PointD (divider + 0.5, y2));
g.LineTo (new Cairo.PointD (divider + 0.5, y2Bottom));
g.Color = colorMatrix[active, BOTTOM, DARK, highlighted, selected];
g.Stroke ();
}
}
if (errors.Count > 1 && errorCountLayout != null) {
double rX = x2 + (ShowIconsInBubble ? errorPixbuf.Width : 0) + border + LayoutWidth;
double rY = y + editor.LineHeight / 6;
double rW = errorCounterWidth - 2;
double rH = editor.LineHeight * 3 / 4;
BookmarkMarker.DrawRoundRectangle (g, rX, rY, 8, rW, rH);
g.Color = oldIsOver ? new Cairo.Color (0.3, 0.3, 0.3) : new Cairo.Color (0.5, 0.5, 0.5);
g.Fill ();
if (CollapseExtendedErrors) {
g.Color = gcLight;
g.Save ();
g.Translate (x2 + (ShowIconsInBubble ? errorPixbuf.Width : 0) + border + LayoutWidth + 4, y + (editor.LineHeight - eh) / 2 + eh % 2);
g.ShowLayout (errorCountLayout);
g.Restore ();
} else {
g.MoveTo (rX + rW / 2 - rW / 4, rY + rH - rH / 4);
g.LineTo (rX + rW / 2 + rW / 4, rY + rH - rH / 4);
g.LineTo (rX + rW / 2, rY + rH / 4);
g.ClosePath ();
g.Color = new Cairo.Color (1, 1, 1);
g.Fill ();
}
}
for (int i = 0; i < layouts.Count; i++) {
LayoutDescriptor layout = layouts[i];
x2 = right - layout.Width - border - errorPixbuf.Width;
if (i == 0)
x2 -= errorCounterWidth;
x2 = System.Math.Max (x2, fitsInSameLine ? editor.TextViewMargin.XOffset + editor.LineHeight / 2 : editor.TextViewMargin.XOffset);
if (i > 0) {
editor.TextViewMargin.DrawRectangleWithRuler (g, x, new Cairo.Rectangle (x, y, right, editor.LineHeight), isEolSelected ? editor.ColorStyle.Selection.CairoBackgroundColor : editor.ColorStyle.Default.CairoBackgroundColor, true);
g.MoveTo (new Cairo.PointD (x2 + 0.5, y));
g.LineTo (new Cairo.PointD (x2 + 0.5, y + editor.LineHeight));
g.LineTo (new Cairo.PointD (right, y + editor.LineHeight));
g.LineTo (new Cairo.PointD (right, y));
g.ClosePath ();
if (CollapseExtendedErrors) {
Cairo.Gradient pat = new Cairo.LinearGradient (x2, y, x2, y + editor.LineHeight);
pat.AddColorStop (0, colorMatrix[active, TOP, LIGHT, highlighted, selected]);
pat.AddColorStop (1, colorMatrix[active, BOTTOM, LIGHT, highlighted, selected]);
g.Pattern = pat;
} else {
g.Color = colorMatrix[active, TOP, LIGHT, highlighted, selected];
}
g.Fill ();
if (editor.Options.ShowRuler) {
double divider = Math.Max (editor.TextViewMargin.XOffset, x + editor.TextViewMargin.RulerX);
if (divider >= x2) {
g.MoveTo (new Cairo.PointD (divider + 0.5, y));
g.LineTo (new Cairo.PointD (divider + 0.5, y + editor.LineHeight));
g.Color = colorMatrix[active, BOTTOM, DARK, highlighted, selected];
g.Stroke ();
}
}
}
int lw, lh;
layout.Layout.GetPixelSize (out lw, out lh);
g.Color = (HslColor)(selected == 0 ? gc : gcSelected);
g.Save ();
g.Translate (x2 + errorPixbuf.Width + border, y + (editor.LineHeight - layout.Height) / 2 + layout.Height % 2);
g.ShowLayout (layout.Layout);
g.Restore ();
y += editor.LineHeight;
if (!UseVirtualLines)
break;
}
return true;
}
示例8: Draw
public void Draw (TextEditor editor, Cairo.Context g, int lineNr, Cairo.Rectangle lineArea)
{
EnsureLayoutCreated (editor);
int lineNumber = editor.Document.OffsetToLineNumber (lineSegment.Offset);
int errorNumber = lineNr - lineNumber;
if (!IsCurrentErrorTextFitting ())
errorNumber--;
double x = editor.TextViewMargin.XOffset;
double y = lineArea.Y;
double right = editor.Allocation.Width;
int errorCounterWidth = GetErrorCountBounds ().Item1;
// int eh = GetErrorCountBounds ().Item2;
double x2 = System.Math.Max (right - LayoutWidth - border - (ShowIconsInBubble ? cache.errorPixbuf.Width : 0) - errorCounterWidth, fitsInSameLine ? editor.TextViewMargin.XOffset + editor.LineHeight / 2 : editor.TextViewMargin.XOffset);
if (errors.Count == 1)
x2 = editor.TextViewMargin.XOffset;
// bool isEolSelected = editor.IsSomethingSelected && editor.SelectionMode != SelectionMode.Block ? editor.SelectionRange.Contains (lineSegment.Offset + lineSegment.EditableLength) : false;
int active = editor.Document.GetTextAt (lineSegment) == initialText ? 0 : 1;
bool isCaretInLine = lineSegment.Offset <= editor.Caret.Offset && editor.Caret.Offset <= lineSegment.EndOffsetIncludingDelimiter;
bool highlighted = active == 0 && isCaretInLine;
bool selected = false;
var layout = layouts [errorNumber];
x2 = right - LayoutWidth - border - (ShowIconsInBubble ? cache.errorPixbuf.Width : 0);
x2 -= errorCounterWidth;
x2 = System.Math.Max (x2, fitsInSameLine ? editor.TextViewMargin.XOffset + editor.LineHeight / 2 : editor.TextViewMargin.XOffset);
g.MoveTo (new Cairo.PointD (x2 + 0.5, y));
g.LineTo (new Cairo.PointD (x2 + 0.5, y + editor.LineHeight));
g.LineTo (new Cairo.PointD (right, y + editor.LineHeight));
g.LineTo (new Cairo.PointD (right, y));
g.ClosePath ();
g.Color = TagColor.Color;// GetLineColorTop (highlighted, selected);
g.Fill ();
g.Color = TagColor.BorderColor; //GetLineColorBottom (highlighted, selected);
g.MoveTo (new Cairo.PointD (x2 + 0.5, y));
g.LineTo (new Cairo.PointD (x2 + 0.5, y + editor.LineHeight));
if (errorNumber == errors.Count - 1)
g.LineTo (new Cairo.PointD (lineArea.X + lineArea.Width, y + editor.LineHeight));
g.Stroke ();
if (editor.Options.ShowRuler) {
double divider = Math.Max (editor.TextViewMargin.XOffset, x + editor.TextViewMargin.RulerX);
if (divider >= x2) {
g.MoveTo (new Cairo.PointD (divider + 0.5, y));
g.LineTo (new Cairo.PointD (divider + 0.5, y + editor.LineHeight));
g.Color = TagColor.BorderColor;
g.Stroke ();
}
}
g.Save ();
g.Translate (x2 + (ShowIconsInBubble ? cache.errorPixbuf.Width : 0) + border, y + (editor.LineHeight - layout.Height) / 2 + layout.Height % 2);
g.Color = TextColor.Color;
g.ShowLayout (layout.Layout);
g.Restore ();
if (ShowIconsInBubble) {
var pixbuf = errors [errorNumber].IsError ? cache.errorPixbuf: cache.warningPixbuf;
Gdk.CairoHelper.SetSourcePixbuf (g, pixbuf, x2, y + (editor.LineHeight - cache.errorPixbuf.Height) / 2);
g.Paint ();
}
}
示例9: DrawAfterEol
public override void DrawAfterEol (MonoTextEditor textEditor, Cairo.Context g, EndOfLineMetrics metrics)
{
if (!IsVisible)
return;
EnsureLayoutCreated (editor);
int errorCounterWidth = 0, eh = 0;
if (errorCountLayout != null) {
errorCountLayout.GetPixelSize (out errorCounterWidth, out eh);
errorCounterWidth = Math.Max (15, Math.Max (errorCounterWidth + 3, (int)(editor.LineHeight * 3 / 4)));
}
var sx = metrics.TextRenderEndPosition;
var width = LayoutWidth + errorCounterWidth + editor.LineHeight;
var drawLayout = layouts[0].Layout;
var y = metrics.LineYRenderStartPosition;
bool customLayout = true; //sx + width > editor.Allocation.Width;
bool hideText = false;
bubbleIsReduced = customLayout;
var showErrorCount = errorCounterWidth > 0 && errorCountLayout != null;
double roundingRadius = editor.LineHeight / 2 - 1;
if (customLayout) {
width = editor.Allocation.Width - sx;
string text = layouts[0].Layout.Text;
drawLayout = new Pango.Layout (editor.PangoContext);
drawLayout.FontDescription = cache.fontDescription;
var paintWidth = (width - errorCounterWidth - editor.LineHeight + 4);
var minWidth = Math.Max (25, errorCounterWidth) * editor.Options.Zoom;
if (paintWidth < minWidth) {
hideText = true;
showErrorCount = false;
// drawLayout.SetMarkup ("<span weight='heavy'>···</span>");
width = minWidth;
//roundingRadius = 10 * editor.Options.Zoom;
sx = Math.Min (sx, editor.Allocation.Width - width);
} else {
drawLayout.Ellipsize = Pango.EllipsizeMode.End;
drawLayout.Width = (int)(paintWidth * Pango.Scale.PangoScale);
drawLayout.SetText (text);
int w2, h2;
drawLayout.GetPixelSize (out w2, out h2);
width = w2 + errorCounterWidth + editor.LineHeight - 2;
}
}
bubbleDrawX = sx - editor.TextViewMargin.XOffset;
bubbleDrawY = y + 2;
bubbleWidth = width;
var bubbleHeight = editor.LineHeight;
g.RoundedRectangle (sx, y, width, bubbleHeight, roundingRadius);
g.SetSourceColor (TagColor.Color);
g.Fill ();
// Draw error count icon
if (showErrorCount) {
var errorCounterHeight = bubbleHeight - 2;
var errorCounterX = sx + width - errorCounterWidth - 1;
var errorCounterY = Math.Round (y + (bubbleHeight - errorCounterHeight) / 2);
g.RoundedRectangle (
errorCounterX,
errorCounterY,
errorCounterWidth,
errorCounterHeight,
editor.LineHeight / 2 - 2
);
using (var lg = new Cairo.LinearGradient (errorCounterX, errorCounterY, errorCounterX, errorCounterY + errorCounterHeight)) {
lg.AddColorStop (0, CounterColor.Color);
lg.AddColorStop (1, CounterColor.Color.AddLight (-0.1));
g.SetSource (lg);
g.Fill ();
}
g.Save ();
int ew;
errorCountLayout.GetPixelSize (out ew, out eh);
var tx = Math.Round (errorCounterX + (2 + errorCounterWidth - ew) / 2);
var ty = Math.Round (errorCounterY + (-1 + errorCounterHeight - eh) / 2);
g.Translate (tx, ty);
g.SetSourceColor (CounterColor.SecondColor);
g.ShowLayout (errorCountLayout);
g.Restore ();
}
if (hideText) {
// Draw dots
double radius = 2 * editor.Options.Zoom;
double spacing = 1 * editor.Options.Zoom;
sx += 1 * editor.Options.Zoom + Math.Ceiling((bubbleWidth - 3 * (radius * 2) - 2 * spacing) / 2);
for (int i = 0; i < 3; i++) {
g.Arc (sx, y + bubbleHeight / 2, radius, 0, Math.PI * 2);
g.SetSourceColor (TagColor.SecondColor);
g.Fill ();
//.........这里部分代码省略.........
示例10: Draw
internal protected override void Draw (Cairo.Context cr, Cairo.Rectangle area, DocumentLine lineSegment, int line, double x, double y, double lineHeight)
{
var gutterMarker = lineSegment != null ? (MarginMarker)lineSegment.Markers.FirstOrDefault (marker => marker is MarginMarker && ((MarginMarker)marker).CanDraw (this)) : null;
if (gutterMarker != null && gutterMarker.CanDrawBackground (this)) {
bool hasDrawn = gutterMarker.DrawBackground (editor, cr, new MarginDrawMetrics (this, area, lineSegment, line, x, y, lineHeight));
if (!hasDrawn)
DrawGutterBackground (cr, line, x, y, lineHeight);
} else {
DrawGutterBackground (cr, line, x, y, lineHeight);
}
if (gutterMarker != null && gutterMarker.CanDrawForeground (this)) {
gutterMarker.DrawForeground (editor, cr, new MarginDrawMetrics (this, area, lineSegment, line, x, y, lineHeight));
return;
}
if (line <= editor.Document.LineCount) {
// Due to a mac? gtk bug I need to re-create the layout here
// otherwise I get pango exceptions.
using (var layout = editor.LayoutCache.RequestLayout ()) {
layout.FontDescription = gutterFont;
layout.Width = (int)Width;
layout.Alignment = Pango.Alignment.Right;
layout.SetText (line.ToString ());
cr.Save ();
cr.Translate (x + (int)Width + (editor.Options.ShowFoldMargin ? 0 : -2), y);
cr.SetSourceColor (lineNumberGC);
cr.ShowLayout (layout);
cr.Restore ();
}
}
}
示例11: DrawBackground
//.........这里部分代码省略.........
}
g.Color = TagColor.Color;
g.Fill ();
// draw light bottom line
g.MoveTo (new Cairo.PointD (right, y2Bottom));
g.LineTo (new Cairo.PointD (x2 + 0.5, y2Bottom));
g.Stroke ();
// stroke left line
if (fitsInSameLine) {
g.MoveTo (new Cairo.PointD (x2 + 0.5, y2));
g.LineTo (new Cairo.PointD (x2 - editor.LineHeight / 2 + 0.5, y2 + editor.LineHeight / 2));
g.LineTo (new Cairo.PointD (x2 + 0.5, y2Bottom));
} else {
g.MoveTo (new Cairo.PointD (x2 + 0.5, y2 - 1));
g.LineTo (new Cairo.PointD (x2 + 0.5, y2Bottom + 1));
}
g.Color = TagColor.BorderColor;
g.Stroke ();
// stroke top line
if (fitsInSameLine) {
g.Color = TagColor.BorderColor;
g.MoveTo (new Cairo.PointD (right, y2));
g.LineTo (new Cairo.PointD (x2 + 0.5, y2));
g.Stroke ();
}
}
if (editor.Options.ShowRuler) {
double divider = Math.Max (editor.TextViewMargin.XOffset, x + editor.TextViewMargin.RulerX);
if (divider >= x2) {
g.MoveTo (new Cairo.PointD (divider + 0.5, y2));
g.LineTo (new Cairo.PointD (divider + 0.5, y2Bottom));
g.Color = GetLineColorBorder (highlighted, selected);
g.Stroke ();
}
}
for (int i = 0; i < layouts.Count; i++) {
if (!IsCurrentErrorTextFitting (layout2) && !CollapseExtendedErrors)
break;
var layout = layouts [i];
x2 = right - layout.Width - border - (ShowIconsInBubble ? cache.errorPixbuf.Width : 0);
if (i == 0) {
x2 -= errorCounterWidth;
if (x2 < lineTextPx) {
// if (CollapseExtendedErrors) {
x2 = lineTextPx;
// }
}
}
// x2 = System.Math.Max (x2, fitsInSameLine ? editor.TextViewMargin.XOffset + editor.LineHeight / 2 : editor.TextViewMargin.XOffset);
if (i > 0) {
editor.TextViewMargin.DrawRectangleWithRuler (g, x, new Cairo.Rectangle (x, y, right, editor.LineHeight), isEolSelected ? editor.ColorStyle.SelectedText.Background : editor.ColorStyle.PlainText.Background, true);
g.MoveTo (new Cairo.PointD (x2 + 0.5, y));
g.LineTo (new Cairo.PointD (x2 + 0.5, y + editor.LineHeight));
g.LineTo (new Cairo.PointD (right, y + editor.LineHeight));
g.LineTo (new Cairo.PointD (right, y));
g.ClosePath ();
if (CollapseExtendedErrors) {
using (var pat = new Cairo.LinearGradient (x2, y, x2, y + editor.LineHeight)) {
pat.AddColorStop (0, GetLineColorTop (highlighted, selected));
pat.AddColorStop (1, GetLineColorBottom (highlighted, selected));
g.Pattern = pat;
}
} else {
g.Color = GetLineColorTop (highlighted, selected);
}
g.Fill ();
if (editor.Options.ShowRuler) {
double divider = Math.Max (editor.TextViewMargin.XOffset, x + editor.TextViewMargin.RulerX);
if (divider >= x2) {
g.MoveTo (new Cairo.PointD (divider + 0.5, y));
g.LineTo (new Cairo.PointD (divider + 0.5, y + editor.LineHeight));
g.Color = TagColor.BorderColor;
g.Stroke ();
}
}
}
g.Color = TextColor.Color;
g.Save ();
g.Translate (x2 + (ShowIconsInBubble ? cache.errorPixbuf.Width : 0) + border, y + (editor.LineHeight - layout.Height) / 2 + layout.Height % 2);
g.ShowLayout (layout.Layout);
g.Restore ();
y += editor.LineHeight;
if (!UseVirtualLines)
break;
}
DrawErrorMarkers (editor, g, layout2, startXPos, startYPos);
return true;
}
示例12: DrawButtonTabs
void DrawButtonTabs (Cairo.Context cr, Cairo.Rectangle rectangle)
{
if (IsSeparator) {
cr.NewPath ();
double x = Math.Ceiling (rectangle.X + rectangle.Width / 2) + 0.5;
cr.MoveTo (x, rectangle.Y + 0.5 + 2);
cr.RelLineTo (0, rectangle.Height - 1 - 4);
cr.ClosePath ();
cr.Color = (HslColor)parent.Style.Dark (StateType.Normal);
cr.LineWidth = 1;
cr.Stroke ();
return;
}
int topPadding = 2;
if (Active || HoverPosition.X >= 0) {
cr.Rectangle (rectangle.X + 1, rectangle.Y + 1 + topPadding, rectangle.Width - 1, rectangle.Height - topPadding);
if (Active) {
cr.Color = (HslColor)parent.Style.Background (StateType.Prelight);
} else if (HoverPosition.X >= 0) {
double rx = rectangle.X + HoverPosition.X;
double ry = rectangle.Y + HoverPosition.Y;
Cairo.RadialGradient gradient = new Cairo.RadialGradient (rx, ry, rectangle.Height * 1.5,
rx, ry, 2);
var color = (HslColor)parent.Style.Dark (StateType.Normal);
color.L *= 1.1;
gradient.AddColorStop (0, color);
color.L *= 1.1;
gradient.AddColorStop (1, color);
cr.Pattern = gradient;
}
cr.Fill ();
if (Active) {
cr.Rectangle (rectangle.X + 0.5, rectangle.Y + 0.5 + topPadding, rectangle.Width - 1, rectangle.Height - topPadding);
cr.Color = (HslColor)parent.Style.Dark (StateType.Normal);
cr.LineWidth = 1;
cr.Stroke ();
}
}
cr.Save ();
cr.Translate (rectangle.X + (rectangle.Width - w) / 2, (rectangle.Height - h) / 2 + topPadding);
cr.Color = (HslColor)parent.Style.Text (StateType.Normal);
cr.ShowLayout (layout);
cr.Restore ();
}
示例13: DrawCurveTabs
void DrawCurveTabs (Cairo.Context cr, Cairo.Rectangle rectangle)
{
if (IsSeparator)
return;
cr.MoveTo (rectangle.X, rectangle.Y);
double bottom = rectangle.Y + rectangle.Height - 1;
cr.CurveTo (
rectangle.X + SpacerWidth / 2, rectangle.Y,
rectangle.X + SpacerWidth / 2, bottom,
rectangle.X + SpacerWidth, bottom);
cr.LineTo (rectangle.X + rectangle.Width - SpacerWidth, bottom);
cr.CurveTo (
rectangle.X + rectangle.Width - SpacerWidth / 2, bottom,
rectangle.X + rectangle.Width - SpacerWidth / 2, rectangle.Y,
rectangle.X + rectangle.Width, rectangle.Y);
cr.Color = (HslColor)parent.Style.Dark (StateType.Normal);
cr.StrokePreserve ();
cr.ClosePath ();
if (Active) {
cr.Color = (HslColor)parent.Style.Background (StateType.Prelight);
} else if (HoverPosition.X >= 0) {
double rx = rectangle.X + HoverPosition.X;
double ry = rectangle.Y + HoverPosition.Y;
Cairo.RadialGradient gradient = new Cairo.RadialGradient (rx, ry, rectangle.Height * 1.5,
rx, ry, 2);
var color = (HslColor)parent.Style.Mid (StateType.Normal);
color.L *= 1.05;
gradient.AddColorStop (0, color);
color.L *= 1.07;
gradient.AddColorStop (1, color);
cr.Pattern = gradient;
} else {
cr.Color = (HslColor)parent.Style.Mid (StateType.Normal);
}
cr.Fill ();
cr.Save ();
cr.Translate (rectangle.X + (rectangle.Width - w) / 2, (rectangle.Height - h) / 2);
cr.Color = (HslColor)parent.Style.Text (StateType.Normal);
cr.ShowLayout (layout);
cr.Restore ();
}
示例14: Draw
internal protected override void Draw (Cairo.Context cr, Cairo.Rectangle area, LineSegment lineSegment, int line, double x, double y, double lineHeight)
{
cr.Rectangle (x, y, Width, lineHeight);
cr.Color = lineNumberBgGC;
cr.Fill ();
if (line <= editor.Document.LineCount) {
layout.SetText (line.ToString ());
cr.Save ();
cr.Translate (x + (int)Width, y);
cr.Color = editor.Caret.Line == line ? lineNumberHighlightGC : lineNumberGC;
cr.ShowLayout (layout);
cr.Restore ();
}
}
示例15: DrawEolMarker
void DrawEolMarker (Cairo.Context cr, LineSegment line, bool selected, double x, double y)
{
Pango.Layout layout;
switch (line.DelimiterLength) {
case 0:
// an emty line end should only happen at eof
layout = eofEolLayout;
break;
case 1:
if (Document.GetCharAt (line.Offset + line.Length) == '\n') {
layout = unixEolLayout;
} else {
layout = macEolLayout;
}
break;
case 2:
layout = windowEolLayout;
break;
default:
throw new InvalidOperationException (); // other line endings are not known.
}
cr.Save ();
cr.Translate (x, y);
cr.Color = selected ? SelectionColor.CairoColor : ColorStyle.EolWhitespaceMarker;
cr.ShowLayout (layout);
cr.Restore ();
}