From 42f64f5d01233f6f4e5c34638578c39a9534be96 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jean-Philippe=20Bruy=C3=A8re?= Date: Wed, 30 Aug 2017 12:48:03 +0200 Subject: [PATCH] selection in token mode --- src/SourceEditor.cs | 111 +++++++++++++++++++++++--------------------- 1 file changed, 58 insertions(+), 53 deletions(-) diff --git a/src/SourceEditor.cs b/src/SourceEditor.cs index 8d904af..123573a 100644 --- a/src/SourceEditor.cs +++ b/src/SourceEditor.cs @@ -54,7 +54,7 @@ namespace Crow { #region CTOR public SourceEditor ():base() - { + { formating.Add ((int)XMLParser.TokenType.AttributeName, new TextFormating (Color.DarkBlue, Color.Transparent)); formating.Add ((int)XMLParser.TokenType.ElementName, new TextFormating (Color.DarkRed, Color.Transparent)); formating.Add ((int)XMLParser.TokenType.ElementStart, new TextFormating (Color.Red, Color.Transparent)); @@ -483,67 +483,72 @@ namespace Crow int curL = i + ScrollY; if (curL >= parser.Tokens.Count) break; - List tokens = parser.Tokens[curL]; - int lPtr = 0; - - for (int t = 0; t < tokens.Count; t++) { - string lstr = tokens [t].Content; - if (lPtr < ScrollX) { - if (lPtr - ScrollX + lstr.Length <= 0) { - lPtr += lstr.Length; - continue; - } - lstr = lstr.Substring (ScrollX - lPtr); - lPtr += ScrollX - lPtr; - } - Color bg = this.Background; - Color fg = this.Foreground; + drawTokenLine (gr, curL, selectionInProgress); + } + } + void drawTokenLine(Context gr, int curL, bool selectionInProgress) { + List tokens = parser.Tokens[curL]; + int lPtr = 0; - if (formating.ContainsKey ((int)tokens [t].Type)) { - TextFormating tf = formating [(int)tokens [t].Type]; - bg = tf.Background; - fg = tf.Foreground; + for (int t = 0; t < tokens.Count; t++) { + string lstr = tokens [t].Content; + if (lPtr < ScrollX) { + if (lPtr - ScrollX + lstr.Length <= 0) { + lPtr += lstr.Length; + continue; } + lstr = lstr.Substring (ScrollX - lPtr); + lPtr += ScrollX - lPtr; + } + Color bg = this.Background; + Color fg = this.Foreground; + Color selbg = this.SelectionBackground; + Color selfg = this.SelectionForeground; + + if (formating.ContainsKey ((int)tokens [t].Type)) { + TextFormating tf = formating [(int)tokens [t].Type]; + bg = tf.Background; + fg = tf.Foreground; + } + + gr.SetSourceColor (fg); - gr.SetSourceColor (fg); + int x = cb.X + (int)((lPtr - ScrollX) * fe.MaxXAdvance); + + gr.MoveTo (x, cb.Y + fe.Ascent + fe.Height * i); + gr.ShowText (lstr); + gr.Fill (); + + if (selectionInProgress && curL >= selectionStart.Y && curL <= selectionEnd.Y && + !(curL == selectionStart.Y && lPtr + lstr.Length <= selectionStart.X) && + !(curL == selectionEnd.Y && selectionEnd.X <= lPtr)) { + + double rLineX = x, + rLineY = cb.Y + i * fe.Height, + rLineW = lstr.Length * fe.MaxXAdvance; - int x = cb.X + (int)((lPtr - ScrollX) * fe.MaxXAdvance); + if ((curL == selectionStart.Y) && (selectionStart.X < lPtr + lstr.Length) && (selectionStart.X > lPtr)) { + rLineX += (selectionStart.X - lPtr) * fe.MaxXAdvance; + rLineW -= (selectionStart.X - lPtr) * fe.MaxXAdvance; + } + if ((curL == selectionEnd.Y) && (selectionEnd.X < lPtr + lstr.Length)) + rLineW = (selectionEnd.X - lPtr) * fe.MaxXAdvance; + gr.Save (); + gr.Operator = Operator.Source; + gr.Rectangle (rLineX, rLineY, rLineW, fe.Height); + gr.SetSourceColor (selbg); + gr.FillPreserve (); + gr.Clip (); + gr.Operator = Operator.Over; + gr.SetSourceColor (selfg); gr.MoveTo (x, cb.Y + fe.Ascent + fe.Height * i); gr.ShowText (lstr); gr.Fill (); - - lPtr += lstr.Length; + gr.Restore (); } - -// if (selectionInProgress && curL >= selectionStart.Y && curL <= selectionEnd.Y) { -// -// double rLineX = cb.X, -// rLineY = cb.Y + i * fe.Height, -// rLineW = lstr.Length * fe.MaxXAdvance; -// -// System.Diagnostics.Debug.WriteLine ("sel start: " + selectionStart + " sel end: " + selectionEnd); -// if (curL == selectionStart.Y) { -// rLineX += (selectionStart.X - ScrollX) * fe.MaxXAdvance; -// rLineW -= selectionStart.X * fe.MaxXAdvance; -// } -// if (curL == selectionEnd.Y) -// rLineW -= (lstr.Length - selectionEnd.X) * fe.MaxXAdvance; -// -// gr.Save (); -// gr.Operator = Operator.Source; -// gr.Rectangle (rLineX, rLineY, rLineW, fe.Height); -// gr.SetSourceColor (SelectionBackground); -// gr.FillPreserve (); -// gr.Clip (); -// gr.Operator = Operator.Over; -// gr.SetSourceColor (SelectionForeground); -// gr.MoveTo (cb.X, cb.Y + fe.Ascent + fe.Height * i); -// gr.ShowText (lstr); -// gr.Fill (); -// gr.Restore (); -// } + lPtr += lstr.Length; } } protected override void onDraw (Context gr) @@ -554,7 +559,7 @@ namespace Crow drawParsed (gr); else draw(gr); - + } #endregion -- 2.47.3