aboutsummaryrefslogtreecommitdiffstatsci
path: root/Samples/CrowIDE/src/Editors/CodeBuffer
diff options
context:
space:
mode:
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>2020-05-13 10:09:01 +0200
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>2020-05-13 10:09:01 +0200
commit74d1288c9990bb251b7097b225891bafdc6758af (patch)
tree8173afa55887a46e9ef44076498be725c5b33ad1 /Samples/CrowIDE/src/Editors/CodeBuffer
parenta73c8383e6ea636672a3bdb07e084260538fc68a (diff)
removed splitted CrowIDE
Diffstat (limited to 'Samples/CrowIDE/src/Editors/CodeBuffer')
-rw-r--r--Samples/CrowIDE/src/Editors/CodeBuffer/CodeBuffer.cs530
-rw-r--r--Samples/CrowIDE/src/Editors/CodeBuffer/CodeBufferEventArgs.cs20
-rw-r--r--Samples/CrowIDE/src/Editors/CodeBuffer/CodeLine.cs82
-rw-r--r--Samples/CrowIDE/src/Editors/CodeBuffer/Node.cs36
-rw-r--r--Samples/CrowIDE/src/Editors/CodeBuffer/TextBuffer.cs527
-rw-r--r--Samples/CrowIDE/src/Editors/CodeBuffer/TextBufferEventArgs.cs20
-rw-r--r--Samples/CrowIDE/src/Editors/CodeBuffer/TextEditor.cs699
-rw-r--r--Samples/CrowIDE/src/Editors/CodeBuffer/TextFormatting.cs19
-rw-r--r--Samples/CrowIDE/src/Editors/CodeBuffer/Token.cs71
9 files changed, 0 insertions, 2004 deletions
diff --git a/Samples/CrowIDE/src/Editors/CodeBuffer/CodeBuffer.cs b/Samples/CrowIDE/src/Editors/CodeBuffer/CodeBuffer.cs
deleted file mode 100644
index 7d5efec9..00000000
--- a/Samples/CrowIDE/src/Editors/CodeBuffer/CodeBuffer.cs
+++ /dev/null
@@ -1,530 +0,0 @@
-//
-// CodeTextBuffer.cs
-//
-// Author:
-// Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
-//
-// Copyright (c) 2017 jp
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see <http://www.gnu.org/licenses/>.
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text.RegularExpressions;
-using System.Diagnostics;
-using System.Threading;
-
-namespace Crow.Coding
-{
- /// <summary>
- /// Code buffer, lines are arranged in a List<string>, new line chars are removed during string.split on '\n...',
- /// </summary>
- public class CodeBuffer
- {
- public ReaderWriterLockSlim editMutex = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
-
- //those events are handled in SourceEditor to help keeping sync between textbuffer,parser and editor.
- //modified lines are marked for reparse
- #region Events
- public event EventHandler<CodeBufferEventArgs> LineUpadateEvent;
- public event EventHandler<CodeBufferEventArgs> LineRemoveEvent;
- public event EventHandler<CodeBufferEventArgs> LineAdditionEvent;
- public event EventHandler<CodeBufferEventArgs> FoldingEvent;
- public event EventHandler BufferCleared;
- public event EventHandler SelectionChanged;
- public event EventHandler PositionChanged;
- #endregion
-
- string lineBreak = Interface.LineBreak;
- List<CodeLine> lines = new List<CodeLine>();
- public int longestLineIdx = 0;
- public int longestLineCharCount = 0;
- /// <summary>
- /// real position in char arrays, tab = 1 char
- /// </summary>
- int _currentLine = 0;
- int _currentCol = 0;
-
- public int LineCount { get { return lines.Count;}}
- public int IndexOf (CodeLine cl) {
- return lines.IndexOf (cl);
- }
-
- public CodeLine this[int i]
- {
- get { return i < LineCount ? lines[i] : null; }
- set {
- if (lines [i] == value)
- return;
- editMutex.EnterWriteLock ();
- lines [i] = value;
- editMutex.ExitWriteLock ();
- LineUpadateEvent.Raise (this, new CodeBufferEventArgs (i));
- }
- }
-
- public void RemoveAt(int i){
- editMutex.EnterWriteLock ();
- lines.RemoveAt (i);
- editMutex.ExitWriteLock ();
- LineRemoveEvent.Raise (this, new CodeBufferEventArgs (i));
- }
- public void Insert(int i, string item){
- editMutex.EnterWriteLock ();
- lines.Insert (i, item);
- editMutex.ExitWriteLock ();
- LineAdditionEvent.Raise (this, new CodeBufferEventArgs (i));
- }
- public void Add(CodeLine item){
- editMutex.EnterWriteLock ();
- lines.Add (item);
- editMutex.ExitWriteLock ();
- LineAdditionEvent.Raise (this, new CodeBufferEventArgs (lines.Count - 1));
- }
- public void AddRange (string[] items){
- int start = lines.Count;
- editMutex.EnterWriteLock ();
- for (int i = 0; i < items.Length; i++)
- lines.Add (items [i]);
- editMutex.ExitWriteLock ();
- LineAdditionEvent.Raise (this, new CodeBufferEventArgs (start, items.Length));
- }
- public void AddRange (CodeLine[] items){
- int start = lines.Count;
- editMutex.EnterWriteLock ();
- lines.AddRange (items);
- editMutex.ExitWriteLock ();
- LineAdditionEvent.Raise (this, new CodeBufferEventArgs (start, items.Length));
- }
- public void Clear () {
- editMutex.EnterWriteLock ();
- longestLineCharCount = 0;
- lines.Clear ();
- editMutex.ExitWriteLock ();
- BufferCleared.Raise (this, null);
- }
- public void UpdateLine(int i, string newContent){
- editMutex.EnterWriteLock ();
- this [i].Content = newContent;
- editMutex.ExitWriteLock ();
- LineUpadateEvent.Raise (this, new CodeBufferEventArgs (i));
- }
- public void AppenedLine(int i, string newContent){
- editMutex.EnterWriteLock ();
- this [i].Content += newContent;
- editMutex.ExitWriteLock ();
- LineUpadateEvent.Raise (this, new CodeBufferEventArgs (i));
- }
- public void RemoveLeadingTab (int l) {
- if (this [l] [0] == '\t') {
- UpdateLine (l, this [l].Content.Substring (1));
- return;
- }
- int i = 0;
- while (i < Interface.TabSize) {
- if (this [l] [i] != ' ')
- break;
- i++;
- }
- if (i > 0)
- UpdateLine (l, this [l].Content.Substring (i));
- }
- public void ToogleFolding (int line) {
- if (!this [line].IsFoldable)
- return;
- editMutex.EnterWriteLock ();
- this [line].IsFolded = !this [line].IsFolded;
- editMutex.ExitWriteLock ();
- FoldingEvent.Raise (this, new CodeBufferEventArgs (line));
- }
- public void Load(string rawSource, string lineBrkRegex = @"\r\n|\r|\n|\\\n") {
- this.Clear();
-
- if (string.IsNullOrEmpty (rawSource))
- return;
-
- AddRange (Regex.Split (rawSource, lineBrkRegex));
-
- lineBreak = detectLineBreakKind (rawSource);
- }
-
- /// <summary>
- /// Finds the longest visual line as printed on screen with tabulation replaced with n spaces
- /// </summary>
- public void FindLongestVisualLine(){
- longestLineCharCount = 0;
- editMutex.EnterReadLock ();
- for (int i = 0; i < this.LineCount; i++) {
- if (lines[i].PrintableLength > longestLineCharCount) {
- longestLineCharCount = lines[i].PrintableLength;
- longestLineIdx = i;
- }
- }
- editMutex.ExitReadLock ();
- //Debug.WriteLine ("Longest line: {0}->{1}", longestLineIdx, longestLineCharCount);
- }
- /// <summary> line break could be '\r' or '\n' or '\r\n' </summary>
- static string detectLineBreakKind(string buffer){
- string strLB = "";
-
- if (string.IsNullOrEmpty(buffer))
- return Interface.LineBreak;
- int i = 0;
- while ( i < buffer.Length) {
- if (buffer [i] == '\r') {
- strLB += '\r';
- i++;
- }
- if (i < buffer.Length) {
- if (buffer [i] == '\r')
- return "\r";
- if (buffer[i] == '\n')
- strLB += '\n';
- }
- if (!string.IsNullOrEmpty (strLB))
- return strLB;
- i++;
- }
- return Interface.LineBreak;
- }
- /// <summary>
- /// return all lines with linebreaks
- /// </summary>
- public string FullText{
- get {
- if (lines.Count == 0)
- return "";
- string tmp = "";
- editMutex.EnterReadLock ();
- for (int i = 0; i < lines.Count -1; i++)
- tmp += lines [i].Content + this.lineBreak;
- tmp += lines [lines.Count - 1].Content;
- editMutex.ExitReadLock ();
- return tmp;
- }
- }
-
- /// <summary>
- /// unfolded and not in folds line count
- /// </summary>
- public int UnfoldedLines {
- get {
- int i = 0, vl = 0;
- editMutex.EnterReadLock ();
- while (i < LineCount) {
- if (this [i].IsFolded) {
- i = GetEndNodeIndex (i);
- if (i < 0) {
- Console.WriteLine ("error folding");
- break;
- }
- }
- i++;
- vl++;
- }
- editMutex.ExitReadLock ();
- //Debug.WriteLine ("unfolded lines: " + vl);
- return vl;
- }
- }
-
- /// <summary>
- /// convert visual position to buffer position
- /// </summary>
- Point getBuffPos (Point visualPos) {
- int i = 0;
- int buffCol = 0;
- while (i < visualPos.X) {
- if (this [visualPos.Y] [buffCol] == '\t')
- i += Interface.TabSize;
- else
- i++;
- buffCol++;
- }
- return new Point (buffCol, visualPos.Y);
- }
-
- public int GetEndNodeIndex (int line) {
- return IndexOf (this [line].SyntacticNode.EndLine);
- }
-
- int ConverteTabulatedPosOfCurLine (int column) {
- int tmp = 0;
- int i = 0;
- while (i < lines [_currentLine].Content.Length){
- if (lines [_currentLine].Content [i] == '\t')
- tmp += 4;
- else
- tmp++;
- if (tmp > column)
- break;
- i++;
- }
- return i;
- }
-
- public int CurrentTabulatedColumn {
- get {
- return lines [_currentLine].Content.Substring (0, _currentCol).
- Replace ("\t", new String (' ', Interface.TabSize)).Length;
- }
- }
- /// <summary>
- /// Gets visual position computed from actual buffer position
- /// </summary>
-// public Point TabulatedPosition {
-// get { return new Point (TabulatedColumn, _currentLine); }
-// }
- /// <summary>
- /// set buffer current position from visual position
- /// </summary>
-// public void SetBufferPos(Point tabulatedPosition) {
-// CurrentPosition = getBuffPos(tabulatedPosition);
-// }
-
- #region Editing and moving cursor
- Point selStartPos = -1; //selection start (row,column)
- Point selEndPos = -1; //selection end (row,column)
-
- public bool SelectionInProgress { get { return selStartPos >= 0; }}
- public void SetSelStartPos () {
- selStartPos = selEndPos = CurrentPosition;
- SelectionChanged.Raise (this, null);
- }
- public void SetSelEndPos () {
- selEndPos = CurrentPosition;
- SelectionChanged.Raise (this, null);
- }
- public void SetSelectionOnFullLines () {
- if (!SelectionInProgress)
- return;
- Point s = new Point (0, SelectionStart.Y);
- Point e = new Point (this [SelectionEnd.Y].Length, SelectionEnd.Y);
- selStartPos = s;
- selEndPos = e;
- SelectionChanged.Raise (this, null);
- }
- /// <summary>
- /// Set selection in buffer to -1, empty selection
- /// </summary>
- public void ResetSelection () {
- selStartPos = selEndPos = -1;
- SelectionChanged.Raise (this, null);
- }
-
- public string SelectedText {
- get {
- if (SelectionIsEmpty)
- return "";
- Point selStart = SelectionStart;
- Point selEnd = SelectionEnd;
- if (selStart.Y == selEnd.Y)
- return this [selStart.Y].Content.Substring (selStart.X, selEnd.X - selStart.X);
- string tmp = "";
- tmp = this [selStart.Y].Content.Substring (selStart.X);
- for (int l = selStart.Y + 1; l < selEnd.Y; l++) {
- tmp += Interface.LineBreak + this [l].Content;
- }
- tmp += Interface.LineBreak + this [selEnd.Y].Content.Substring (0, selEnd.X);
- return tmp;
- }
- }
- /// <summary>
- /// ordered selection start and end positions in char units
- /// </summary>
- public Point SelectionStart {
- get { return selEndPos < 0 || selStartPos.Y < selEndPos.Y ? selStartPos :
- selStartPos.Y > selEndPos.Y ? selEndPos :
- selStartPos.X < selEndPos.X ? selStartPos : selEndPos; }
- }
- public Point SelectionEnd {
- get { return selEndPos < 0 || selStartPos.Y > selEndPos.Y ? selStartPos :
- selStartPos.Y < selEndPos.Y ? selEndPos :
- selStartPos.X > selEndPos.X ? selStartPos : selEndPos; }
- }
- public bool SelectionIsEmpty
- { get { return selEndPos == selStartPos; } }
- int requestedColumn = -1;
- /// <summary>
- /// Current column in buffer coordinate, tabulation = 1 char
- /// </summary>
- public int CurrentColumn{
- get { return _currentCol; }
- set {
- if (value == _currentCol)
- return;
-
- editMutex.EnterReadLock ();
-
- if (value < 0)
- _currentCol = 0;
- else if (value > lines [_currentLine].Length)
- _currentCol = lines [_currentLine].Length;
- else
- _currentCol = value;
-
- requestedColumn = CurrentTabulatedColumn;
-
- editMutex.ExitReadLock ();
-
- PositionChanged.Raise (this, null);
- }
- }
- /// <summary>
- /// Current row in buffer coordinate, tabulation = 1 char
- /// </summary>
- public int CurrentLine{
- get { return _currentLine; }
- set {
- if (value == _currentLine)
- return;
-
- editMutex.EnterReadLock ();
-
- if (LineCount == 0)
- _currentLine = 0;
- else if (value >= lines.Count)
- _currentLine = lines.Count-1;
- else if (value < 0)
- _currentLine = 0;
- else
- _currentLine = value;
-// if (_currentCol < 0)
-// requestedColumn = tabu _currentCol;
- int tabulatedRequestedCol = ConverteTabulatedPosOfCurLine(requestedColumn);
- if (requestedColumn > lines [_currentLine].PrintableLength)
- _currentCol = lines [_currentLine].Length;
- else
- //_currentCol = requestedColumn;
- _currentCol = tabulatedRequestedCol;
- //Debug.WriteLine ("buff cur line: " + _currentLine);
-
- editMutex.ExitReadLock();
-
- PositionChanged.Raise (this, null);
- }
- }
- public CodeLine CurrentCodeLine {
- get { return this [_currentLine]; }
- }
- /// <summary>
- /// Current position in buffer coordinate, tabulation = 1 char
- /// </summary>
- public Point CurrentPosition {
- get { return new Point(CurrentColumn, CurrentLine); }
-// set {
-// _currentCol = value.X;
-// _currentLine = value.Y;
-// }
- }
- /// <summary>
- /// get char at current position in buffer
- /// </summary>
- protected Char CurrentChar { get { return lines [CurrentLine] [CurrentColumn]; } }
-
- public void GotoWordStart(){
- if (this[CurrentLine].Length == 0)
- return;
- CurrentColumn--;
- //skip white spaces
- while (!char.IsLetterOrDigit (this.CurrentChar) && CurrentColumn > 0)
- CurrentColumn--;
- while (char.IsLetterOrDigit (this.CurrentChar) && CurrentColumn > 0)
- CurrentColumn--;
- if (!char.IsLetterOrDigit (this.CurrentChar))
- CurrentColumn++;
- }
- public void GotoWordEnd(){
- //skip white spaces
- if (CurrentColumn >= this [CurrentLine].Length - 1)
- return;
- while (!char.IsLetterOrDigit (this.CurrentChar) && CurrentColumn < this [CurrentLine].Length-1)
- CurrentColumn++;
- while (char.IsLetterOrDigit (this.CurrentChar) && CurrentColumn < this [CurrentLine].Length-1)
- CurrentColumn++;
- if (char.IsLetterOrDigit (this.CurrentChar))
- CurrentColumn++;
- }
- public void DeleteChar()
- {
- editMutex.EnterWriteLock ();
- if (SelectionIsEmpty) {
- if (CurrentColumn == 0) {
- if (CurrentLine == 0) {
- editMutex.ExitWriteLock ();
- return;
- }
- CurrentLine--;
- CurrentColumn = this [CurrentLine].Length;
- AppenedLine (CurrentLine, this [CurrentLine + 1].Content);
- RemoveAt (CurrentLine + 1);
- editMutex.ExitWriteLock ();
- return;
- }
- CurrentColumn--;
- UpdateLine (CurrentLine, this [CurrentLine].Content.Remove (CurrentColumn, 1));
- } else {
- int linesToRemove = SelectionEnd.Y - SelectionStart.Y + 1;
- int l = SelectionStart.Y;
-
- if (linesToRemove > 0) {
- UpdateLine (l, this [l].Content.Remove (SelectionStart.X, this [l].Length - SelectionStart.X) +
- this [SelectionEnd.Y].Content.Substring (SelectionEnd.X, this [SelectionEnd.Y].Length - SelectionEnd.X));
- l++;
- for (int c = 0; c < linesToRemove - 1; c++)
- RemoveAt (l);
- CurrentLine = SelectionStart.Y;
- CurrentColumn = SelectionStart.X;
- } else
- UpdateLine (l, this [l].Content.Remove (SelectionStart.X, SelectionEnd.X - SelectionStart.X));
- CurrentColumn = SelectionStart.X;
- ResetSelection ();
- }
- editMutex.ExitWriteLock ();
- }
- /// <summary>
- /// Insert new string at caret position, should be sure no line break is inside.
- /// </summary>
- /// <param name="str">String.</param>
- public void Insert(string str)
- {
- if (!SelectionIsEmpty)
- this.DeleteChar ();
- string[] strLines = Regex.Split (str, "\r\n|\r|\n|" + @"\\n").ToArray();
- UpdateLine (CurrentLine, this [CurrentLine].Content.Insert (CurrentColumn, strLines[0]));
- CurrentColumn += strLines[0].Length;
- for (int i = 1; i < strLines.Length; i++) {
- InsertLineBreak ();
- UpdateLine (CurrentLine, this [CurrentLine].Content.Insert (CurrentColumn, strLines[i]));
- CurrentColumn += strLines[i].Length;
- }
- }
- /// <summary>
- /// Insert a line break.
- /// </summary>
- public void InsertLineBreak()
- {
- if (CurrentColumn > 0) {
- Insert (CurrentLine + 1, this [CurrentLine].Content.Substring (CurrentColumn));
- UpdateLine (CurrentLine, this [CurrentLine].Content.Substring (0, CurrentColumn));
- } else
- Insert(CurrentLine, "");
-
- CurrentColumn = 0;
- CurrentLine++;
- }
- #endregion
- }
-}
-
diff --git a/Samples/CrowIDE/src/Editors/CodeBuffer/CodeBufferEventArgs.cs b/Samples/CrowIDE/src/Editors/CodeBuffer/CodeBufferEventArgs.cs
deleted file mode 100644
index 07dd25b6..00000000
--- a/Samples/CrowIDE/src/Editors/CodeBuffer/CodeBufferEventArgs.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-using System;
-
-namespace Crow.Coding
-{
- public class CodeBufferEventArgs : EventArgs {
- public int LineStart;
- public int LineCount;
-
- public CodeBufferEventArgs(int lineNumber) {
- LineStart = lineNumber;
- LineCount = 1;
- }
- public CodeBufferEventArgs(int lineStart, int lineCount) {
- LineStart = lineStart;
- LineCount = lineCount;
- }
- }
-
-}
-
diff --git a/Samples/CrowIDE/src/Editors/CodeBuffer/CodeLine.cs b/Samples/CrowIDE/src/Editors/CodeBuffer/CodeLine.cs
deleted file mode 100644
index 23f43fba..00000000
--- a/Samples/CrowIDE/src/Editors/CodeBuffer/CodeLine.cs
+++ /dev/null
@@ -1,82 +0,0 @@
-using System;
-using System.Text;
-using System.Collections.Generic;
-using System.Linq;
-
-namespace Crow.Coding
-{
- public class CodeLine
- {
- public string Content;
- public List<Token> Tokens;
- public int EndingState = 0;
- public Node SyntacticNode;
- public ParserException exception;
-
- public CodeLine (string _content){
- Content = _content;
- Tokens = null;
- exception = null;
- }
-
- public char this[int i]
- {
- get { return Content[i]; }
- set {
- if (Content [i] == value)
- return;
- StringBuilder sb = new StringBuilder(Content);
- sb[i] = value;
- Content = sb.ToString();
- Tokens = null;
- //LineUpadateEvent.Raise (this, new CodeBufferEventArgs (i));
- }
- }
- public bool IsFoldable { get { return SyntacticNode == null ? false :
- SyntacticNode.EndLine != SyntacticNode.StartLine && SyntacticNode.EndLine != null; } }
- public int FoldingLevel { get { return IsFoldable ? SyntacticNode.Level : 0; } }
- public bool IsFolded = false;
- public bool IsParsed {
- get { return Tokens != null; }
- }
- public string PrintableContent {
- get {
- return string.IsNullOrEmpty (Content) ? "" : Content.Replace ("\t", new String (' ', Interface.TabSize));
- }
- }
- public int PrintableLength {
- get {
- return PrintableContent.Length;
- }
- }
- public int Length {
- get {
- return string.IsNullOrEmpty (Content) ? 0 : Content.Length;
- }
- }
- public int FirstNonBlankTokIndex {
- get { return Tokens == null ? -1 : Tokens.FindIndex (tk=>tk.Type != BufferParser.TokenType.WhiteSpace); }
- }
-
- public void SetLineInError (ParserException ex) {
- Tokens = null;
- exception = ex;
- }
-
-// public static implicit operator string(CodeLine sl) {
-// return sl == null ? "" : sl.Content;
-// }
- public static implicit operator CodeLine(string s) {
- return new CodeLine(s);
- }
- public static bool operator ==(string s1, CodeLine s2)
- {
- return string.Equals (s1, s2.Content);
- }
- public static bool operator !=(string s1, CodeLine s2)
- {
- return !string.Equals (s1, s2.Content);
- }
- }
-}
-
diff --git a/Samples/CrowIDE/src/Editors/CodeBuffer/Node.cs b/Samples/CrowIDE/src/Editors/CodeBuffer/Node.cs
deleted file mode 100644
index 9db55428..00000000
--- a/Samples/CrowIDE/src/Editors/CodeBuffer/Node.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System;
-using System.Collections.Generic;
-
-namespace Crow.Coding
-{
- public class Node
- {
- public Node Parent;
- public string Name;
- public string Type;
- public CodeLine StartLine;
- public CodeLine EndLine;
- public Dictionary<string,string> Attributes = new Dictionary<string, string> ();
-
- public List<Node> Children = new List<Node>();
-
- public Node ()
- {
- }
-
- public void AddChild (Node child) {
- child.Parent = this;
- Children.Add (child);
- }
-
- public int Level {
- get { return Parent == null ? 1 : Parent.Level + 1; }
- }
-
- public override string ToString ()
- {
- return string.Format ("Name:{0}, Type:{1}\n\tparent:{2}", Name, Type, Parent);
- }
- }
-}
-
diff --git a/Samples/CrowIDE/src/Editors/CodeBuffer/TextBuffer.cs b/Samples/CrowIDE/src/Editors/CodeBuffer/TextBuffer.cs
deleted file mode 100644
index e8c87182..00000000
--- a/Samples/CrowIDE/src/Editors/CodeBuffer/TextBuffer.cs
+++ /dev/null
@@ -1,527 +0,0 @@
-//
-// CodeTextBuffer.cs
-//
-// Author:
-// Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
-//
-// Copyright (c) 2017 jp
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see <http://www.gnu.org/licenses/>.
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text.RegularExpressions;
-using System.Diagnostics;
-using System.Threading;
-using System.Text;
-
-namespace Crow.Text
-{
- /// <summary>
- /// Code buffer, lines are arranged in a List<string>, new line chars are removed during string.split on '\n...',
- /// </summary>
- public class TextBuffer
- {
- public ReaderWriterLockSlim editMutex = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
- static Regex slb = new Regex ("\\n");//single char line break used internaly
- Regex reghexLineBrk = new Regex(@"\r\n|\r|\n|\\\n");//original text line break regex
-
- #region Events
- public event EventHandler<TextBufferEventArgs> LineUpadateEvent;
- public event EventHandler<TextBufferEventArgs> LineRemoveEvent;
- public event EventHandler<TextBufferEventArgs> LineAdditionEvent;
- public event EventHandler BufferCleared;
- public event EventHandler SelectionChanged;
- public event EventHandler PositionChanged;
- #endregion
-
- StringBuilder buffer = new StringBuilder();
- string lineBreak = Interface.LineBreak;//detected linebreak kind in original source
- List<int> lineLength = new List<int>();//line length table
- /// <summary>
- /// real position in char arrays, tab = 1 char
- /// </summary>
- int _currentLine = 0;
- int _currentCol = 0;
-
- /// <summary>
- /// Gets the total line count.
- /// </summary>
- public int LineCount { get { return lineLength.Count;}}
-
- /// <summary>
- /// get a substring in the buffer
- /// </summary>
- /// <returns>a new string</returns>
- /// <param name="idx">absolute index in the buffer</param>
- /// <param name="length">length of the substring</param>
- public string GetSubString (int idx, int length){
- return buffer.ToString (idx, length);
- }
- /// <summary>
- /// Gets length of a line.
- /// </summary>
- /// <returns>length of line</returns>
- /// <param name="lineIdx">line nuber</param>
- public int GetLineLength (int lineIdx) {
- return lineLength [lineIdx];
- }
- /// <summary>
- /// get a single charactere in the buffer
- /// </summary>
- /// <returns>a single char</returns>
- /// <param name="idx">absolute index in the buffer</param>
- public char GetCharAt (int idx){
- return buffer [idx];
- }
- /// <summary>
- /// return full text with original line breaks
- /// </summary>
- /// <value>a string containing the full text</value>
- public string FullText {
- get { return buffer.Replace("\n", lineBreak).ToString (); }
- set {
- Load (value);
- }
- }
- /// <summary>
- /// Gets the buffer pointer of a line
- /// </summary>
- /// <returns>absolute index of the line in the buffer</returns>
- /// <param name="i">line number</param>
- public int GetBufferIndexOfLine (int i) {
- int ptr = 0;
- editMutex.EnterReadLock ();
- for (int j = 0; j < i; j++) {
- ptr += lineLength [j];
- }
- editMutex.ExitReadLock ();
- return ptr;
- }
- /// <summary>
- /// Gets the buffer pointer for the current position
- /// </summary>
- /// <value>absolute index in the buffer of current position</value>
- public int BufferIndexOfCurrentPosition {
- get {return GetBufferIndexOfLine (_currentLine) + _currentCol;}
- }
- public int this[int i]
- {
- get {
- int ptr = 0;
- editMutex.EnterReadLock ();
- for (int j = 0; j < i; j++) {
- ptr += lineLength [j];
- }
- editMutex.ExitReadLock ();
- return ptr;
- }
- }
- /// <summary>
- /// remove line number i
- /// </summary>
- /// <param name="i">index of the line</param>
- public void RemoveLine(int i){
- editMutex.EnterWriteLock ();
- buffer.Remove (GetBufferIndexOfLine (i), lineLength [i]);
- lineLength.RemoveAt (i);
- editMutex.ExitWriteLock ();
- LineRemoveEvent.Raise (this, new TextBufferEventArgs (i));
- }
- /// <summary>
- /// insert string without linebreaks at position i in buff
- /// </summary>
- /// <param name="i">absolute index in the buffer</param>
- /// <param name="str">linebreak free string</param>
- public void InsertAt(int i, string str){
- editMutex.EnterWriteLock ();
- buffer.Insert (this [i], str);
- lineLength.Insert (i, str.Length);
- editMutex.ExitWriteLock ();
- LineAdditionEvent.Raise (this, new TextBufferEventArgs (i));
- }
- public void AddLine(string str){
- editMutex.EnterWriteLock ();
- if (lineLength.LastOrDefault() == 0) {
- buffer.Append (str);
- lineLength [lineLength.Count - 1] = str.Length;
- lineLength.Add (0);
- }
- editMutex.ExitWriteLock ();
- LineAdditionEvent.Raise (this, new TextBufferEventArgs (lineLength.Count - 1));
- }
- public void AddRange (string[] items){
- int start = lineLength.Count;
- editMutex.EnterWriteLock ();
- for (int i = 0; i < items.Length; i++)
- AddLine (items [i]);
- editMutex.ExitWriteLock ();
- LineAdditionEvent.Raise (this, new TextBufferEventArgs (start, items.Length));
- }
- public void Clear () {
- editMutex.EnterWriteLock ();
- lineLength.Clear ();
- buffer.Clear ();
- editMutex.ExitWriteLock ();
- BufferCleared.Raise (this, null);
- }
- public void UpdateLine(int i, string newContent){
- editMutex.EnterWriteLock ();
- int ptrL = this [i];
- buffer.Remove (ptrL, lineLength [i]);
- buffer.Insert (ptrL, newContent);
- lineLength [i] = newContent.Length;
- editMutex.ExitWriteLock ();
- LineUpadateEvent.Raise (this, new TextBufferEventArgs (i));
- }
- public void AppenedLine(int i, string newContent){
- editMutex.EnterWriteLock ();
- int ptr = this [i] + lineLength [i];
- if (i < LineCount - 1)
- ptr--;
- buffer.Insert(ptr, newContent);
- lineLength [i] += newContent.Length;
- editMutex.ExitWriteLock ();
- LineUpadateEvent.Raise (this, new TextBufferEventArgs (i));
- }
- /// <summary>
- /// Insert new string at caret position, should be sure no line break is inside.
- /// </summary>
- /// <param name="str">String.</param>
- public void InsertAt(string str)
- {
- if (!SelectionIsEmpty)
- this.Delete ();
-
- editMutex.EnterWriteLock ();
-
- string tmp = reghexLineBrk.Replace (str, "\n");//use single char line break in buffer
- int buffPtr = this [CurrentLine] + CurrentColumn;
- buffer.Insert (buffPtr, tmp);
-
- int lPtr = CurrentLine, strPtr = 0;
- int remainingLength = lineLength [lPtr] - CurrentColumn;
- lineLength [lPtr] = CurrentColumn;
- foreach (Match match in slb.Matches(tmp))
- {
- lineLength [lPtr] += match.Index + 1 - strPtr;
- lPtr++;
- lineLength.Insert (lPtr, 0);
- strPtr = match.Index + 1;
- //CurrentLine++;
- }
- remainingLength += tmp.Length - strPtr;
- lineLength [lPtr] += remainingLength;
-
- CurrentLine = lPtr;
- if (strPtr == 0)
- CurrentColumn += tmp.Length;
- else
- CurrentColumn = tmp.Length - strPtr;
-
- editMutex.ExitWriteLock ();
- if (strPtr>0)
- LineAdditionEvent.Raise (this, null);
- else
- LineUpadateEvent.Raise (this, null);
- }
- /// <summary>
- /// Insert a line break.
- /// </summary>
- public void InsertLineBreak()
- {
- editMutex.EnterWriteLock ();
- buffer.Insert (this [CurrentLine] + CurrentColumn, '\n');
- int lgdiff = lineLength [CurrentLine] - CurrentColumn;
- lineLength.Insert (CurrentLine + 1, lineLength [CurrentLine] - CurrentColumn);
- lineLength [CurrentLine] = CurrentColumn + 1;
- editMutex.ExitWriteLock ();
- LineAdditionEvent.Raise (this, null);
- CurrentColumn = 0;
- CurrentLine++;
- }
- public void Delete()
- {
- editMutex.EnterWriteLock ();
- if (SelectionIsEmpty) {
- if (CurrentColumn == 0) {
- if (CurrentLine == 0) {
- editMutex.ExitWriteLock ();
- return;
- }
-
- buffer.Remove (this [CurrentLine] - 1, 1);
-
- int col = lineLength [CurrentLine - 1] - 1;
- lineLength [CurrentLine - 1] += lineLength [CurrentLine] - 1;
- lineLength.RemoveAt (CurrentLine);
-
- CurrentLine--;
- CurrentColumn = col;
-
- editMutex.ExitWriteLock ();
- LineRemoveEvent.Raise (this, null);
- return;
- }
- CurrentColumn--;
- buffer.Remove (this [CurrentLine] + CurrentColumn, 1);
- lineLength [CurrentLine]--;
- } else {
- int linesToRemove = SelectionEnd.Y - SelectionStart.Y;
- int ptr = this [SelectionStart.Y] + SelectionStart.X;
- int length = lineLength [SelectionStart.Y] - SelectionStart.X;
- int l = 1;
- while (l <= linesToRemove ) {
- length += lineLength [SelectionStart.Y + l];
- l++;
- }
- length -= lineLength [SelectionEnd.Y] - SelectionEnd.X;
- buffer.Remove (ptr, length);
- lineLength [SelectionStart.Y] = SelectionStart.X + lineLength [SelectionEnd.Y] - SelectionEnd.X;
- lineLength.RemoveRange (SelectionStart.Y + 1, linesToRemove);
-
- CurrentLine = SelectionStart.Y;
- CurrentColumn = SelectionStart.X;
- ResetSelection ();
-
- if (linesToRemove > 0)
- LineRemoveEvent.Raise (this, null);
- else
- LineUpadateEvent.Raise (this, null);
- }
- editMutex.ExitWriteLock ();
- }
- public void Load(string rawSource) {
- this.Clear();
-
- if (string.IsNullOrEmpty (rawSource))
- return;
-
- lineBreak = reghexLineBrk.Match (rawSource).Value;//store original line break
- string tmp = reghexLineBrk.Replace (rawSource, "\n");//use single char line break in buffer
- int ptr = 0;
- foreach (Match match in slb.Matches(tmp))
- {
- int l = match.Index + 1;
- int lg = l - ptr;
- lineLength.Add (lg);
- ptr = l;
- }
- lineLength.Add (0);
-
- buffer = new StringBuilder (tmp);
- }
-
-// public int CurrentTabulatedColumn {
-// get {
-//// return lines [_currentLine].Content.Substring (0, _currentCol).
-//// Replace ("\t", new String (' ', Interface.TabSize)).Length;
-// }
-// }
-
- #region moving cursor an selection
- Point selStartPos = -1; //selection start (row,column)
- Point selEndPos = -1; //selection end (row,column)
-
- public bool SelectionInProgress { get { return selStartPos >= 0; }}
- public void SetSelStartPos () {
- selStartPos = selEndPos = CurrentPosition;
- SelectionChanged.Raise (this, null);
- }
- public void SetSelEndPos () {
- selEndPos = CurrentPosition;
- SelectionChanged.Raise (this, null);
- }
- /// <summary>
- /// Set selection in buffer to -1, empty selection
- /// </summary>
- public void ResetSelection () {
- selStartPos = selEndPos = -1;
- SelectionChanged.Raise (this, null);
- }
- /// <summary>
- /// ordered selection start and end positions in char units
- /// </summary>
- public Point SelectionStart {
- get { return selEndPos < 0 || selStartPos.Y < selEndPos.Y ? selStartPos :
- selStartPos.Y > selEndPos.Y ? selEndPos :
- selStartPos.X < selEndPos.X ? selStartPos : selEndPos; }
- }
- public Point SelectionEnd {
- get { return selEndPos < 0 || selStartPos.Y > selEndPos.Y ? selStartPos :
- selStartPos.Y < selEndPos.Y ? selEndPos :
- selStartPos.X > selEndPos.X ? selStartPos : selEndPos; }
- }
- public bool SelectionIsEmpty
- { get { return selEndPos == selStartPos; } }
- /// <summary>
- /// Current column in buffer coordinate, tabulation = 1 char
- /// </summary>
- public int CurrentColumn{
- get { return _currentCol; }
- set {
- if (value == _currentCol)
- return;
-
- editMutex.EnterWriteLock ();
-
- if (value < 0)
- _currentCol = 0;
- else if (value >= lineLength [_currentLine]) {
- if (_currentLine < LineCount -1 && value > lineLength [_currentLine] - 1)
- _currentCol = lineLength [_currentLine] - 1;
- else
- _currentCol = lineLength [_currentLine];
- }else
- _currentCol = value;
-
- editMutex.ExitWriteLock ();
-
- PositionChanged.Raise (this, null);
- }
- }
- /// <summary>
- /// Current row in buffer coordinate, tabulation = 1 char
- /// </summary>
- public int CurrentLine{
- get { return _currentLine; }
- set {
- if (value == _currentLine)
- return;
-
- editMutex.EnterWriteLock ();
-
- if (value >= lineLength.Count)
- _currentLine = lineLength.Count-1;
- else if (value < 0)
- _currentLine = 0;
- else
- _currentLine = value;
-
- int c = _currentCol;
- _currentCol = 0;
- CurrentColumn = c;
-
- editMutex.ExitWriteLock();
-
- PositionChanged.Raise (this, null);
- }
- }
- /// <summary>
- /// Current position in buffer coordinate, tabulation = 1 char
- /// </summary>
- public Point CurrentPosition {
- get { return new Point(CurrentColumn, CurrentLine); }
- }
- /// <summary>
- /// get char at current position in buffer
- /// </summary>
- protected Char CurrentChar { get { return buffer[this [CurrentLine]]; } }
- public string SelectedText {
- get {
- if (SelectionIsEmpty)
- return "";
- Point selStart = SelectionStart;
- Point selEnd = SelectionEnd;
-
- int ptr = this [selStart.Y] + selStart.X;
- int length = lineLength[selStart.Y] - selStart.X;
- for (int i = selStart.Y+1; i <= selEnd.Y; i++)
- length += lineLength [i];
- length -= lineLength[selEnd.Y] - selEnd.X;
-
- return buffer.ToString (ptr, length);
- }
- }
-
- public void GotoWordStart(){
- if (_currentCol == 0)
- MoveLeft ();
- if (_currentCol == 0)
- return;
- int ptrStart = BufferIndexOfCurrentPosition;
- int ptr = ptrStart;
- char c;
- //skip white spaces
- do {
- ptr--;
- c = this.GetCharAt (ptr);
- } while (!char.IsLetterOrDigit (c) && c != '\n' && ptr > 1);
-
- do {
- ptr--;
- c = this.GetCharAt (ptr);
- } while (char.IsLetterOrDigit (c) && c != '\n' && ptr > 1);
-
- if (ptr == 0)
- CurrentColumn = 0;
- else
- CurrentColumn -= ptrStart - ptr - 1;
- }
- public void GotoWordEnd(){
- int limx = GetLineLength (_currentLine);
- if (_currentLine < lineLength.Count - 1)
- limx--;
-
- if (_currentCol == limx) {
- MoveRight ();
- limx = GetLineLength (_currentLine);
- if (_currentLine < lineLength.Count - 1)
- limx--;
- }
-
- int ptrLine = GetBufferIndexOfLine(_currentLine);
- int ptrCol = _currentCol;
-
- char c;
- //skip white spaces
- do {
- c = GetCharAt (ptrLine+ptrCol);
- ptrCol++;
- } while (!char.IsLetterOrDigit (c) && ptrCol < limx);
-
- do {
- c = GetCharAt (ptrLine + ptrCol);
- ptrCol++;
- } while (char.IsLetterOrDigit (c) && ptrCol < limx);
- CurrentColumn = ptrCol - 1;
- }
- /// <summary>
- /// Moves cursor one char to the left, move up if cursor reaches start of line
- /// </summary>
- public void MoveLeft(){
- if (CurrentColumn == 0) {
- CurrentLine--;
- CurrentColumn = int.MaxValue;
- } else
- CurrentColumn--;
- }
- /// <summary>
- /// Moves cursor one char to the right, move down if cursor reaches end of line
- /// </summary>
- public void MoveRight(){
- if (_currentLine < LineCount -1){
- if (CurrentColumn >= lineLength [CurrentLine] - 1) {
- CurrentColumn = 0;
- CurrentLine++;
- return;
- }
- }
- CurrentColumn++;
- }
-
- #endregion
- }
-}
-
diff --git a/Samples/CrowIDE/src/Editors/CodeBuffer/TextBufferEventArgs.cs b/Samples/CrowIDE/src/Editors/CodeBuffer/TextBufferEventArgs.cs
deleted file mode 100644
index 3b67bb1c..00000000
--- a/Samples/CrowIDE/src/Editors/CodeBuffer/TextBufferEventArgs.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-using System;
-
-namespace Crow.Text
-{
- public class TextBufferEventArgs : EventArgs {
- public int LineStart;
- public int LineCount;
-
- public TextBufferEventArgs(int lineNumber) {
- LineStart = lineNumber;
- LineCount = 1;
- }
- public TextBufferEventArgs(int lineStart, int lineCount) {
- LineStart = lineStart;
- LineCount = lineCount;
- }
- }
-
-}
-
diff --git a/Samples/CrowIDE/src/Editors/CodeBuffer/TextEditor.cs b/Samples/CrowIDE/src/Editors/CodeBuffer/TextEditor.cs
deleted file mode 100644
index 8b16b9a8..00000000
--- a/Samples/CrowIDE/src/Editors/CodeBuffer/TextEditor.cs
+++ /dev/null
@@ -1,699 +0,0 @@
-//
-// ScrollingTextBox.cs
-//
-// Author:
-// Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
-//
-// Copyright (c) 2013-2017 Jean-Philippe Bruyère
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-using System;
-using System.ComponentModel;
-using vkvg;
-
-namespace Crow.Text
-{
- /// <summary>
- /// Scrolling text box optimized for monospace fonts, for coding
- /// </summary>
- public class TextEditor : Crow.Coding.Editor
- {
- #region CTOR
- public TextEditor (): base()
- {
- buffer = new TextBuffer ();
- buffer.LineUpadateEvent += Buffer_LineUpadateEvent;
- buffer.LineAdditionEvent += Buffer_LineAdditionEvent;;
- buffer.LineRemoveEvent += Buffer_LineRemoveEvent;
- buffer.BufferCleared += Buffer_BufferCleared;
- buffer.SelectionChanged += Buffer_SelectionChanged;
- buffer.PositionChanged += Buffer_PositionChanged;
- //buffer.Add ("");
- }
- #endregion
-
- string oldSource = "";
- volatile bool isDirty = false;
-
- #region private and protected fields
- int visibleLines = 1;
- int visibleColumns = 1;
-
- TextBuffer buffer;
-
- Color selBackground;
- Color selForeground;
- int selStartCol;
- int selEndCol;
-
- protected Rectangle rText;
- protected FontExtents fe;
- protected TextExtents te;
-
- Point mouseLocalPos;
- bool doubleClicked = false;
- #endregion
-
- /// <summary>
- /// Updates visible line in widget, adapt max scroll y and updatePrintedLines
- /// </summary>
- void updateVisibleLines(){
- visibleLines = (int)Math.Floor ((double)ClientRectangle.Height / (fe.Ascent+fe.Descent));
- NotifyValueChanged ("VisibleLines", visibleLines);
- updateMaxScrollY ();
- RegisterForGraphicUpdate ();
-// System.Diagnostics.Debug.WriteLine ("update visible lines: " + visibleLines);
-// System.Diagnostics.Debug.WriteLine ("update MaxScrollY: " + MaxScrollY);
- }
- void updateVisibleColumns(){
- visibleColumns = (int)Math.Floor ((double)(ClientRectangle.Width)/ fe.MaxXAdvance);
- NotifyValueChanged ("VisibleColumns", visibleColumns);
- RegisterForGraphicUpdate ();
-// System.Diagnostics.Debug.WriteLine ("update visible columns: {0} leftMargin:{1}",visibleColumns, leftMargin);
-// System.Diagnostics.Debug.WriteLine ("update MaxScrollX: " + MaxScrollX);
- }
- void updateMaxScrollX (int longestTabulatedLineLength) {
- MaxScrollX = Math.Max (0, longestTabulatedLineLength - visibleColumns);
- if (longestTabulatedLineLength > 0)
- NotifyValueChanged ("ChildWidthRatio", Slot.Width * visibleColumns / longestTabulatedLineLength);
- }
- void updateMaxScrollY () {
- int lc = buffer.LineCount;
- MaxScrollY = Math.Max (0, lc - visibleLines);
- if (lc > 0)
- NotifyValueChanged ("ChildHeightRatio", Slot.Height * visibleLines / lc);
-
- }
-
-
-
- #region Editor overrides
- protected override void updateEditorFromProjFile ()
- {
- buffer.editMutex.EnterWriteLock ();
- loadSource ();
- buffer.editMutex.ExitWriteLock ();
-
- isDirty = false;
- oldSource = projFile.Source;
- projFile.RegisteredEditors [this] = true;
- }
- protected override void updateProjFileFromEditor ()
- {
- buffer.editMutex.EnterWriteLock ();
- string newsrc = buffer.FullText;
- buffer.editMutex.ExitWriteLock ();
- projFile.UpdateSource (this, newsrc);
- }
- protected override bool EditorIsDirty {
- get { return isDirty; }
- set { isDirty = value; }
- }
- protected override bool IsReady {
- get { return projFile != null && buffer != null; }
- }
- #endregion
-
- #region Buffer events handlers
- void Buffer_BufferCleared (object sender, EventArgs e)
- {
- editorMutex.EnterWriteLock ();
-
- MaxScrollX = MaxScrollY = 0;
- RegisterForGraphicUpdate ();
- notifyPositionChanged ();
- isDirty = true;
-
- editorMutex.ExitWriteLock ();
- }
- void Buffer_LineAdditionEvent (object sender, TextBufferEventArgs e)
- {
- updateMaxScrollY ();
- RegisterForGraphicUpdate ();
- isDirty = true;
- }
- void Buffer_LineRemoveEvent (object sender, TextBufferEventArgs e)
- {
- updateMaxScrollY ();
- RegisterForGraphicUpdate ();
- notifyPositionChanged ();
- isDirty = true;
- }
- void Buffer_LineUpadateEvent (object sender, TextBufferEventArgs e)
- {
- RegisterForGraphicUpdate ();
- notifyPositionChanged ();
- isDirty = true;
- }
- void Buffer_PositionChanged (object sender, EventArgs e)
- {
- int cc = getTabulatedColumn (buffer.CurrentPosition);
-
- if (cc > visibleColumns + ScrollX) {
- ScrollX = cc - visibleColumns;
- } else if (cc < ScrollX)
- ScrollX = cc;
-
- if (buffer.CurrentLine >= visibleLines + ScrollY - 1)
- ScrollY = buffer.CurrentLine - visibleLines + 1;
- else if (buffer.CurrentLine < ScrollY)
- ScrollY = buffer.CurrentLine;
-
- RegisterForGraphicUpdate ();
- notifyPositionChanged ();
- }
-
- void Buffer_SelectionChanged (object sender, EventArgs e)
- {
- RegisterForGraphicUpdate ();
- }
- #endregion
-
- void notifyPositionChanged (){
- try {
- NotifyValueChanged ("CurrentLine", buffer.CurrentLine+1);
- NotifyValueChanged ("CurrentColumn", buffer.CurrentColumn+1);
- } catch (Exception ex) {
- Console.WriteLine (ex.ToString ());
- }
- }
-
- #region Public Crow Properties
- public int CurrentLine{
- get { return buffer == null ? 0 : buffer.CurrentLine+1; }
- set {
- try {
- int l = value - 1;
- if (l == buffer.CurrentLine)
- return;
- buffer.CurrentLine = l;
- } catch (Exception ex) {
- Console.WriteLine ("Error cur column: " + ex.ToString ());
- }
- }
- }
- public int CurrentColumn{
- get { return buffer == null ? 0 : buffer.CurrentColumn+1; }
- set {
- try {
- if (value - 1 == buffer.CurrentColumn)
- return;
- buffer.CurrentColumn = value - 1;
- } catch (Exception ex) {
- Console.WriteLine ("Error cur column: " + ex.ToString ());
- }
- }
- }
- [DefaultValue("Blue")]
- public virtual Color SelectionBackground {
- get { return selBackground; }
- set {
- if (value == selBackground)
- return;
- selBackground = value;
- NotifyValueChanged ("SelectionBackground", selBackground);
- RegisterForRedraw ();
- }
- }
- [DefaultValue("White")]
- public virtual Color SelectionForeground {
- get { return selForeground; }
- set {
- if (value == selForeground)
- return;
- selForeground = value;
- NotifyValueChanged ("SelectionForeground", selForeground);
- RegisterForRedraw ();
- }
- }
- public override int ScrollY {
- get {
- return base.ScrollY;
- }
- set {
- if (value == base.ScrollY)
- return;
- editorMutex.EnterWriteLock ();
- base.ScrollY = value;
- editorMutex.ExitWriteLock ();
- RegisterForGraphicUpdate ();
- }
- }
- #endregion
-
-
- void loadSource () {
- buffer.Load (projFile.Source);
- projFile.RegisteredEditors [this] = true;
- updateMaxScrollY ();
- RegisterForGraphicUpdate ();
- }
-
- int getTabulatedColumn (int col, int line) {
- return buffer.GetSubString (buffer [line],
- buffer.GetLineLength (line)).Substring(0,col).Replace ("\t", new String (' ', Interface.TabSize)).Length;
- }
- int getTabulatedColumn (Point pos) {
- return getTabulatedColumn (pos.X,pos.Y);
- }
-
- #region Drawing
- void drawLines(Context gr, Rectangle cb) {
- int longestTabulatedLine = 0;
- for (int i = 0; i < visibleLines; i++) {
- int lineIndex = i + ScrollY;
- if (lineIndex >= buffer.LineCount)//TODO:need optimize
- break;
-
- double y = cb.Y + (fe.Ascent+fe.Descent) * i, x = cb.X;
-
- int lineLength = buffer.GetLineLength (lineIndex);
- if (lineIndex < buffer.LineCount - 1)//dont print line break
- lineLength--;
- string lstr = buffer.GetSubString (buffer [lineIndex],
- lineLength).Replace ("\t", new String (' ', Interface.TabSize));
-
- int lstrLength = lstr.Length;
- if (lstrLength > longestTabulatedLine)
- longestTabulatedLine = lstrLength;
-
- if (ScrollX < lstrLength)
- lstr = lstr.Substring (ScrollX);
- else
- lstr = "";
-
- gr.MoveTo (x, y + fe.Ascent);
- gr.ShowText (lstr);
- gr.Fill ();
-
- if (!buffer.SelectionIsEmpty && lineIndex >= buffer.SelectionStart.Y && lineIndex <= buffer.SelectionEnd.Y) {
- double rLineX = x,
- rLineY = y,
- rLineW = lstr.Length * fe.MaxXAdvance;
-
- if (lineIndex == buffer.SelectionStart.Y) {
- rLineX += (selStartCol - ScrollX) * fe.MaxXAdvance;
- rLineW -= (selStartCol - ScrollX) * fe.MaxXAdvance;
- }
- if (lineIndex == buffer.SelectionEnd.Y)
- rLineW -= (lstr.Length - selEndCol + ScrollX) * fe.MaxXAdvance;
-
- gr.Save ();
- gr.Operator = Operator.Source;
- gr.Rectangle (rLineX, rLineY, rLineW, (fe.Ascent+fe.Descent));
- gr.SetSourceColor (SelectionBackground);
- gr.FillPreserve ();
- gr.Clip ();
- gr.Operator = Operator.Over;
- gr.SetSourceColor (SelectionForeground);
- gr.MoveTo (x, y + fe.Ascent);
- gr.ShowText (lstr);
- gr.Fill ();
- gr.Restore ();
- }
-
-
- }
-
- updateMaxScrollX(longestTabulatedLine);
- }
- #endregion
-
- #region GraphicObject overrides
- public override Font Font {
- get { return base.Font; }
- set {
- base.Font = value;
-
- using (Surface img = new Surface (IFace.dev, 1, 1)) {
- using (Context gr = new Context (img)) {
- gr.FontFace = Font.Name;
- gr.FontSize = (uint)Font.Size;
-
- fe = gr.FontExtents;
- }
- }
- MaxScrollY = 0;
- RegisterForGraphicUpdate ();
- }
- }
- protected override int measureRawSize(LayoutingType lt)
- {
- if (lt == LayoutingType.Height)
- return (int)Math.Ceiling((fe.Ascent+fe.Descent) * buffer.LineCount) + Margin * 2;
-
- return 0;// (int)(fe.MaxXAdvance * buffer.GetLineLength(buffer.longestLineIdx)) + Margin * 2;
- }
- public override void OnLayoutChanges (LayoutingType layoutType)
- {
- base.OnLayoutChanges (layoutType);
-
- if (layoutType == LayoutingType.Height)
- updateVisibleLines ();
- else if (layoutType == LayoutingType.Width)
- updateVisibleColumns ();
- }
-
- protected override void onDraw (Context gr)
- {
- base.onDraw (gr);
-
- gr.FontFace = Font.Name;
- gr.FontSize = (uint)Font.Size;
- //gr.FontOptions = Interface.FontRenderingOptions;
- //gr.Antialias = Interface.Antialias;
-
- Rectangle cb = ClientRectangle;
-
- Foreground.SetAsSource (gr);
-
- buffer.editMutex.EnterReadLock ();
- editorMutex.EnterReadLock ();
-
- #region draw text cursor
- if (buffer.SelectionInProgress){
- selStartCol = getTabulatedColumn (buffer.SelectionStart);
- selEndCol = getTabulatedColumn (buffer.SelectionEnd);
- }else if (HasFocus && CurrentLine >= 0){
- gr.LineWidth = 1.0;
- double cursorX = cb.X + (getTabulatedColumn(buffer.CurrentPosition) - ScrollX) * fe.MaxXAdvance ;
- double cursorY = cb.Y + (buffer.CurrentLine - ScrollY) * (fe.Ascent+fe.Descent);
- gr.MoveTo (0.5 + cursorX, cursorY);
- gr.LineTo (0.5 + cursorX, cursorY + fe.Ascent+fe.Descent);
- gr.Stroke();
- }
- #endregion
-
- drawLines (gr, cb);
-
- editorMutex.ExitReadLock ();
-
- buffer.editMutex.ExitReadLock ();
-
- }
- #endregion
-
- int getBufferColFromVisualCol (int line, int column) {
- int i = 0;
- int buffCol = 0;
- int buffPtr = buffer [line];
- while (i < column && buffCol < buffer.GetLineLength(line)) {
- if (buffer.GetCharAt(buffPtr + buffCol) == '\t')
- i += Interface.TabSize;
- else
- i++;
- buffCol++;
- }
- return buffCol;
- }
-
-
- #region Mouse handling
-
- int hoverLine = -1;
- public int HoverLine {
- get { return hoverLine; }
- set {
- if (hoverLine == value)
- return;
- hoverLine = value;
- NotifyValueChanged ("HoverLine", hoverLine);
- }
- }
- void updateHoverLine () {
-// int hvl = (int)Math.Max (0, Math.Floor (mouseLocalPos.Y / (fe.Ascent+fe.Descent)));
-// hvl = Math.Min (PrintedLines.Count, hvl);
-// HoverLine = buffer.IndexOf (PrintedLines[hvl]);
- }
- void updateCurrentPosFromMouseLocalPos(){
-
- buffer.CurrentLine = ScrollY + (int)Math.Max (0, Math.Floor (mouseLocalPos.Y / (fe.Ascent+fe.Descent)));
- int curVisualCol = ScrollX + (int)Math.Round ((mouseLocalPos.X) / fe.MaxXAdvance);
- buffer.CurrentColumn = getBufferColFromVisualCol (buffer.CurrentLine, curVisualCol);
- }
-
- public override void onMouseEnter (object sender, MouseMoveEventArgs e)
- {
- base.onMouseEnter (sender, e);
- IFace.MouseCursor = MouseCursor.IBeam;
- }
- public override void onMouseLeave (object sender, MouseMoveEventArgs e)
- {
- base.onMouseLeave (sender, e);
- IFace.MouseCursor = MouseCursor.Arrow;
- }
- public override void onMouseMove (object sender, MouseMoveEventArgs e)
- {
- base.onMouseMove (sender, e);
-
- mouseLocalPos = e.Position - ScreenCoordinates(Slot).TopLeft - ClientRectangle.TopLeft;
-
- updateHoverLine ();
-
- if (e.Mouse.LeftButton == ButtonState.Released || !buffer.SelectionInProgress)
- return;
-
- //mouse is down
- updateCurrentPosFromMouseLocalPos();
- buffer.SetSelEndPos ();
- }
- public override void onMouseDown (object sender, MouseButtonEventArgs e)
- {
- if (!Focusable)
- return;
-
- base.onMouseDown (sender, e);
-
- if (doubleClicked) {
- doubleClicked = false;
- return;
- }
-
- updateCurrentPosFromMouseLocalPos ();
- buffer.SetSelStartPos ();
- }
- public override void onMouseUp (object sender, MouseButtonEventArgs e)
- {
- base.onMouseUp (sender, e);
-
- if (buffer.SelectionIsEmpty)
- buffer.ResetSelection ();
- }
-
- public override void onMouseDoubleClick (object sender, MouseButtonEventArgs e)
- {
- //doubleClicked = true;
- base.onMouseDoubleClick (sender, e);
-
- buffer.GotoWordStart ();
- buffer.SetSelStartPos ();
- buffer.GotoWordEnd ();
- buffer.SetSelEndPos ();
- }
-
- public override void onMouseWheel (object sender, MouseWheelEventArgs e)
- {
- base.onMouseWheel (sender, e);
- }
- #endregion
-
- #region Keyboard handling
- public override void onKeyDown (object sender, KeyEventArgs e)
- {
- //base.onKeyDown (sender, e);
-
- Key key = e.Key;
-
- if (IFace.Ctrl) {
- switch (key) {
- case Key.S:
- projFile.Save ();
- break;
- case Key.W:
- editorMutex.EnterWriteLock ();
- if (IFace.Shift)
- projFile.Redo (null);
- else
- projFile.Undo (null);
- editorMutex.ExitWriteLock ();
- break;
- default:
- Console.WriteLine ("");
- break;
- }
- }
-
- switch (key)
- {
- case Key.Backspace:
- buffer.Delete ();
- break;
- case Key.Delete:
- if (buffer.SelectionIsEmpty)
- buffer.MoveRight ();
-// else if (e.Shift)
-// IFace.Clipboard = buffer.SelectedText;
- buffer.Delete ();
- break;
- case Key.Enter:
- case Key.KeypadEnter:
- if (!buffer.SelectionIsEmpty)
- buffer.Delete ();
- buffer.InsertLineBreak ();
- break;
- case Key.Escape:
- buffer.ResetSelection ();
- break;
- case Key.Home:
- if (IFace.Shift) {
- if (buffer.SelectionIsEmpty)
- buffer.SetSelStartPos ();
- if (IFace.Ctrl)
- buffer.CurrentLine = 0;
- buffer.CurrentColumn = 0;
- buffer.SetSelEndPos ();
- break;
- }
- buffer.ResetSelection ();
- if (IFace.Ctrl)
- buffer.CurrentLine = 0;
- buffer.CurrentColumn = 0;
- break;
- case Key.End:
- if (IFace.Shift) {
- if (buffer.SelectionIsEmpty)
- buffer.SetSelStartPos ();
- if (IFace.Ctrl)
- buffer.CurrentLine = int.MaxValue;
- buffer.CurrentColumn = int.MaxValue;
- buffer.SetSelEndPos ();
- break;
- }
- buffer.ResetSelection ();
- if (IFace.Ctrl)
- buffer.CurrentLine = int.MaxValue;
- buffer.CurrentColumn = int.MaxValue;
- break;
- case Key.Insert:
- if (IFace.Shift)
- buffer.InsertAt (IFace.Clipboard);
- else if (IFace.Ctrl && !buffer.SelectionIsEmpty)
- IFace.Clipboard = buffer.SelectedText;
- break;
- case Key.Left:
- if (IFace.Shift) {
- if (buffer.SelectionIsEmpty)
- buffer.SetSelStartPos ();
- if (IFace.Ctrl)
- buffer.GotoWordStart ();
- else
- buffer.MoveLeft ();
- buffer.SetSelEndPos ();
- break;
- }
- buffer.ResetSelection ();
- if (IFace.Ctrl)
- buffer.GotoWordStart ();
- else
- buffer.MoveLeft();
- break;
- case Key.Right:
- if (IFace.Shift) {
- if (buffer.SelectionIsEmpty)
- buffer.SetSelStartPos ();
- if (IFace.Ctrl)
- buffer.GotoWordEnd ();
- else
- buffer.MoveRight ();
- buffer.SetSelEndPos ();
- break;
- }
- buffer.ResetSelection ();
- if (IFace.Ctrl)
- buffer.GotoWordEnd ();
- else
- buffer.MoveRight ();
- break;
- case Key.Up:
- if (IFace.Shift) {
- if (buffer.SelectionIsEmpty)
- buffer.SetSelStartPos ();
- CurrentLine--;
- buffer.SetSelEndPos ();
- break;
- }
- buffer.ResetSelection ();
- CurrentLine--;
- break;
- case Key.Down:
- if (IFace.Shift) {
- if (buffer.SelectionIsEmpty)
- buffer.SetSelStartPos ();
- CurrentLine++;
- buffer.SetSelEndPos ();
- break;
- }
- buffer.ResetSelection ();
- CurrentLine++;
- break;
- case Key.Menu:
- break;
- case Key.NumLock:
- break;
- case Key.PageDown:
- if (IFace.Shift) {
- if (buffer.SelectionIsEmpty)
- buffer.SetSelStartPos ();
- CurrentLine += visibleLines;
- buffer.SetSelEndPos ();
- break;
- }
- buffer.ResetSelection ();
- CurrentLine += visibleLines;
- break;
- case Key.PageUp:
- if (IFace.Shift) {
- if (buffer.SelectionIsEmpty)
- buffer.SetSelStartPos ();
- CurrentLine -= visibleLines;
- buffer.SetSelEndPos ();
- break;
- }
- buffer.ResetSelection ();
- CurrentLine -= visibleLines;
- break;
- case Key.Tab:
- buffer.InsertAt ("\t");
- break;
- default:
- break;
- }
- RegisterForGraphicUpdate();
- }
- public override void onKeyPress (object sender, KeyPressEventArgs e)
- {
- base.onKeyPress (sender, e);
-
- buffer.InsertAt (e.KeyChar.ToString());
- buffer.ResetSelection ();
- }
- #endregion
- }
-} \ No newline at end of file
diff --git a/Samples/CrowIDE/src/Editors/CodeBuffer/TextFormatting.cs b/Samples/CrowIDE/src/Editors/CodeBuffer/TextFormatting.cs
deleted file mode 100644
index f7b2e518..00000000
--- a/Samples/CrowIDE/src/Editors/CodeBuffer/TextFormatting.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using System;
-
-namespace Crow.Coding
-{
- public struct TextFormatting {
- public Color Foreground;
- public Color Background;
- public bool Bold;
- public bool Italic;
-
- public TextFormatting(Color fg, Color bg, bool bold = false, bool italic = false){
- Foreground = fg;
- Background = bg;
- Bold = bold;
- Italic = italic;
- }
- }
-}
-
diff --git a/Samples/CrowIDE/src/Editors/CodeBuffer/Token.cs b/Samples/CrowIDE/src/Editors/CodeBuffer/Token.cs
deleted file mode 100644
index 8b4df5e5..00000000
--- a/Samples/CrowIDE/src/Editors/CodeBuffer/Token.cs
+++ /dev/null
@@ -1,71 +0,0 @@
-//
-// Token.cs
-//
-// Author:
-// Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
-//
-// Copyright (c) 2017 jp
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see <http://www.gnu.org/licenses/>.
-using System;
-
-namespace Crow.Coding
-{
- public struct Token
- {
- public BufferParser.TokenType Type;
- public string Content;
- public Point Start;
- public Point End;
-
- public string PrintableContent {
- get { return string.IsNullOrEmpty(Content) ? "" : Content.Replace("\t", new String(' ', Interface.TabSize)); }
- }
-
-// public Token (TokenType tokType, string content = ""){
-// Type = tokType;
-// Content = content;
-// }
-
- public bool IsNull { get { return IsEmpty && Type == BufferParser.TokenType.Unknown; }}
- public bool IsEmpty { get { return string.IsNullOrEmpty(Content); }}
-
- public static bool operator == (Token t, System.Enum tt){
- return Convert.ToInt32(t.Type) == Convert.ToInt32(tt);
- }
- public static bool operator != (Token t, System.Enum tt){
- return Convert.ToInt32(t.Type) != Convert.ToInt32(tt);
- }
- public static bool operator == (System.Enum tt, Token t){
- return Convert.ToInt32(t.Type) == Convert.ToInt32(tt);
- }
- public static bool operator != (System.Enum tt, Token t){
- return Convert.ToInt32(t.Type) != Convert.ToInt32(tt);
- }
-
- public static Token operator +(Token t, char c){
- t.Content += c;
- return t;
- }
- public static Token operator +(Token t, string s){
- t.Content += s;
- return t;
- }
- public override string ToString ()
- {
- return string.Format ("[Tok{2}->{3}:{0}: {1}]", Type,Content,Start,End);
- }
- }
-}
-