本文整理汇总了C#中LayoutWrapper类的典型用法代码示例。如果您正苦于以下问题:C# LayoutWrapper类的具体用法?C# LayoutWrapper怎么用?C# LayoutWrapper使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
LayoutWrapper类属于命名空间,在下文中一共展示了LayoutWrapper类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: RenderLine
protected override LayoutWrapper RenderLine (long line)
{
var layout = new TextLayout (Editor);
layout.Font = Editor.Options.Font;
StringBuilder sb = new StringBuilder ();
long startOffset = line * Editor.BytesInRow;
long endOffset = System.Math.Min (startOffset + Editor.BytesInRow, Data.Length);
byte[] lineBytes = Data.GetBytes (startOffset, (int)(endOffset - startOffset));
for (int i = 0; i < lineBytes.Length; i++) {
byte b = lineBytes[i];
char ch = (char)b;
if (b < 128 && (Char.IsLetterOrDigit (ch) || Char.IsPunctuation (ch))) {
sb.Append (ch);
} else {
sb.Append (".");
}
}
layout.Text = sb.ToString ();
Margin.LayoutWrapper result = new LayoutWrapper (layout);
if (Data.IsSomethingSelected) {
ISegment selection = Data.MainSelection.Segment;
HandleSelection (selection.Offset, selection.EndOffset, startOffset, endOffset, null, delegate(long start, long end) {
result.Layout.SetForeground (Style.Selection, (int)(start - startOffset), (int)(end - start));
result.Layout.SetBackground (Style.SelectionBg, (int)(start - startOffset), (int)(end - start));
});
}
return result;
}
示例2: RenderLine
protected override LayoutWrapper RenderLine (long line)
{
Pango.Layout layout = new Pango.Layout (Editor.PangoContext);
layout.FontDescription = Editor.Options.Font;
StringBuilder sb = new StringBuilder ();
long startOffset = line * Editor.BytesInRow;
long endOffset = System.Math.Min (startOffset + Editor.BytesInRow, Data.Length);
byte[] lineBytes = Data.GetBytes (startOffset, (int)(endOffset - startOffset));
for (int i = 0; i < lineBytes.Length; i++) {
byte b = lineBytes[i];
char ch = (char)b;
if (b < 128 && (Char.IsLetterOrDigit (ch) || Char.IsPunctuation (ch))) {
sb.Append (ch);
} else {
sb.Append (".");
}
}
layout.SetText (sb.ToString ());
char[] lineChars = layout.Text.ToCharArray ();
Margin.LayoutWrapper result = new LayoutWrapper (layout);
uint curIndex = 0, byteIndex = 0;
if (Data.IsSomethingSelected) {
ISegment selection = Data.MainSelection.Segment;
HandleSelection (selection.Offset, selection.EndOffset, startOffset, endOffset, null, delegate(long start, long end) {
Pango.AttrForeground selectedForeground = new Pango.AttrForeground (Style.Selection.Red,
Style.Selection.Green,
Style.Selection.Blue);
selectedForeground.StartIndex = TranslateToUTF8Index (lineChars, (uint)(start - startOffset), ref curIndex, ref byteIndex);
selectedForeground.EndIndex = TranslateToUTF8Index (lineChars, (uint)(end - startOffset), ref curIndex, ref byteIndex);
result.Add (selectedForeground);
Pango.AttrBackground attrBackground = new Pango.AttrBackground (Style.SelectionBg.Red,
Style.SelectionBg.Green,
Style.SelectionBg.Blue);
attrBackground.StartIndex = selectedForeground.StartIndex;
attrBackground.EndIndex = selectedForeground.EndIndex;
result.Add (attrBackground);
});
}
result.SetAttributes ();
return result;
}
示例3: InnerDecorateTabsAndSpaces
void InnerDecorateTabsAndSpaces (Cairo.Context ctx, LayoutWrapper layout, int offset, double x, double y, int selectionStart, int selectionEnd, char spaceOrTab)
{
var chars = layout.LineChars;
if (Array.IndexOf (chars, spaceOrTab) == -1)
return;
uint curIndex = 0, byteIndex = 0;
bool first = true, oldSelected = false;
var curchunk = layout.Chunks != null ? layout.Chunks.FirstOrDefault () : null;
var dotThickness = textEditor.Options.Zoom * 2;
var textEditorWidth = textEditor.Allocation.Width;
//Get 1st visible character index from left based on HAdjustment
int index, trailing;
layout.Layout.XyToIndex ((int)textEditor.HAdjustment.Value, 0, out index, out trailing);
double ypos;
if (spaceOrTab == ' ') {
ypos = System.Math.Floor (y + (LineHeight - dotThickness) / 2);
} else {
ypos = 0.5 + System.Math.Floor (y + LineHeight / 2);
}
var showOnlySelected = textEditor.Options.ShowWhitespaces != ShowWhitespaces.Always;
var lastColor = new Cairo.Color ();
bool firstDraw = true;
var foregroundColor = ColorStyle.PlainText.Foreground;
int lastIndex = -1;
int lastPosX = 0;
for (int i = index; i < chars.Length; i++) {
if (spaceOrTab != chars [i])
continue;
bool selected = selectionStart <= offset + i && offset + i < selectionEnd;
if (first || oldSelected != selected) {
first = false;
oldSelected = selected;
}
if (showOnlySelected && !selected)
continue;
int line, posX;
if (lastIndex == i) {
posX = lastPosX;
} else {
layout.Layout.IndexToLineX ((int)TranslateToUTF8Index (chars, (uint)i, ref curIndex, ref byteIndex), false, out line, out posX);
}
double xpos = x + posX / Pango.Scale.PangoScale;
if (xpos > textEditorWidth)
break;
layout.Layout.IndexToLineX ((int)TranslateToUTF8Index (chars, (uint)i + 1, ref curIndex, ref byteIndex), false, out line, out posX);
lastPosX = posX;
lastIndex = i + 1;
double xpos2 = x + posX / Pango.Scale.PangoScale;
var col = new Cairo.Color (0, 0, 0);
if (SelectionColor.TransparentForeground) {
while (curchunk != null && curchunk.EndOffset < offset + i)
curchunk = curchunk.Next;
if (curchunk != null && curchunk.SpanStack.Count > 0 && curchunk.SpanStack.Peek ().Color != "Plain Text") {
var chunkStyle = ColorStyle.GetChunkStyle (curchunk.SpanStack.Peek ().Color);
if (chunkStyle != null)
col = ColorStyle.GetForeground (chunkStyle);
} else {
col = foregroundColor;
}
} else {
col = selected ? SelectionColor.Foreground : foregroundColor;
}
if (firstDraw || (lastColor.R != col.R && lastColor.G != col.G && lastColor.B != col.B)) {
ctx.SetSourceRGBA (col.R, col.G, col.B, whitespaceMarkerAlpha);
lastColor = col;
firstDraw = false;
}
if (spaceOrTab == ' ') {
ctx.Rectangle (xpos + (xpos2 - xpos - dotThickness) / 2, ypos, dotThickness, dotThickness);
} else {
ctx.MoveTo (0.5 + xpos, ypos);
ctx.LineTo (0.5 + xpos2 - charWidth / 2, ypos);
}
}
if (!firstDraw) {//Atleast one draw was called
if (spaceOrTab == ' ') {
ctx.Fill ();
} else {
ctx.Stroke ();
}
}
}
示例4: CreateLinePartLayout
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);
//.........这里部分代码省略.........
示例5: DrawLinePart
void DrawLinePart (Cairo.Context cr, LineSegment line, int lineNumber, int logicalRulerColumn, int offset, int length, ref double pangoPosition, ref bool isSelectionDrawn, double y, double maxX)
{
ISyntaxMode mode = Document.SyntaxMode != null && textEditor.Options.EnableSyntaxHighlighting ? Document.SyntaxMode : new SyntaxMode (Document);
int selectionStart;
int selectionEnd;
if (this.HideSelection) {
selectionStart = selectionEnd = -1;
} else {
GetSelectionOffsets (line, out selectionStart, out selectionEnd);
}
// ---- new renderer
LayoutWrapper layout = CreateLinePartLayout (mode, line, logicalRulerColumn, offset, length, selectionStart, selectionEnd);
int lineOffset = line.Offset;
double width = layout.PangoWidth / Pango.Scale.PangoScale;
double xPos = pangoPosition / Pango.Scale.PangoScale;
// if (!(HighlightCaretLine || textEditor.Options.HighlightCaretLine) || Document.GetLine(Caret.Line) != line) {
foreach (var bg in layout.BackgroundColors) {
int x1, x2;
x1 = layout.Layout.IndexToPos (bg.FromIdx).X;
x2 = layout.Layout.IndexToPos (bg.ToIdx).X;
DrawRectangleWithRuler (cr, xPos + textEditor.HAdjustment.Value - TextStartPosition,
new Cairo.Rectangle ((x1 + pangoPosition) / Pango.Scale.PangoScale, y, (x2 - x1) / Pango.Scale.PangoScale + 1, LineHeight),
bg.Color, true);
}
// }
bool drawBg = true;
bool drawText = true;
foreach (TextMarker marker in line.Markers) {
IBackgroundMarker bgMarker = marker as IBackgroundMarker;
if (bgMarker == null || !marker.IsVisible)
continue;
isSelectionDrawn |= (marker.Flags & TextMarkerFlags.DrawsSelection) == TextMarkerFlags.DrawsSelection;
drawText &= bgMarker.DrawBackground (textEditor, cr, layout, selectionStart, selectionEnd, offset, offset + length, y, xPos, xPos + width, ref drawBg);
}
if (DecorateLineBg != null)
DecorateLineBg (cr, layout, offset, length, xPos, y, selectionStart, selectionEnd);
if ((HighlightCaretLine || textEditor.Options.HighlightCaretLine) && Caret.Line == lineNumber)
DrawCaretLineMarker (cr, xPos, y, layout.PangoWidth / Pango.Scale.PangoScale);
if (!isSelectionDrawn && (layout.StartSet || selectionStart == offset + length)) {
double startX;
double endX;
if (selectionStart != offset + length) {
var start = layout.Layout.IndexToPos ((int)layout.SelectionStartIndex);
startX = start.X / Pango.Scale.PangoScale;
var end = layout.Layout.IndexToPos ((int)layout.SelectionEndIndex);
endX = end.X / Pango.Scale.PangoScale;
} else {
startX = width;
endX = startX;
}
if (textEditor.MainSelection.SelectionMode == SelectionMode.Block && startX == endX) {
endX = startX + 2;
}
DrawRectangleWithRuler (cr, xPos + textEditor.HAdjustment.Value - TextStartPosition, new Cairo.Rectangle (xPos + startX, y, endX - startX, LineHeight), this.SelectionColor.CairoBackgroundColor, true);
}
// 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);
x1 += (int)x;
x2 += (int)x;
x1 /= (int)Pango.Scale.PangoScale;
x2 /= (int)Pango.Scale.PangoScale;
cr.Color = MainSearchResult.IsInvalid || MainSearchResult.Offset != firstSearch.Offset ? ColorStyle.SearchTextBg : ColorStyle.SearchTextMainBg;
FoldingScreenbackgroundRenderer.DrawRoundRectangle (cr, true, true, x1, y, System.Math.Min (10, width) * textEditor.Options.Zoom, x2 - x1, LineHeight);
cr.Fill ();
}
}, null);
o = System.Math.Max (firstSearch.EndOffset, o + 1);
}
}
cr.Save ();
cr.Translate (xPos, y);
cr.ShowLayout (layout.Layout);
cr.Restore ();
//.........这里部分代码省略.........
示例6: ConsumeLayout
bool ConsumeLayout (LayoutWrapper layoutWrapper, int xp, int yp)
{
int trailing;
bool isInside = layoutWrapper.Layout.XyToIndex (xp, yp, out index, out trailing);
if (isInside) {
int lineNr;
int xp1, xp2;
layoutWrapper.Layout.IndexToLineX (index, false, out lineNr, out xp1);
layoutWrapper.Layout.IndexToLineX (index + 1, false, out lineNr, out xp2);
index = TranslateIndexToUTF8 (layoutWrapper.Layout.Text, index);
if (snapCharacters && !IsNearX1 (xp, xp1, xp2))
index++;
return true;
}
index = line.Length;
return false;
}
示例7: LayoutDescriptor
public LayoutDescriptor (DocumentLine 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;
}
}
示例8: DrawIndent
void DrawIndent (Cairo.Context cr, LayoutWrapper layout, DocumentLine line, double xPos, double y)
{
if (!textEditor.Options.DrawIndentationMarkers)
return;
if (line.Length == 0) {
var nextLine = line.NextLine;
while (nextLine != null && nextLine.Length == 0)
nextLine = nextLine.NextLine;
if (nextLine != null)
layout = GetLayout (nextLine);
}
if (layout.IndentSize == 0)
return;
cr.Save ();
var dotted = new [] { textEditor.Options.Zoom };
cr.SetDash (dotted, (int)y + textEditor.VAdjustment.Value);
var top = y;
var bottom = y + LineHeight;
if (Caret.Line == line.LineNumber && textEditor.Options.HighlightCaretLine) {
top += textEditor.Options.Zoom;
bottom -= textEditor.Options.Zoom;
}
for (int i = 0; i < layout.IndentSize; i += textEditor.Options.IndentationSize) {
var x = System.Math.Floor (xPos + i * charWidth);
cr.MoveTo (x + 0.5, top);
cr.LineTo (x + 0.5, bottom);
cr.Color = ColorStyle.IndentationGuide.Color;
cr.Stroke ();
}
cr.Restore ();
}
示例9: DecorateTabsAndSpaces
void DecorateTabsAndSpaces (Cairo.Context ctx, LayoutWrapper layout, int offset, int length, double xPos, double y, int selectionStart, int selectionEnd)
{
uint curIndex = 0, byteIndex = 0;
bool first = true, oldSelected = false;
int index, trailing;
layout.Layout.XyToIndex ((int)textEditor.HAdjustment.Value, 0, out index, out trailing);
var curchunk = layout.Chunks != null ? layout.Chunks.FirstOrDefault () : null;
for (int i = index; i < layout.LineChars.Length; i++) {
char ch = layout.LineChars [i];
if (ch != ' ' && ch != '\t')
continue;
if (ch == ' ' && !textEditor.Options.IncludeWhitespaces.HasFlag (IncludeWhitespaces.Space))
continue;
if (ch == '\t' && !textEditor.Options.IncludeWhitespaces.HasFlag (IncludeWhitespaces.Tab))
continue;
bool selected = selectionStart <= offset + i && offset + i < selectionEnd;
if (first || oldSelected != selected) {
first = false;
oldSelected = selected;
}
if (!selected && textEditor.Options.ShowWhitespaces != ShowWhitespaces.Always)
continue;
Pango.Rectangle pos = layout.Layout.IndexToPos ((int)TranslateToUTF8Index (layout.LineChars, (uint)i, ref curIndex, ref byteIndex));
double xpos = xPos + pos.X / Pango.Scale.PangoScale;
if (xpos > textEditor.Allocation.Width)
break;
Pango.Rectangle pos2 = layout.Layout.IndexToPos ((int)TranslateToUTF8Index (layout.LineChars, (uint)i + 1, ref curIndex, ref byteIndex));
double xpos2 = xPos + pos2.X / Pango.Scale.PangoScale;
Cairo.Color col = new Cairo.Color (0, 0, 0);
if (SelectionColor.TransparentForeground) {
while (curchunk != null && curchunk.EndOffset < offset + i)
curchunk = curchunk.Next;
if (curchunk != null && curchunk.SpanStack.Count > 0 && curchunk.SpanStack.Peek ().Color != "Plain Text") {
var chunkStyle = ColorStyle.GetChunkStyle (curchunk.SpanStack.Peek ().Color);
if (chunkStyle != null)
col = ColorStyle.GetForeground (chunkStyle);
} else {
col = ColorStyle.PlainText.Foreground;
}
} else {
col = selected ? SelectionColor.Foreground : col = ColorStyle.PlainText.Foreground;
}
ctx.Color = new Cairo.Color (col.R, col.G, col.B, whitespaceMarkerAlpha);
if (ch == '\t') {
DrawTabMarker (ctx, selected, xpos, xpos2, y);
} else {
DrawSpaceMarker (ctx, selected, xpos, xpos2, y);
}
}
}
示例10: DecorateMatchingBracket
void DecorateMatchingBracket (Gdk.Drawable win, LayoutWrapper layout, int offset, int length, int xPos, int y, int selectionStart, int selectionEnd)
{
uint curIndex = 0, byteIndex = 0;
if (offset <= highlightBracketOffset && highlightBracketOffset <= offset + length) {
int index = highlightBracketOffset - offset;
Pango.Rectangle rect = layout.Layout.IndexToPos ((int)TranslateToUTF8Index (layout.LineChars, (uint)index, ref curIndex, ref byteIndex));
Gdk.Rectangle bracketMatch = new Gdk.Rectangle (xPos + (int)(rect.X / Pango.Scale.PangoScale), y, (int)(rect.Width / Pango.Scale.PangoScale) - 1, (int)(rect.Height / Pango.Scale.PangoScale) - 1);
if (BackgroundRenderer == null)
win.DrawRectangle (GetGC (this.ColorStyle.BracketHighlightRectangle.BackgroundColor), true, bracketMatch);
win.DrawRectangle (GetGC (this.ColorStyle.BracketHighlightRectangle.Color), false, bracketMatch);
}
}
示例11: DecorateTabs
void DecorateTabs (Gdk.Drawable win, LayoutWrapper layout, int offset, int length, int xPos, int y, int selectionStart, int selectionEnd)
{
uint curIndex = 0, byteIndex = 0;
for (int i = 0; i < layout.LineChars.Length; i++) {
if (layout.LineChars[i] == '\t') {
Pango.Rectangle pos = layout.Layout.IndexToPos ((int)TranslateToUTF8Index (layout.LineChars, (uint)i, ref curIndex, ref byteIndex));
int xpos = pos.X;
DrawTabMarker (win, selectionStart <= offset + i && offset + i < selectionEnd, xPos + xpos / 1024, y);
}
}
}
示例12: DecorateTabsAndSpaces
void DecorateTabsAndSpaces (Cairo.Context ctx, LayoutWrapper layout, int offset, int length, double xPos, double y, int selectionStart, int selectionEnd)
{
uint curIndex = 0, byteIndex = 0;
bool first = true, oldSelected = false;
for (int i = 0; i < layout.LineChars.Length; i++) {
char ch = layout.LineChars[i];
if (ch != ' ' && ch != '\t')
continue;
bool selected = selectionStart <= offset + i && offset + i < selectionEnd;
if (first || oldSelected != selected) {
ctx.Color = selected ? SelectionColor.CairoColor : ColorStyle.WhitespaceMarker;
first = false;
oldSelected = selected;
}
Pango.Rectangle pos = layout.Layout.IndexToPos ((int)TranslateToUTF8Index (layout.LineChars, (uint)i, ref curIndex, ref byteIndex));
int xpos = pos.X;
if (ch == '\t') {
DrawTabMarker (ctx, selected, xPos + xpos / Pango.Scale.PangoScale, y);
} else {
DrawSpaceMarker (ctx, selected, xPos + xpos / Pango.Scale.PangoScale, y);
}
}
}
示例13: RenderLine
protected override LayoutWrapper RenderLine (long line)
{
var layout = new TextLayout (Editor);
layout.Font = Editor.Options.Font;
StringBuilder sb = new StringBuilder ();
long startOffset = line * Editor.BytesInRow;
long endOffset = System.Math.Min (startOffset + Editor.BytesInRow, Data.Length);
byte[] lineBytes = Data.GetBytes (startOffset, (int)(endOffset - startOffset));
switch (Editor.Options.StringRepresentationType) {
case StringRepresentationTypes.ASCII:
for (int i = 0; i < lineBytes.Length; i++) {
byte b = lineBytes [i];
char ch = (char)b;
if (!char.IsControl (ch)) {
sb.Append (ch);
} else {
sb.Append (".");
}
}
break;
case StringRepresentationTypes.UTF16:
for (int i = 0; i < lineBytes.Length - 1; i += 2) {
char ch = Encoding.Unicode.GetChars (lineBytes, i, 2) [0];
if (char.IsLetterOrDigit (ch) || char.IsWhiteSpace (ch) || char.IsSymbol (ch) || char.IsPunctuation (ch))
sb.Append (ch);
else
sb.Append (".");
}
break;
default:
throw new NotImplementedException (Editor.Options.StringRepresentationType.ToString ());
}
layout.Text = sb.ToString ();
Margin.LayoutWrapper result = new LayoutWrapper (layout);
if (Data.IsSomethingSelected) {
ISegment selection = Data.MainSelection.Segment;
HandleSelection (selection.Offset, selection.EndOffset, startOffset, endOffset, this, new LayoutOffsetPair (startOffset, result.Layout), null, OnSelected);
}
return result;
}
示例14: RenderLine
protected override LayoutWrapper RenderLine (long line)
{
Pango.Layout layout = new Pango.Layout (Editor.PangoContext);
layout.FontDescription = Editor.Options.Font;
layout.Tabs = tabArray;
StringBuilder sb = new StringBuilder ();
long startOffset = line * Editor.BytesInRow;
long endOffset = System.Math.Min (startOffset + Editor.BytesInRow, Data.Length);
byte[] lineBytes = Data.GetBytes (startOffset, (int)(endOffset - startOffset));
for (int i = 0; i < lineBytes.Length; i++) {
sb.Append (string.Format ("{0:X2}", lineBytes[i]));
if (i % Editor.Options.GroupBytes == 0)
sb.Append ("\t");
}
layout.SetText (sb.ToString ());
char[] lineChars = sb.ToString ().ToCharArray ();
Margin.LayoutWrapper result = new LayoutWrapper (layout);
uint curIndex = 0, byteIndex = 0;
if (Data.IsSomethingSelected) {
ISegment selection = Data.MainSelection.Segment;
HandleSelection (selection.Offset, selection.EndOffset, startOffset, endOffset, null, delegate(long start, long end) {
Pango.AttrForeground selectedForeground = new Pango.AttrForeground (Style.Selection.Red,
Style.Selection.Green,
Style.Selection.Blue);
selectedForeground.StartIndex = TranslateToUTF8Index (lineChars, TranslateColumn (start - startOffset), ref curIndex, ref byteIndex);
selectedForeground.EndIndex = TranslateToUTF8Index (lineChars, TranslateColumn (end - startOffset) - 1, ref curIndex, ref byteIndex);
result.Add (selectedForeground);
Pango.AttrBackground attrBackground = new Pango.AttrBackground (Style.SelectionBg.Red,
Style.SelectionBg.Green,
Style.SelectionBg.Blue);
attrBackground.StartIndex = selectedForeground.StartIndex;
attrBackground.EndIndex = selectedForeground.EndIndex;
result.Add (attrBackground);
});
}
result.SetAttributes ();
return result;
}
示例15: RenderLine
protected override LayoutWrapper RenderLine (long line)
{
var layout = new TextLayout (Editor);
layout.Font = Editor.Options.Font;
// layout.Tabs = tabArray;
StringBuilder sb = new StringBuilder ();
long startOffset = line * Editor.BytesInRow;
long endOffset = System.Math.Min (startOffset + Editor.BytesInRow, Data.Length);
byte[] lineBytes = Data.GetBytes (startOffset, (int)(endOffset - startOffset));
for (int i = 0; i < lineBytes.Length; i++) {
sb.Append (string.Format ("{0:X2}", lineBytes[i]));
if (i % Editor.Options.GroupBytes == 0)
sb.Append (" "); // \t
}
layout.Text = sb.ToString ();
Margin.LayoutWrapper result = new LayoutWrapper (layout);
if (Data.IsSomethingSelected) {
ISegment selection = Data.MainSelection.Segment;
HandleSelection (selection.Offset, selection.EndOffset, startOffset, endOffset, null, delegate(long start, long end) {
result.Layout.SetForeground (Style.Selection, (int)(start - startOffset) * 3, (int)(end - start) * 3 - 1);
result.Layout.SetBackgound (Style.SelectionBg, (int)(start - startOffset) * 3, (int)(end - start) * 3 - 1);
});
}
return result;
}