void CreateWidget(IEnumerable <CodeAction> fixes, TextLocation loc) { Fixes = fixes; if (!QuickTaskStrip.EnableFancyFeatures) { return; } var editor = document.Editor; if (editor == null || editor.Parent == null || !editor.Parent.IsRealized) { return; } if (document.ParsedDocument == null || document.ParsedDocument.IsInvalid) { return; } if (!fixes.Any()) { ICSharpCode.NRefactory.Semantics.ResolveResult resolveResult; ICSharpCode.NRefactory.CSharp.AstNode node; if (ResolveCommandHandler.ResolveAt(document, out resolveResult, out node)) { var possibleNamespaces = ResolveCommandHandler.GetPossibleNamespaces(document, node, resolveResult); if (!possibleNamespaces.Any()) { return; } } else { return; } } var container = editor.Parent.Parent as TextEditorContainer; if (container == null) { return; } if (widget == null) { widget = new CodeActionWidget(this, Document); container.AddTopLevelWidget(widget, 2 + (int)editor.Parent.TextViewMargin.XOffset, -2 + (int)editor.Parent.LineToY(document.Editor.Caret.Line)); } else { container.MoveTopLevelWidget(widget, 2 + (int)editor.Parent.TextViewMargin.XOffset, -2 + (int)editor.Parent.LineToY(document.Editor.Caret.Line)); } widget.Show(); widget.SetFixes(fixes, loc); }
HashSet <MonoDevelop.Refactoring.ResolveCommandHandler.PossibleNamespace> GetResult(string input) { var doc = Setup(input); var location = doc.Editor.Caret.Location; ResolveResult resolveResult; AstNode node; doc.TryResolveAt(location, out resolveResult, out node); return(ResolveCommandHandler.GetPossibleNamespaces(doc, node, ref resolveResult)); }
public override void CursorPositionChanged() { CancelQuickFixTimer(); if (QuickTaskStrip.EnableFancyFeatures && Document.ParsedDocument != null && !Debugger.DebuggingService.IsDebugging) { quickFixCancellationTokenSource = new CancellationTokenSource(); var token = quickFixCancellationTokenSource.Token; quickFixTimeout = GLib.Timeout.Add(100, delegate { var loc = Document.Editor.Caret.Location; RefactoringService.QueueQuickFixAnalysis(Document, loc, token, delegate(List <CodeAction> fixes) { if (!fixes.Any()) { ICSharpCode.NRefactory.Semantics.ResolveResult resolveResult; AstNode node; if (ResolveCommandHandler.ResolveAt(document, out resolveResult, out node, token)) { var possibleNamespaces = ResolveCommandHandler.GetPossibleNamespaces(document, node, ref resolveResult); if (!possibleNamespaces.Any()) { if (currentSmartTag != null) { Application.Invoke(delegate { RemoveWidget(); }); } return; } } else { if (currentSmartTag != null) { Application.Invoke(delegate { RemoveWidget(); }); } return; } } Application.Invoke(delegate { if (token.IsCancellationRequested) { return; } CreateSmartTag(fixes, loc); quickFixTimeout = 0; }); }); return(false); }); } else { RemoveWidget(); } base.CursorPositionChanged(); }
void PopupQuickFixMenu(Gdk.EventButton evt, Action <Gtk.Menu> menuAction) { var menu = new Gtk.Menu(); menu.Events |= Gdk.EventMask.AllEventsMask; Gtk.Menu fixMenu = menu; ResolveResult resolveResult; ICSharpCode.NRefactory.CSharp.AstNode node; int items = 0; if (ResolveCommandHandler.ResolveAt(document, out resolveResult, out node)) { var possibleNamespaces = MonoDevelop.Refactoring.ResolveCommandHandler.GetPossibleNamespaces( document, node, ref resolveResult ); bool addUsing = !(resolveResult is AmbiguousTypeResolveResult); if (addUsing) { foreach (var t in possibleNamespaces.Where(tp => tp.IsAccessibleWithGlobalUsing)) { string ns = t.Namespace; var reference = t.Reference; var menuItem = new Gtk.MenuItem(string.Format("using {0};", ns)); menuItem.Activated += delegate { new ResolveCommandHandler.AddImport(document, resolveResult, ns, reference, true, node).Run(); if (reference != null) { document.Project.Items.Add(reference); } menu.Destroy(); }; menu.Add(menuItem); items++; } } bool resolveDirect = !(resolveResult is UnknownMemberResolveResult); if (resolveDirect) { foreach (var t in possibleNamespaces) { string ns = t.Namespace; var reference = t.Reference; var menuItem = new Gtk.MenuItem(GettextCatalog.GetString("{0}", ns + "." + document.Editor.GetTextBetween(node.StartLocation, node.EndLocation))); menuItem.Activated += delegate { new ResolveCommandHandler.AddImport(document, resolveResult, ns, reference, false, node).Run(); menu.Destroy(); }; menu.Add(menuItem); items++; } } if (menu.Children.Any() && fixes.Any()) { fixMenu = new Gtk.Menu(); var menuItem = new Gtk.MenuItem(GettextCatalog.GetString("Quick Fixes")); menuItem.Submenu = fixMenu; menu.Add(menuItem); items++; } } PopulateFixes(fixMenu, ref items); if (items == 0) { menu.Destroy(); return; } document.Editor.SuppressTooltips = true; document.Editor.Parent.HideTooltip(); if (menuAction != null) { menuAction(menu); } menu.ShowAll(); menu.SelectFirst(true); menuPushed = true; menu.Hidden += delegate { document.Editor.SuppressTooltips = false; }; menu.Destroyed += delegate { menuPushed = false; Hide(); }; var container = document.Editor.Parent; var child = (TextEditor.EditorContainerChild)container [this]; Gdk.Rectangle rect; /* if (child != null) { * rect = new Gdk.Rectangle (child.X, child.Y + Allocation.Height - (int)document.Editor.VAdjustment.Value, 0, 0); * } else {*/ var p = container.LocationToPoint(loc); rect = new Gdk.Rectangle(p.X + container.Allocation.X, p.Y + (int)document.Editor.LineHeight + container.Allocation.Y, 0, 0); //} GtkWorkarounds.ShowContextMenu(menu, document.Editor.Parent, null, rect); }
void PopupQuickFixMenu(Gdk.EventButton evt, Action <Gtk.Menu> menuAction) { var menu = new Gtk.Menu(); menu.Events |= Gdk.EventMask.AllEventsMask; Gtk.Menu fixMenu = menu; ResolveResult resolveResult; ICSharpCode.NRefactory.CSharp.AstNode node; int items = 0; if (ResolveCommandHandler.ResolveAt(document, out resolveResult, out node)) { var possibleNamespaces = MonoDevelop.Refactoring.ResolveCommandHandler.GetPossibleNamespaces( document, node, ref resolveResult ); foreach (var t in possibleNamespaces.Where(tp => tp.OnlyAddReference)) { var menuItem = new Gtk.MenuItem(t.GetImportText()); menuItem.Activated += delegate { new ResolveCommandHandler.AddImport(document, resolveResult, null, t.Reference, true, node).Run(); menu.Destroy(); }; menu.Add(menuItem); items++; } bool addUsing = !(resolveResult is AmbiguousTypeResolveResult); if (addUsing) { foreach (var t in possibleNamespaces.Where(tp => tp.IsAccessibleWithGlobalUsing)) { string ns = t.Namespace; var reference = t.Reference; var menuItem = new Gtk.MenuItem(t.GetImportText()); menuItem.Activated += delegate { new ResolveCommandHandler.AddImport(document, resolveResult, ns, reference, true, node).Run(); menu.Destroy(); }; menu.Add(menuItem); items++; } } bool resolveDirect = !(resolveResult is UnknownMemberResolveResult); if (resolveDirect) { foreach (var t in possibleNamespaces) { string ns = t.Namespace; var reference = t.Reference; var menuItem = new Gtk.MenuItem(t.GetInsertNamespaceText(document.Editor.GetTextBetween(node.StartLocation, node.EndLocation))); menuItem.Activated += delegate { new ResolveCommandHandler.AddImport(document, resolveResult, ns, reference, false, node).Run(); menu.Destroy(); }; menu.Add(menuItem); items++; } } if (menu.Children.Any() && Fixes.Any()) { fixMenu = new Gtk.Menu(); var menuItem = new Gtk.MenuItem(GettextCatalog.GetString("Quick Fixes")); menuItem.Submenu = fixMenu; menu.Add(menuItem); items++; } } PopulateFixes(fixMenu, ref items); if (items == 0) { menu.Destroy(); return; } document.Editor.SuppressTooltips = true; document.Editor.Parent.HideTooltip(); if (menuAction != null) { menuAction(menu); } menu.ShowAll(); menu.SelectFirst(true); menu.Hidden += delegate { document.Editor.SuppressTooltips = false; }; var container = document.Editor.Parent; var p = container.LocationToPoint(currentSmartTagBegin); var rect = new Gdk.Rectangle( p.X + container.Allocation.X, p.Y + (int)document.Editor.LineHeight + container.Allocation.Y, 0, 0); GtkWorkarounds.ShowContextMenu(menu, document.Editor.Parent, null, rect); }
void PopupQuickFixMenu(Gdk.EventButton evt, Action <FixMenuDescriptor> menuAction) { FixMenuDescriptor menu = new FixMenuDescriptor(); var fixMenu = menu; ResolveResult resolveResult; ICSharpCode.NRefactory.CSharp.AstNode node; int items = 0; if (ResolveCommandHandler.ResolveAt(document, out resolveResult, out node)) { var possibleNamespaces = MonoDevelop.Refactoring.ResolveCommandHandler.GetPossibleNamespaces( document, node, ref resolveResult ); foreach (var t in possibleNamespaces.Where(tp => tp.OnlyAddReference)) { menu.Add(new FixMenuEntry(t.GetImportText(), delegate { new ResolveCommandHandler.AddImport(document, resolveResult, null, t.Reference, true, node).Run(); })); items++; } bool addUsing = !(resolveResult is AmbiguousTypeResolveResult); if (addUsing) { foreach (var t in possibleNamespaces.Where(tp => tp.IsAccessibleWithGlobalUsing)) { string ns = t.Namespace; var reference = t.Reference; menu.Add(new FixMenuEntry(t.GetImportText(), delegate { new ResolveCommandHandler.AddImport(document, resolveResult, ns, reference, true, node).Run(); }) ); items++; } } bool resolveDirect = !(resolveResult is UnknownMemberResolveResult); if (resolveDirect) { foreach (var t in possibleNamespaces) { string ns = t.Namespace; var reference = t.Reference; menu.Add(new FixMenuEntry(t.GetInsertNamespaceText(document.Editor.GetTextBetween(node.StartLocation, node.EndLocation)), delegate { new ResolveCommandHandler.AddImport(document, resolveResult, ns, reference, false, node).Run(); })); items++; } } if (menu.Items.Any() && Fixes.Any()) { fixMenu = new FixMenuDescriptor(GettextCatalog.GetString("Quick Fixes")); menu.Add(fixMenu); items++; } } PopulateFixes(fixMenu, ref items); if (items == 0) { return; } document.Editor.SuppressTooltips = true; document.Editor.Parent.HideTooltip(); if (menuAction != null) { menuAction(menu); } var container = document.Editor.Parent; var p = container.LocationToPoint(currentSmartTagBegin); var rect = new Gdk.Rectangle( p.X + container.Allocation.X, p.Y + (int)document.Editor.LineHeight + container.Allocation.Y, 0, 0); ShowFixesMenu(document.Editor.Parent, rect, menu); }
void PopupQuickFixMenu(Gdk.EventButton evt) { var menu = new Gtk.Menu(); Gtk.Menu fixMenu = menu; ResolveResult resolveResult; ICSharpCode.NRefactory.CSharp.AstNode node; if (ResolveCommandHandler.ResolveAt(document, out resolveResult, out node)) { var possibleNamespaces = MonoDevelop.Refactoring.ResolveCommandHandler.GetPossibleNamespaces( document, node, resolveResult ); bool addUsing = !(resolveResult is AmbiguousTypeResolveResult); if (addUsing) { foreach (string ns_ in possibleNamespaces) { string ns = ns_; var menuItem = new Gtk.MenuItem(string.Format("using {0};", ns)); menuItem.Activated += delegate { new MonoDevelop.Refactoring.ResolveCommandHandler.AddImport(document, resolveResult, ns, true, node).Run(); menu.Destroy(); }; menu.Add(menuItem); } } bool resolveDirect = !(resolveResult is UnknownMemberResolveResult); if (resolveDirect) { foreach (string ns in possibleNamespaces) { var menuItem = new Gtk.MenuItem(GettextCatalog.GetString("{0}", ns + "." + document.Editor.GetTextBetween(node.StartLocation, node.EndLocation))); menuItem.Activated += delegate { new MonoDevelop.Refactoring.ResolveCommandHandler.AddImport(document, resolveResult, ns, false, node).Run(); menu.Destroy(); }; menu.Add(menuItem); } } if (menu.Children.Any() && fixes.Any()) { fixMenu = new Gtk.Menu(); var menuItem = new Gtk.MenuItem(GettextCatalog.GetString("Quick Fixes")); menuItem.Submenu = fixMenu; menu.Add(menuItem); } } PopulateFixes(fixMenu); menu.ShowAll(); menu.SelectFirst(true); menuPushed = true; menu.Destroyed += delegate { menuPushed = false; Hide(); }; var container = (TextEditorContainer)document.Editor.Parent.Parent; var child = (TextEditorContainer.EditorContainerChild)container [this]; GtkWorkarounds.ShowContextMenu(menu, document.Editor.Parent, null, new Gdk.Rectangle(child.X, child.Y + Allocation.Height - (int)document.Editor.VAdjustment.Value, 0, 0)); }