I made a code to change the backColor of all richTextBox expressions that begin with an @. It's all okay, though, there is an error that I can not solve. If the first thing I write is @expressao and then I delete everything, when I start to write anything new, it already starts with the backColor changed, and should be normal, without it, not be it something starting with @.
I'm trying to see line by line where that might be the problem, but I can not seem to find it.
Follow the code:
//variável para controlar o índice dos vetores
int ctrlAt = 0;
//flags de controle
Boolean flagAt = false;
//tamanho do texto da richTextBox
int tam = 0;
//variável para controle dos espaços
int last = 5000;
//index dos espaços
int[] spaceIndex = new int[1000];
//index dos @
int[] atIndex = new int[1000];
//reseta vetor dos @
public void atVetor()
{
for (int r = 0; r < 1000; r++)
{
atIndex[r] = -1;
}
}
//reseta vetor dos espaços
public void spaceVetor()
{
for (int r = 0; r < 1000; r++)
{
spaceIndex[r] = -1;
}
}
private void richTextBox1_TextChanged(object sender, EventArgs e)
{
//variável com o índice atual do cursor
int current = richTextBox1.SelectionStart;
//string com o conteúdo do texto da richTextBox
string text = richTextBox1.Text;
if (text.Length < tam)
{
//se algum caractere foi apagado, reseta vetores e variáveis de controle
tam = text.Length;
atVetor();
spaceVetor();
ctrlAt = 0;
richTextBox1.Select(current, 0);
richTextBox1.SelectionColor = Color.Empty;
richTextBox1.SelectionBackColor = Color.Empty;
}
else tam = text.Length;
//percorre o texto
for (int q = 0; q < tam; q++)
{
//se encontrar um @, salva seu índice no vetor
if (text.ElementAt(q) == '@')
{
if (flagAt == true && q > atIndex[ctrlAt])
{
//controle de dois @ sem espaço entre eles
if (spaceIndex[ctrlAt] != -1)
{
ctrlAt++;
atIndex[ctrlAt] = q;
}
}
//if específico para o primeiro @
if (ctrlAt == 0 && atIndex[ctrlAt] == -1)
{
atIndex[ctrlAt] = q;
flagAt = true;
}
}
}
if (atIndex[ctrlAt] != -1)
{
//percorre o texto
for (int b = atIndex[ctrlAt] + 1; b < text.Length; b++)
{
//se achar um espaço que não seja o último encontrado, salva o seu índice no vetor
if (text.ElementAt(b) == ' ' && spaceIndex[ctrlAt] != last)
{
spaceIndex[ctrlAt] = b;
last = spaceIndex[ctrlAt];
break;
}
}
//repete vezes equivalentes ao número de @'s no texto
for (int a = 0; a <= ctrlAt; a++)
{
if (spaceIndex[a] != -1)
{
//altera a cor do intervalo entre o @ e o espaço
richTextBox1.Select(atIndex[a], spaceIndex[a] - atIndex[a]);
richTextBox1.SelectionBackColor = Color.LightBlue;
richTextBox1.SelectionColor = Color.Blue;
//deixa tudo depois disso na cor original
richTextBox1.Select(current, 0);
richTextBox1.SelectionBackColor = Color.Empty;
richTextBox1.SelectionColor = Color.Empty;
}
else
{
richTextBox1.Select(atIndex[ctrlAt], text.Length);
richTextBox1.SelectionBackColor = Color.Empty;
richTextBox1.SelectionColor = Color.Empty;
}
}
}
//faz o cursor ir para o fim do texto e não selecionar nada
richTextBox1.Select(current, 0);
}