/// <summary> /// Moves the pipe textview's caret to the given character position on the current line. /// </summary> private void MoveCaret(int charPos) { TextIter theIter = PipeTextView.Buffer.GetIterAtMark(PipeTextView.Buffer.InsertMark); theIter.BackwardChars(theIter.LineOffset); theIter.ForwardChars(charPos); PipeTextView.Buffer.PlaceCursor(theIter); }
protected void WriteLog(string text, TextTag tag) { Gtk.Application.Invoke(delegate { TextIter endIter = textview1.Buffer.EndIter; textview1.Buffer.Insert(ref endIter, text); endIter.BackwardChars(text.Length); textview1.Buffer.ApplyTag(tag, endIter, textview1.Buffer.EndIter); textview1.ScrollToMark(textview1.Buffer.CreateMark("bottom", textview1.Buffer.EndIter, false), 0, true, 0.0, 1.0); }); }
// Logging private void WriteLog(string text, string tag) { text += "\n"; Gtk.Application.Invoke(delegate { TextIter endIter = textview1.Buffer.EndIter; textview1.Buffer.Insert(ref endIter, text); endIter.BackwardChars(text.Length); textview1.Buffer.ApplyTag(textview1.Buffer.TagTable.Lookup(tag), endIter, textview1.Buffer.EndIter); textview1.ScrollToMark(textview1.Buffer.CreateMark("bottom", textview1.Buffer.EndIter, false), 0, true, 0.0, 1.0); }); }
//TextIter iter; public void AddEntry(string entry, TextTag tag, bool newline = true) { int len = AddEntry(entry, newline); TextIter end = Buffer.EndIter; TextIter start = Buffer.EndIter; start.BackwardChars(len); InfoTags.Add(new InfoTag { start = start.Offset, end = end.Offset, tag = tag }); }
/// <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); }
public void CompleteAhead(string what) { DropCompleteAhead(); TextIter insertIter = GetIterAtMark(InsertMark); InsertWithTags(ref insertIter, what, new TextTag[] { complete_ahead }); TextIter it = GetIterAtMark(InsertMark); MoveMark(complete_end, it); it.BackwardChars(what.Length); PlaceCursor(it); }
/* NOTES: * this method is supposed to check if a iter is editable but it's shit. * as of right now it just picks the last actually typed char and checks if it has tags and shit * for some reason it doesnt see some tags while it sees others (try running an empty command) * it is pure f*****g shit * no fukcing clue how to fix this * i'm at the f*****g edge man * this pain * can't take it any longer man * fucken hell * * PS: WHY THE F**K DOES THE THING I ASSIGNED TO CTRL+P WORK THEN WHAT THE F**K */ public bool CheckIfEditable(TextIter givenIter, bool verbose = false) { TextIter iter = givenIter.Copy(); iter.BackwardChars(2); if (verbose) { Console.WriteLine("\n\nchar: '" + iter.Char + "'"); } if (verbose) { Console.WriteLine("tag count: " + iter.Tags.Length); } if (verbose) { Console.WriteLine("editable: " + iter.Editable(true)); } if (verbose) { Console.WriteLine("---"); } bool editable = true; foreach (var tag in iter.Tags) { if (verbose) { Console.WriteLine(tag.Name + ": " + tag.Editable); } } if (verbose) { Console.WriteLine("---"); } return(editable); }
// 向上平移文本 public void MoveUp() { int topToMove = top - StepSize; if (topToMove < 0) { topToMove = 0; } int bottomToMove = topToMove + WindowSize; if (bottomToMove > Text.Length) { bottomToMove = Text.Length; } int topAddBytes = top - topToMove; int bottomDeleteBytes = bottom - bottomToMove; if (topAddBytes > 0) { TextIter iter = TextView.Buffer.StartIter; //Console.WriteLine (Text); //Console.WriteLine ("MOVEUP:" + top.ToString () + ":" + Text.Substring (topToMove, topAddBytes)); TextView.Buffer.Insert(ref iter, Text.Substring(topToMove, topAddBytes)); //TextView.Buffer.Text += Text.Substring (bottom, bottomAddBytes); } if (bottomDeleteBytes > 0) { TextIter iterStart = TextView.Buffer.EndIter; TextIter iterEnd = TextView.Buffer.EndIter; iterStart.BackwardChars(bottomDeleteBytes); TextView.Buffer.Delete(ref iterStart, ref iterEnd); } top = topToMove; bottom = bottomToMove; }
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(); }