/// <summary> /// Returns the line of text from the pipe textview that contains the caret. /// </summary> private string CurrentLine() { TextIter begIter = PipeTextView.Buffer.GetIterAtMark(PipeTextView.Buffer.InsertMark); TextIter endIter = PipeTextView.Buffer.GetIterAtMark(PipeTextView.Buffer.InsertMark); begIter.BackwardChars(begIter.LineOffset); endIter.BackwardCursorPosition(); endIter.ForwardToLineEnd(); string line = PipeTextView.Buffer.GetText(begIter, endIter, false); return(line); }
protected virtual void PipeTextView_OnKeyReleaseEvent(object o, Gtk.KeyReleaseEventArgs e) { Gdk.Key theKey = e.Event.Key; char theChar = (char)e.Event.KeyValue; if (commandAutoCompletion) { bool controlPressed = (e.Event.State & Gdk.ModifierType.ControlMask) != 0; bool altPressed = (e.Event.State & Gdk.ModifierType.Mod1Mask) != 0; if (Char.IsLetter(theChar) && ((theKey != Gdk.Key.Home) && (theKey != Gdk.Key.Left) && (theKey != Gdk.Key.Right) && (theKey != Gdk.Key.Up) && (theKey != Gdk.Key.Down) && (theKey != Gdk.Key.Return) && (theKey != Gdk.Key.Delete) && (theKey != Gdk.Key.BackSpace) && (theKey != Gdk.Key.End)) && (!controlPressed) && (!altPressed)) { // The character typed is just a letter. PipeTextView.Buffer.Changed -= PipeTextBuffer_OnChanged; string theLine = CurrentLine(); int lineCaretPos = CaretPos(); string prefix = theLine.Substring(0, lineCaretPos).TrimStart(); if (IsAlphabetic(prefix)) { // The "prefix" is all alphabetic. string suffix = MatchCommand(prefix); int i = theLine.IndexOf(' ', lineCaretPos - 1); if (i > -1) { // Found the space following the filter name. int noOfChars = i - lineCaretPos + 1; theLine = theLine.Remove(lineCaretPos - 1, noOfChars); theLine = theLine.Insert(lineCaretPos - 1, suffix); } else { // No space was found. theLine = theLine.Remove(lineCaretPos - 1); theLine += suffix; } // Update the textview's text buffer: TextIter begIter = PipeTextView.Buffer.GetIterAtMark(PipeTextView.Buffer.InsertMark); TextIter endIter = PipeTextView.Buffer.GetIterAtMark(PipeTextView.Buffer.InsertMark); begIter.BackwardChars(begIter.LineOffset); endIter.BackwardCursorPosition(); endIter.ForwardToLineEnd(); PipeTextView.Buffer.Delete(ref begIter, ref endIter); PipeTextView.Buffer.Insert(ref begIter, theLine); if (suffix != string.Empty) { // Restore the caret's original position: MoveCaret(lineCaretPos); } } PipeTextView.Buffer.Changed += PipeTextBuffer_OnChanged; } } UpdCursorLocation(PipeTextView.Buffer); UpdateCmdSyntax(); UpdateControls(); }