예제 #1
0
    /// <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);
    }
예제 #2
0
    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();
    }