public SearchAndReplaceWidget(SourceEditorWidget widget, Widget container) { this.container = container; widget.TextEditorContainer.SizeAllocated += HandleViewTextEditorhandleSizeAllocated; widget.TextEditor.TextViewMargin.SearchRegionsUpdated += HandleWidgetTextEditorTextViewMarginSearchRegionsUpdated; widget.TextEditor.Caret.PositionChanged += HandleWidgetTextEditorCaretPositionChanged; this.SizeAllocated += HandleViewTextEditorhandleSizeAllocated; this.Name = "SearchAndReplaceWidget"; this.Events = Gdk.EventMask.AllEventsMask; widget.DisableAutomaticSearchPatternCaseMatch = false; Build(); this.buttonReplace.TooltipText = GettextCatalog.GetString("Replace"); this.buttonSearchForward.TooltipText = GettextCatalog.GetString("Find next"); this.buttonSearchBackward.TooltipText = GettextCatalog.GetString("Find previous"); this.buttonSearchMode.TooltipText = GettextCatalog.GetString("Toggle between search and replace mode"); this.searchEntry.Ready = true; this.searchEntry.Visible = true; this.searchEntry.WidthRequest = widget.Vbox.Allocation.Width / 3; this.searchEntry.ForceFilterButtonVisible = true; replaceWidgets = new Widget [] { // labelReplace, entryReplace, buttonReplace, buttonReplaceAll }; this.FocusChain = new Widget [] { this.searchEntry, this.buttonSearchForward, this.buttonSearchBackward, entryReplace, buttonReplace, buttonReplaceAll }; this.widget = widget; FilterHistory(seachHistoryProperty); FilterHistory(replaceHistoryProperty); //HACK: GTK rendering issue on Mac, images don't repaint unless we put them in visible eventboxes if (Platform.IsMac) { foreach (var eb in new [] { eventbox2, eventbox3, eventbox4, eventbox5, eventbox6 }) { eb.VisibleWindow = true; eb.ModifyBg(StateType.Normal, new Gdk.Color(230, 230, 230)); } } if (String.IsNullOrEmpty(widget.TextEditor.SearchPattern)) { widget.TextEditor.SearchPattern = searchPattern; } else if (widget.TextEditor.SearchPattern != searchPattern) { searchPattern = widget.TextEditor.SearchPattern; //FireSearchPatternChanged (); } UpdateSearchPattern(); //searchEntry.Model = searchHistory; searchEntry.Entry.KeyReleaseEvent += delegate { widget.CheckSearchPatternCasing(SearchPattern); /* widget.SetSearchPattern (SearchPattern); * searchPattern = SearchPattern; * UpdateSearchEntry ();*/ }; searchEntry.Entry.Changed += delegate { widget.SetSearchPattern(SearchPattern); string oldPattern = searchPattern; searchPattern = SearchPattern; if (oldPattern != searchPattern) { UpdateSearchEntry(); } var history = GetHistory(seachHistoryProperty); if (history.Count > 0 && history[0] == oldPattern) { ChangeHistory(seachHistoryProperty, searchPattern); } else { UpdateSearchHistory(searchPattern); } }; entryReplace.Text = replacePattern; // entryReplace.Model = replaceHistory; // RestoreReplaceHistory (); foreach (Gtk.Widget child in Children) { child.KeyPressEvent += delegate(object sender, Gtk.KeyPressEventArgs args) { if (args.Event.Key == Gdk.Key.Escape) { widget.RemoveSearchWidget(); } }; } closeButton.Clicked += delegate { widget.RemoveSearchWidget(); }; buttonSearchMode.Clicked += delegate { IsReplaceMode = !IsReplaceMode; }; // comboboxSearchAs.AppendText (GettextCatalog.GetString ("Text")); // comboboxSearchAs.AppendText (GettextCatalog.GetString ("Regular Expressions")); // comboboxSearchAs.Active = 0; // ReplacePatternChanged += UpdateReplacePattern; //SearchPatternChanged += UpdateSearchPattern; FocusChildSet += delegate { StoreWidgetState(); }; searchEntry.Entry.Activated += delegate { UpdateSearchHistory(SearchPattern); widget.FindNext(false); }; buttonSearchForward.Clicked += delegate { UpdateSearchHistory(SearchPattern); widget.FindNext(false); }; buttonSearchBackward.Clicked += delegate { UpdateSearchHistory(SearchPattern); widget.FindPrevious(false); }; // optionsButton.Label = MonoDevelop.Core.GettextCatalog.GetString ("Options"); this.searchEntry.RequestMenu += HandleSearchEntryhandleRequestMenu; entryReplace.Changed += delegate { replacePattern = ReplacePattern; if (!inReplaceUpdate) { FireReplacePatternChanged(); } }; entryReplace.Activated += delegate { UpdateSearchHistory(SearchPattern); UpdateReplaceHistory(ReplacePattern); widget.Replace(); entryReplace.GrabFocus(); }; buttonReplace.Clicked += delegate { UpdateSearchHistory(SearchPattern); UpdateReplaceHistory(ReplacePattern); widget.Replace(); }; buttonReplaceAll.Clicked += delegate { UpdateSearchHistory(SearchPattern); UpdateReplaceHistory(ReplacePattern); widget.ReplaceAll(); }; buttonSearchForward.KeyPressEvent += OnNavigateKeyPressEvent; buttonSearchBackward.KeyPressEvent += OnNavigateKeyPressEvent; searchEntry.Entry.KeyPressEvent += OnNavigateKeyPressEvent; entryReplace.KeyPressEvent += OnNavigateKeyPressEvent; buttonReplace.KeyPressEvent += OnNavigateKeyPressEvent; buttonReplaceAll.KeyPressEvent += OnNavigateKeyPressEvent; resultInformLabelEventBox = this.searchEntry.AddLabelWidget(resultInformLabel); resultInformLabelEventBox.BorderWidth = 2; resultInformLabel.Xpad = 2; resultInformLabel.Show(); searchEntry.FilterButtonPixbuf = new Gdk.Pixbuf(typeof(SearchAndReplaceWidget).Assembly, "searchoptions.png"); }
private void OnNavigateKeyPressEvent(object o, KeyPressEventArgs args) { args.RetVal = false; switch (args.Event.Key) { case Gdk.Key.Return: case Gdk.Key.KP_Enter: /* * I think this is not needed, this code leads to a search twice bug when you hit return. * But I leave it in in the case I've missed something. Mike * if (o == buttonSearchBackward || o == buttonSearchForward) { * if (!((Button)o).HasFocus) * ((Button)o).Click (); * }*/ break; case Gdk.Key.Down: case Gdk.Key.Up: if (o != searchEntry.Entry) { args.RetVal = true; return; } if ((args.Event.State & Gdk.ModifierType.ShiftMask) == Gdk.ModifierType.ShiftMask && o == searchEntry.Entry) { searchEntry.PopupFilterMenu(); } else { if (curSearchResult == -1) { curSearchPattern = searchEntry.Entry.Text; } List <string> history = GetHistory(seachHistoryProperty); if (history.Count > 0) { curSearchResult += args.Event.Key == Gdk.Key.Up ? -1 : 1; if (curSearchResult >= history.Count) { curSearchResult = -1; } if (curSearchResult == -1) { searchEntry.Entry.Text = curSearchPattern; } else { if (curSearchResult < -1) { curSearchResult = history.Count - 1; } searchEntry.Entry.Text = history[curSearchResult]; } searchEntry.Entry.Position = -1; } } args.RetVal = true; break; case Gdk.Key.N: case Gdk.Key.n: buttonSearchForward.GrabFocus(); buttonSearchForward.Click(); break; case Gdk.Key.P: case Gdk.Key.p: buttonSearchBackward.GrabFocus(); buttonSearchBackward.Click(); break; case Gdk.Key.Escape: widget.RemoveSearchWidget(); break; case Gdk.Key.slash: searchEntry.GrabFocus(); break; case Gdk.Key.ISO_Left_Tab: if (this.IsReplaceMode) { if (o == entryReplace) { searchEntry.Entry.GrabFocus(); } else if (o == buttonReplace) { entryReplace.GrabFocus(); } else if (o == buttonReplaceAll) { buttonReplace.GrabFocus(); } else if (o == buttonSearchBackward) { buttonReplaceAll.GrabFocus(); } else if (o == buttonSearchForward) { buttonSearchBackward.GrabFocus(); } else { buttonSearchForward.GrabFocus(); } args.RetVal = true; } else { if (o == buttonSearchBackward) { searchEntry.Entry.GrabFocus(); } else if (o == buttonSearchForward) { buttonSearchBackward.GrabFocus(); } else { buttonSearchForward.GrabFocus(); } args.RetVal = true; } break; case Gdk.Key.Tab: if (this.IsReplaceMode) { if (o == entryReplace) { buttonReplace.GrabFocus(); } else if (o == buttonReplace) { buttonReplaceAll.GrabFocus(); } else if (o == buttonReplaceAll) { buttonSearchBackward.GrabFocus(); } else if (o == buttonSearchBackward) { buttonSearchForward.GrabFocus(); } else if (o == buttonSearchForward) { // widget.TextEditor.GrabFocus (); searchEntry.Entry.GrabFocus(); } else { entryReplace.GrabFocus(); } args.RetVal = true; } else { if (o == buttonSearchBackward) { buttonSearchForward.GrabFocus(); } else if (o == buttonSearchForward) { searchEntry.Entry.GrabFocus(); // widget.TextEditor.GrabFocus (); } else { buttonSearchBackward.GrabFocus(); } args.RetVal = true; } break; default: args.RetVal = true; break; } }
public GotoLineNumberWidget(SourceEditorWidget widget, Widget container) { this.container = container; this.Build(); this.widget = widget; StoreWidgetState(); widget.TextEditorContainer.SizeAllocated += HandleViewTextEditorhandleSizeAllocated; //HACK: GTK rendering issue on Mac, images don't repaint unless we put them in visible eventboxes if (Platform.IsMac) { { foreach (var eb in new [] { eventbox1, eventbox2 }) { { eb.VisibleWindow = true; eb.ModifyBg(StateType.Normal, new Gdk.Color(230, 230, 230)); } } } } this.closeButton.Clicked += delegate { RestoreWidgetState(); widget.RemoveSearchWidget(); }; this.buttonGoToLine.Clicked += delegate { cleanExit = true; GotoLine(); widget.RemoveSearchWidget(); }; foreach (Gtk.Widget child in this.Children) { child.KeyPressEvent += delegate(object sender, Gtk.KeyPressEventArgs args) { if (args.Event.Key == Gdk.Key.Escape) { RestoreWidgetState(); widget.RemoveSearchWidget(); } }; } Gtk.Widget oldWidget = null; this.FocusChildSet += delegate(object sender, Gtk.FocusChildSetArgs args) { // only store state when the focus comes from a non child widget if (args.Widget != null && oldWidget == null) { StoreWidgetState(); } oldWidget = args.Widget; }; this.entryLineNumber.Changed += delegate { PreviewLine(); }; this.entryLineNumber.Activated += delegate { cleanExit = true; GotoLine(); widget.RemoveSearchWidget(); }; }