private void ErrorLogTextBox_DoubleClick(object sender, EventArgs e) { if (Analizer.tokenizerLastErrorPos != 0) { InputTextBox.Focus(); InputTextBox.Select(Analizer.tokenizerLastErrorPos, 1); } }
/// <summary> /// Sets initial form state. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Form1_Load_1(object sender, EventArgs e) { InputTextBox.Text = "0"; InputTextBox.Select(InputTextBox.Text.Length, 0); Value = 0; Operation = ""; Function = ""; OperatorPressed = false; OneButton.Click += new EventHandler(Num_Click); TwoButton.Click += new EventHandler(Num_Click); ThreeButton.Click += new EventHandler(Num_Click); FourButton.Click += new EventHandler(Num_Click); FiveButton.Click += new EventHandler(Num_Click); SixButton.Click += new EventHandler(Num_Click); SevenButton.Click += new EventHandler(Num_Click); EightButton.Click += new EventHandler(Num_Click); NineButton.Click += new EventHandler(Num_Click); ZeroButton.Click += new EventHandler(Num_Click); DotButton.Click += new EventHandler(Num_Click); AddButton.Click += new EventHandler(Operator_Click); SubtractButton.Click += new EventHandler(Operator_Click); MultiplyButton.Click += new EventHandler(Operator_Click); DivideButton.Click += new EventHandler(Operator_Click); SqrtButton.Click += new EventHandler(Function_Click); RecipButton.Click += new EventHandler(Function_Click); PlusMinusButton.Click += new EventHandler(Function_Click); EqualsButton.Click += new EventHandler(EqualsButton_Click); BackButton.Click += new EventHandler(BackButton_Click); CEButton.Click += new EventHandler(CEButton_Click); ClearButton.Click += new EventHandler(ClearButton_Click); HistoryButton.Click += new EventHandler(HistoryButton_Click); }
private void InputTextBox_SelectionChanged(object sender, EventArgs e) { if (selectChanged) { selectChanged = false; int view = InputTextBox.SelectionStart - 1; int initLength = InputTextBox.SelectionLength; InputTextBox.SelectAll(); InputTextBox.SelectionBackColor = Color.White; InputTextBox.BackColor = Color.White; Color col = Color.LightGray; string text = InputTextBox.Text; int singleQuote = -1; //Позиция текущей открывающей одинарной кавычки. Если -1, то открывающей кавычки нет. int doubleQuote = -1; //Позиция текущей открывающей двойной кавычки. Если -1, то открывающей кавычки нет. int openBrackets = 0; //Количество открытых скобок. int highlightedBracket = 0; //Номер подсвеченной открытой скобки (на которой стоит указатель). Stack <int> bracketsPos = new Stack <int>(); //Стек позиций текущих открытых скобок. string highlight = null; //Указатель на то, какой символ следует подсветить. for (int i = 0; i < text.Length; i++) { //Если одинарная кавычка... if (text[i] == '\'') { //...и двойная кавычка не открыта... if (doubleQuote == -1) { //...и одинарная кавычка не открыта... if (singleQuote == -1) { //...то это открывающая одинарная кавычка. Запоминаем номер. singleQuote = i; //Если курсор на открывающей одинарной кавычке... if (view == i) { //То следует искать следующую одинарную кавычку. highlight = "singleQuote"; //Подсветим текущую кавычку. InputTextBox.Select(i, 1); InputTextBox.SelectionBackColor = col; } //...иначе ничего не происходит. } //...но одинарная кавычка уже открыта... else { //...то это закрывающая одинарная кавычка. //Если подсвеченная одиночная кавычка уже была... if (highlight == "singleQuote") { //...подсвечиваем вторую и уходим отсюда. InputTextBox.Select(i, 1); InputTextBox.SelectionBackColor = col; break; } //...если её не было, но нужно подсветить эту... else if (view == i) { //...вспоминаем номер предыдущей одинарной кавычки и подсвечиваем обе. InputTextBox.Select(singleQuote, 1); InputTextBox.SelectionBackColor = col; InputTextBox.Select(i, 1); InputTextBox.SelectionBackColor = col; break; } //...иначе просто закрываем одинарную кавычку. singleQuote = -1; } } //...а если двойная кавычка открыта, то одинарная кавычка - это текст. else { continue; } } //Если двойная кавычка... else if (text[i] == '"') { //...и одинарная кавычка уже открыта... if (singleQuote >= 0) { //...и двойная кавычка не открыта... if (doubleQuote == -1) { //...то это открывающая двойная кавычка. Запоминаем номер. doubleQuote = i; //Если курсор на открывающей двойной кавычке... if (view == i) { //То следует искать следующую двойную кавычку. highlight = "doubleQuote"; //Подсветим текущую кавычку. InputTextBox.Select(i, 1); InputTextBox.SelectionBackColor = col; } //...иначе ничего не происходит. } //...но двойная кавычка уже открыта... else { //...то это закрывающая двойная кавычка. //Если подсвеченная двойная кавычка уже была... if (highlight == "doubleQuote") { //...подсвечиваем вторую и уходим отсюда. InputTextBox.Select(i, 1); InputTextBox.SelectionBackColor = col; break; } //...если её не было, но нужно подсветить эту... else if (view == i) { //...вспоминаем номер предыдущей одинарной кавычки и подсвечиваем обе. InputTextBox.Select(doubleQuote, 1); InputTextBox.SelectionBackColor = col; InputTextBox.Select(i, 1); InputTextBox.SelectionBackColor = col; break; } //...иначе просто закрываем двойную кавычку. doubleQuote = -1; } } //...а если одинарная кавычка не открыта, то двойной быть просто не может. else { break; } } //Если открывающая скобка... else if (text[i] == '(') { //...если одиночная кавычка открыта... if (singleQuote >= 0) { //... а двойная кавычка - не открыта... if (doubleQuote == -1) { //...открываем скобку. Стало на одну открытую скобку больше. openBrackets++; //Записываем положение открытой скобки в стек. bracketsPos.Push(i); //Если курсор на открывающей скобке... if (view == i) { //То следует искать соответствующую ей закрывающую скобку (после закрытия (!) которой openBrackets станет равен highlightedBracket - 1). highlight = "openBracket"; highlightedBracket = openBrackets; //Подсветим текущую скобку. InputTextBox.Select(i, 1); InputTextBox.SelectionBackColor = col; } //...иначе ничего не происходит. } //...а если двойная кавычка открыта, то скобка - это текст. else { continue; } } //...иначе скобки быть просто не может. else { break; } } //Если закрывающая скобка... else if (text[i] == ')') { //...если одиночная кавычка открыта... if (singleQuote >= 0) { //... а двойная кавычка - не открыта... if (doubleQuote == -1) { //...и если уже была подсвечена открывающая скобка, и текущий номер открытой скобки - номер подсвеченной скобки... if (highlight == "openBracket" && highlightedBracket == openBrackets) { //...то подсвечиваем текущую закрывающую скобку (она как раз намеривается закрыть подсвеченную открытую скобку) InputTextBox.Select(i, 1); InputTextBox.SelectionBackColor = col; break; } //...если ещё не было подсвеченной скобки, но указатель как раз на текущей закрывающей скобке... else if (view == i) { //...то необходимо подсветить соответствующую ей открывающую скобку. Также подсвечиваем текущую закрывающую скобку. InputTextBox.Select(bracketsPos.Pop(), 1); InputTextBox.SelectionBackColor = col; InputTextBox.Select(i, 1); InputTextBox.SelectionBackColor = col; break; } //...иначе просто закрываем скобку (удаляем из стека более неактуальное положение последней открытой скобки и уменьшаем количество открытых скобок). bracketsPos.Pop(); openBrackets--; } //...а если двойная кавычка открыта, то скобка - это текст. else { continue; } } //...иначе скобки быть просто не может. else { break; } } //Иначе это просто какой-то символ, который никак не нужно выделять или запоминать. Пропускаем. } InputTextBox.SelectionStart = view + 1; InputTextBox.SelectionLength = initLength; InputTextBox.SelectionBackColor = Color.White; selectChanged = true; } }