public class SyntaxRichTextBox : System.Windows.Forms.RichTextBox {
private bool m_bDoEvents = true;
private static bool m_bPaint = true;
private string[] m_Keywords = new string[] {
"require", "and", "break", "false",
"in", "local", "nil", "not", "or",
"return", "true", "do", "else", "elseif",
"end", "for", "function", "if", "repeat",
"then", "until", "while"
};
protected override void WndProc(ref System.Windows.Forms.Message m) {
// Tar bort flicker från RichTextBox
if (m.Msg == 0x00f) {
if (m_bPaint)
base.WndProc(ref m);
else
m.Result = IntPtr.Zero;
} else
base.WndProc(ref m);
}
public SyntaxRichTextBox() {
}
protected override void OnKeyDown(KeyEventArgs e) {
base.OnKeyDown(e);
}
protected override void OnTextChanged(EventArgs e) {
if (m_bDoEvents == true) {
m_bPaint = false;
try {
int iCharIndex = GetFirstCharIndexOfCurrentLine();
int iLine = GetLineFromCharIndex(iCharIndex);
int iLength = Lines[iLine].Length;
SyntaxHighlight(iCharIndex, iLength);
} catch {
}
m_bPaint = true;
}
base.OnTextChanged(e);
}
private void FindKeyWord(string sKeyword, Color oColor, int iCharIndex, int iLength) {
int iIndex = Find(sKeyword, iCharIndex, (iCharIndex + iLength), RichTextBoxFinds.MatchCase | RichTextBoxFinds.WholeWord);
while (iIndex >= 0) {
SelectionColor = oColor;
if ((iIndex + sKeyword.Length) < (iCharIndex + iLength)) {
iIndex = Find(sKeyword, iIndex + sKeyword.Length, (iCharIndex + iLength), RichTextBoxFinds.MatchCase | RichTextBoxFinds.WholeWord);
} else {
break;
}
}
}
public void Initialize() {
m_bDoEvents = false;
for (int i = 0; i <>
int chfi = GetFirstCharIndexFromLine(i);
SyntaxHighlight(chfi, Lines[i].Length);
}
m_bDoEvents = true;
}
private void SyntaxHighlight(int iCharIndex, int iLength) {
int index = iCharIndex;
int length = iLength;
int iCursorPos = SelectionStart;
SelectionStart = iCharIndex;
SelectionLength = iLength;
SelectionColor = Color.Black;
foreach (string sKeyword in m_Keywords) {
FindKeyWord(sKeyword, Color.Blue, iCharIndex, iLength);
}
SelectionStart = index;
SelectionLength = length;
// find numbers
Regex rNum = new Regex("[0-9]*");
Match mNum = rNum.Match(SelectedText);
while (mNum.Success) {
if (mNum.Captures.Count > 0) {
string sExp = mNum.Captures[0].Value;
FindKeyWord(sExp, Color.DarkOrchid, iCharIndex, iLength);
}
mNum = mNum.NextMatch();
}
SelectionStart = index;
SelectionLength = length;
// find xml
Regex rXml = new Regex("<[^>]*>");
Match mXml = rXml.Match(SelectedText);
while (mXml.Success) {
if (mXml.Captures.Count > 0) {
string sExp = mXml.Captures[0].Value;
FindKeyWord(sExp, Color.MediumSlateBlue, iCharIndex, iLength);
}
mXml = mXml.NextMatch();
}
// reset
SelectionStart = iCursorPos;
SelectionLength = 0;
SelectionColor = Color.Black;
}
}