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);
        }
Ejemplo n.º 2
0
        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();
 }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 7
0
        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));
        }