public static void GenerateExecutionModeCommands(SolutionEntityItem project, CanExecuteDelegate runCheckDelegate, CommandArrayInfo info) { CommandExecutionContext ctx = new CommandExecutionContext (project, runCheckDelegate); bool supportsParameterization = false; foreach (List<IExecutionMode> modes in GetExecutionModeCommands (ctx, false, true)) { foreach (IExecutionMode mode in modes) { CommandInfo ci = info.Add (mode.Name, new CommandItem (ctx, mode)); if ((mode.ExecutionHandler is ParameterizedExecutionHandler) || ((mode is CustomExecutionMode) && ((CustomExecutionMode)mode).PromptForParameters)) { // It will prompt parameters, so we need command to end with '..'. // However, some commands may end with '...' already and we don't want to break // already-translated strings by altering them if (!ci.Text.EndsWith ("...")) ci.Text += "..."; supportsParameterization = true; } else { // The parameters window will be shown if ctrl is pressed ci.Description = GettextCatalog.GetString ("Run With: {0}", ci.Text); if (SupportsParameterization (mode, ctx)) { ci.Description += " - " + GettextCatalog.GetString ("Hold Control key to display the execution parameters dialog."); supportsParameterization = true; } } } if (info.Count > 0) info.AddSeparator (); } if (supportsParameterization) { info.AddSeparator (); info.Add (GettextCatalog.GetString ("Edit Custom Modes..."), new CommandItem (ctx, null)); } }
protected override void Update(CommandArrayInfo info) { ResolverContextStack ctxt; var rr = Resolver.DResolverWrapper.ResolveHoveredCode(out ctxt); bool noRes = true; if (rr != null && rr.Length > 0) { res = rr[rr.Length - 1]; n = DResolver.GetResultMember(res); if (n != null) { noRes = false; info.Add(IdeApp.CommandService.GetCommandInfo(RefactoryCommands.GotoDeclaration), new Action(GotoDeclaration)); info.Add(IdeApp.CommandService.GetCommandInfo(RefactoryCommands.FindReferences), new Action(FindReferences)); if (RenamingRefactoring.CanRename(n)) { info.AddSeparator(); info.Add(IdeApp.CommandService.GetCommandInfo(EditCommands.Rename), new Action(RenameSymbol)); } } } if(noRes) info.Add(IdeApp.CommandService.GetCommandInfo(RefactoryCommands.ImportSymbol), new Action(ImportSymbol)); info.Add(IdeApp.CommandService.GetCommandInfo(Commands.OpenDDocumentation), new Action(OpenDDoc)); }
protected override void Update (CommandArrayInfo ainfo) { MonoDevelop.Ide.Gui.Document doc = IdeApp.Workbench.ActiveDocument; if (doc != null) { SourceEditorView view = IdeApp.Workbench.ActiveDocument.GetContent <SourceEditorView>(); if (view != null) { DocumentLocation location = view.TextEditor.Caret.Location; if (location.IsEmpty) return; LineSegment line = view.Document.GetLine (location.Line); if (line == null || line.Markers == null) return; foreach (TextMarker marker in line.Markers) { UrlMarker urlMarker = marker as UrlMarker; if (urlMarker != null) { if (urlMarker.StartColumn <= location.Column && location.Column < urlMarker.EndColumn) { ainfo.Add (urlMarker.UrlType == UrlType.Email ? GettextCatalog.GetString ("_Write an e-mail to...") : GettextCatalog.GetString ("_Open URL..."), urlMarker); ainfo.AddSeparator (); } } } } } }
public void OnSetBuildActionUpdate (CommandArrayInfo info) { Set<string> toggledActions = new Set<string> (); Project proj = null; foreach (ITreeNavigator node in CurrentNodes) { ProjectFile finfo = (ProjectFile) node.DataItem; //disallow multi-slect on more than one project, since available build actions may differ if (proj == null && finfo.Project != null) { proj = finfo.Project; } else if (proj == null || proj != finfo.Project) { info.Clear (); return; } toggledActions.Add (finfo.BuildAction); } foreach (string action in proj.GetBuildActions ()) { if (action == "--") { info.AddSeparator (); } else { CommandInfo ci = info.Add (BuildAction.Translate (action), action); ci.Checked = toggledActions.Contains (action); if (ci.Checked) ci.CheckedInconsistent = toggledActions.Count > 1; } } }
internal static void PopulateOpenWithViewers (CommandArrayInfo info, Project project, string filePath) { var viewers = DisplayBindingService.GetFileViewers (filePath, project).ToList (); //show the default viewer first var def = viewers.FirstOrDefault (v => v.CanUseAsDefault) ?? viewers.FirstOrDefault (v => v.IsExternal); if (def != null) { CommandInfo ci = info.Add (def.Title, def); ci.Description = GettextCatalog.GetString ("Open with '{0}'", def.Title); if (viewers.Count > 1) info.AddSeparator (); } //then the builtins, followed by externals FileViewer prev = null; foreach (FileViewer fv in viewers) { if (def != null && fv.Equals (def)) continue; if (prev != null && fv.IsExternal != prev.IsExternal) info.AddSeparator (); CommandInfo ci = info.Add (fv.Title, fv); ci.Description = GettextCatalog.GetString ("Open with '{0}'", fv.Title); prev = fv; } }
protected override void Update (CommandArrayInfo ainfo) { Document doc = IdeApp.Workbench.ActiveDocument; if (doc == null || doc.FileName == FilePath.Null || IdeApp.ProjectOperations.CurrentSelectedSolution == null) return; ITextBuffer editor = doc.GetContent<ITextBuffer> (); if (editor == null) return; bool added = false; int line, column; editor.GetLineColumnFromPosition (editor.CursorPosition, out line, out column); ProjectDom ctx = doc.Dom; ResolveResult resolveResult; INode item; GetItem (ctx, doc, editor, out resolveResult, out item); IMember eitem = resolveResult != null ? (resolveResult.CallingMember ?? resolveResult.CallingType) : null; string itemName = null; if (item is IMember) itemName = ((IMember)item).Name; if (item != null && eitem != null && (eitem.Equals (item) || (eitem.Name == itemName && !(eitem is IProperty) && !(eitem is IMethod)))) { // If this occurs, then @item is either its own enclosing item, in // which case, we don't want to show it twice, or it is the base-class // version of @eitem, in which case we don't want to show the base-class // @item, we'd rather show the item the user /actually/ requested, @eitem. item = eitem; eitem = null; } IType eclass = null; if (item is IType) { if (((IType)item).ClassType == ClassType.Interface) eclass = FindEnclosingClass (ctx, editor.Name, line, column); else eclass = (IType)item; if (eitem is IMethod && ((IMethod)eitem).IsConstructor && eitem.DeclaringType.Equals (item)) { item = eitem; eitem = null; } } INode realItem = item; if (item is InstantiatedType) realItem = ((InstantiatedType)item).UninstantiatedType; if (realItem is CompoundType) { editor.GetLineColumnFromPosition (editor.CursorPosition, out line, out column); ((CompoundType)realItem).SetMainPart (doc.FileName, line, column); item = realItem; } RefactoringOptions options = new RefactoringOptions () { Document = doc, Dom = ctx, ResolveResult = resolveResult, SelectedItem = realItem }; if (resolveResult != null && resolveResult.ResolvedExpression != null && !string.IsNullOrEmpty (resolveResult.ResolvedExpression.Expression)) { bool resolveDirect; List<string> namespaces = QuickFixHandler.GetResolveableNamespaces (options, out resolveDirect); if (item == null || namespaces.Count > 1) { CommandInfoSet resolveMenu = new CommandInfoSet (); resolveMenu.Text = GettextCatalog.GetString ("Resolve"); if (item == null) { foreach (string ns in namespaces) { // remove used namespaces for conflict resolving. if (options.Document.CompilationUnit.IsNamespaceUsedAt (ns, options.ResolveResult.ResolvedExpression.Region.Start)) continue; CommandInfo info = resolveMenu.CommandInfos.Add ("using " + ns + ";", new RefactoryOperation (new ResolveNameOperation (ctx, doc, resolveResult, ns).AddImport)); info.Icon = MonoDevelop.Ide.Gui.Stock.AddNamespace; } if (!(resolveResult is UnresolvedMemberResolveResult)) resolveMenu.CommandInfos.AddSeparator (); } else { // remove all unused namespaces (for resolving conflicts) namespaces.RemoveAll (ns => !doc.CompilationUnit.IsNamespaceUsedAt (ns, resolveResult.ResolvedExpression.Region.Start)); } if (resolveDirect) { foreach (string ns in namespaces) { resolveMenu.CommandInfos.Add (ns, new RefactoryOperation (new ResolveNameOperation (ctx, doc, resolveResult, ns).ResolveName)); } } if (namespaces.Count > (item == null ? 0 : 1)) ainfo.Add (resolveMenu, null); } } var unit = doc.CompilationUnit; if (unit != null && unit.Usings != null && unit.Usings.Any (u => !u.IsFromNamespace && u.Region.Contains (line, column))) { CommandInfoSet organizeUsingsMenu = new CommandInfoSet (); organizeUsingsMenu.Text = GettextCatalog.GetString ("_Organize Usings"); organizeUsingsMenu.CommandInfos.Add (IdeApp.CommandService.GetCommandInfo (RefactoryCommands.RemoveUnusedImports), new RefactoryOperation (delegate { new RemoveUnusedImportsHandler ().Start (options); })); organizeUsingsMenu.CommandInfos.Add (IdeApp.CommandService.GetCommandInfo (MonoDevelop.Refactoring.RefactoryCommands.SortImports), new RefactoryOperation (delegate { new SortImportsHandler ().Start (options); })); organizeUsingsMenu.CommandInfos.Add (IdeApp.CommandService.GetCommandInfo (MonoDevelop.Refactoring.RefactoryCommands.RemoveSortImports), new RefactoryOperation (delegate { new RemoveSortImportsHandler ().Start (options); })); ainfo.Add (organizeUsingsMenu, null); added = true; } CommandInfoSet ciset = new CommandInfoSet (); ciset.Text = GettextCatalog.GetString ("Refactor"); foreach (var refactoring in RefactoringService.Refactorings) { if (refactoring.IsValid (options)) { CommandInfo info = new CommandInfo (refactoring.GetMenuDescription (options)); info.AccelKey = refactoring.AccelKey; ciset.CommandInfos.Add (info, new RefactoryOperation (new RefactoringOperationWrapper (refactoring, options).Operation)); } } if (ciset.CommandInfos.Count > 0) { ainfo.Add (ciset, null); added = true; } ICompilationUnit pinfo = doc.CompilationUnit; if (pinfo == null) return; Refactorer refactorer = new Refactorer (ctx, pinfo, eclass, realItem, null); if (IdeApp.ProjectOperations.CanJumpToDeclaration (item)) { if (item is CompoundType) { CommandInfoSet declSet = new CommandInfoSet (); declSet.Text = GettextCatalog.GetString ("_Go to declaration"); CompoundType ct = (CompoundType)item; foreach (IType part in ct.Parts) { Refactorer partRefactorer = new Refactorer (ctx, pinfo, eclass, part, null); declSet.CommandInfos.Add (string.Format (GettextCatalog.GetString ("{0}, Line {1}"), FormatFileName (part.CompilationUnit.FileName), part.Location.Line), new RefactoryOperation (partRefactorer.GoToDeclaration)); } ainfo.Add (declSet); } else { ainfo.Add (IdeApp.CommandService.GetCommandInfo (RefactoryCommands.GotoDeclaration), new RefactoryOperation (refactorer.GoToDeclaration)); } added = true; } if ((item is IMember || item is LocalVariable || item is IParameter) && !(item is IType)) ainfo.Add (IdeApp.CommandService.GetCommandInfo (RefactoryCommands.FindReferences), new RefactoryOperation (refactorer.FindReferences)); Ambience ambience = AmbienceService.GetAmbienceForFile (pinfo.FileName); bool includeModifyCommands = this.IsModifiable (item); bool canRename; if ((item is LocalVariable) || (item is IParameter)) { canRename = true; } else if (item is IType) { canRename = ((IType)item).SourceProject != null; } else if (item is IMember) { IType cls = ((IMember)item).DeclaringType; canRename = cls != null && cls.SourceProject != null; } else { canRename = false; } // case: clicked on base in "constructor" - so pointing to the base constructor using argument count // not 100% correct, but it's the fastest thing to do. if (resolveResult is BaseResolveResult && eitem is IMethod && ((IMethod)eitem).IsConstructor) { IType type = item as IType; IMethod baseConstructor = null; int idx1 = resolveResult.ResolvedExpression.Expression.IndexOf ('('); int idx2 = resolveResult.ResolvedExpression.Expression.IndexOf (')'); int paramCount = 0; if (idx1 > 0 && idx2 > 0) { if (idx2 - idx1 > 1) paramCount++; for (int i=idx1; i < idx2; i++) { if (resolveResult.ResolvedExpression.Expression[i] == ',') paramCount++; } } foreach (IMethod m in type.Methods) { if (m.IsConstructor && m.Parameters.Count == paramCount) baseConstructor = m; } Refactorer refactorer2 = new Refactorer (ctx, pinfo, baseConstructor.DeclaringType, baseConstructor, null); ainfo.Add (GettextCatalog.GetString ("Go to _base"), new RefactoryOperation (refactorer2.GoToBase)); } if (item is IType) { IType cls = (IType) item; if (cls.BaseType != null && cls.ClassType == ClassType.Class) { foreach (IReturnType rt in cls.BaseTypes) { IType bc = ctx.GetType (rt); if (bc != null && bc.ClassType != ClassType.Interface/* TODO: && IdeApp.ProjectOperations.CanJumpToDeclaration (bc)*/) { ainfo.Add (GettextCatalog.GetString ("Go to _base"), new RefactoryOperation (refactorer.GoToBase)); break; } } } if ((cls.ClassType == ClassType.Class && !cls.IsSealed) || cls.ClassType == ClassType.Interface) { ainfo.Add (cls.ClassType != ClassType.Interface ? GettextCatalog.GetString ("Find _derived classes") : GettextCatalog.GetString ("Find _implementor classes"), new RefactoryOperation (refactorer.FindDerivedClasses)); } if (cls.SourceProject != null && includeModifyCommands && ((cls.ClassType == ClassType.Class) || (cls.ClassType == ClassType.Struct))) { ciset.CommandInfos.Add (GettextCatalog.GetString ("_Encapsulate Fields..."), new RefactoryOperation (refactorer.EncapsulateField)); ciset.CommandInfos.Add (GettextCatalog.GetString ("Override/Implement members..."), new RefactoryOperation (refactorer.OverrideOrImplementMembers)); } ainfo.Add (IdeApp.CommandService.GetCommandInfo (RefactoryCommands.FindReferences), new RefactoryOperation (refactorer.FindReferences)); // if (canRename) // ciset.CommandInfos.Add (GettextCatalog.GetString ("_Rename"), new RefactoryOperation (refactorer.Rename)); if (canRename && cls.ClassType == ClassType.Interface && eclass != null) { // is now provided by the refactoring command infrastructure: // ciset.CommandInfos.Add (GettextCatalog.GetString ("Implement Interface (explicit)"), new RefactoryOperation (refactorer.ImplementExplicitInterface)); // ciset.CommandInfos.Add (GettextCatalog.GetString ("Implement Interface (implicit)"), new RefactoryOperation (refactorer.ImplementImplicitInterface)); } else if (canRename && includeModifyCommands && cls.BaseType != null && cls.ClassType != ClassType.Interface && cls == eclass) { // Class might have interfaces... offer to implement them CommandInfoSet impset = new CommandInfoSet (); CommandInfoSet expset = new CommandInfoSet (); CommandInfoSet abstactset = new CommandInfoSet (); bool ifaceAdded = false; bool abstractAdded = false; foreach (IReturnType rt in cls.BaseTypes) { IType iface = ctx.GetType (rt); if (iface == null) continue; if (iface.ClassType == ClassType.Interface) { Refactorer ifaceRefactorer = new Refactorer (ctx, pinfo, cls, iface, rt); impset.CommandInfos.Add (ambience.GetString (rt, OutputFlags.IncludeGenerics), new RefactoryOperation (ifaceRefactorer.ImplementImplicitInterface)); expset.CommandInfos.Add (ambience.GetString (rt, OutputFlags.IncludeGenerics), new RefactoryOperation (ifaceRefactorer.ImplementExplicitInterface)); ifaceAdded = true; } else if (ContainsAbstractMembers (iface)) { Refactorer ifaceRefactorer = new Refactorer (ctx, pinfo, cls, iface, rt); abstactset.CommandInfos.Add (ambience.GetString (rt, OutputFlags.IncludeGenerics), new RefactoryOperation (ifaceRefactorer.ImplementAbstractMembers)); abstractAdded = true; } } if (ifaceAdded) { impset.Text = GettextCatalog.GetString ("Implement Interface (implicit)"); ciset.CommandInfos.Add (impset, null); expset.Text = GettextCatalog.GetString ("Implement Interface (explicit)"); ciset.CommandInfos.Add (expset, null); } if (abstractAdded) { abstactset.Text = GettextCatalog.GetString ("Implement abstract members"); ciset.CommandInfos.Add (abstactset, null); } } } else if (item is IField) { if (includeModifyCommands) { if (canRename) ciset.CommandInfos.Add (GettextCatalog.GetString ("_Encapsulate Field..."), new RefactoryOperation (refactorer.EncapsulateField)); } } else if (item is IMethod) { IMethod method = item as IMethod; if (method.IsOverride) { ainfo.Add (GettextCatalog.GetString ("Go to _base"), new RefactoryOperation (refactorer.GoToBase)); added = true; } } if (added) ainfo.AddSeparator (); /* while (item != null) { CommandInfo ci; // case: clicked on base in "constructor" - so pointing to the base constructor using argument count // not 100% correct, but it's the fastest thing to do. if (resolveResult is BaseResolveResult && eitem is IMethod && ((IMethod)eitem).IsConstructor) { IType type = item as IType; IMethod baseConstructor = null; int idx1 = resolveResult.ResolvedExpression.Expression.IndexOf ('('); int idx2 = resolveResult.ResolvedExpression.Expression.IndexOf (')'); int paramCount = 0; if (idx1 > 0 && idx2 > 0) { if (idx2 - idx1 > 1) paramCount++; for (int i=idx1; i < idx2; i++) { if (resolveResult.ResolvedExpression.Expression[i] == ',') paramCount++; } } foreach (IMethod m in type.Methods) { if (m.IsConstructor && m.Parameters.Count == paramCount) baseConstructor = m; } if (baseConstructor != null && (ci = BuildRefactoryMenuForItem (ctx, doc.CompilationUnit, null, baseConstructor, true)) != null) { ainfo.Add (ci, null); added = true; } } // Add the selected item if ((ci = BuildRefactoryMenuForItem (ctx, doc.CompilationUnit, eclass, item, IsModifiable (item))) != null) { ainfo.Add (ci, null); added = true; } if (item is IParameter) { // Add the encompasing method for the previous item in the menu item = ((IParameter) item).DeclaringMember; if (item != null && (ci = BuildRefactoryMenuForItem (ctx, doc.CompilationUnit, null, item, true)) != null) { ainfo.Add (ci, null); added = true; } } if (item is IMember && !(eitem != null && eitem is IMember)) { // Add the encompasing class for the previous item in the menu item = ((IMember) item).DeclaringType; if (item != null && (ci = BuildRefactoryMenuForItem (ctx, doc.CompilationUnit, null, item, IsModifiable (item))) != null) { ainfo.Add (ci, null); added = true; } } item = eitem; eitem = null; eclass = null; } if (added) ainfo.AddSeparator ();*/ }
protected override void Update (CommandArrayInfo ainfo) { var doc = IdeApp.Workbench.ActiveDocument; if (doc == null || doc.FileName == FilePath.Null) return; var parsedDocument = doc.ParsedDocument; if (parsedDocument == null || parsedDocument.IsInvalid) return; ResolveResult resolveResult; object item = GetItem (doc, out resolveResult); bool added = false; var options = new RefactoringOptions (doc) { ResolveResult = resolveResult, SelectedItem = item }; var ciset = new CommandInfoSet (); ciset.Text = GettextCatalog.GetString ("Refactor"); bool canRename; if (item is IVariable || item is IParameter) { canRename = true; } else if (item is ITypeDefinition) { canRename = !((ITypeDefinition)item).Region.IsEmpty; } else if (item is IType) { canRename = ((IType)item).Kind == TypeKind.TypeParameter; } else if (item is IMember) { canRename = !((IMember)item).Region.IsEmpty; } else { canRename = false; } if (canRename) { ciset.CommandInfos.Add (IdeApp.CommandService.GetCommandInfo (MonoDevelop.Ide.Commands.EditCommands.Rename), new System.Action (delegate { new MonoDevelop.Refactoring.Rename.RenameHandler ().Start (null); })); added = true; } foreach (var refactoring in RefactoringService.Refactorings) { if (refactoring.IsValid (options)) { CommandInfo info = new CommandInfo (refactoring.GetMenuDescription (options)); info.AccelKey = refactoring.AccelKey; ciset.CommandInfos.Add (info, new System.Action (new RefactoringOperationWrapper (refactoring, options).Operation)); } } var loc = doc.Editor.Caret.Location; bool first = true; if (lastDocument != doc.ParsedDocument || loc != lastLocation) { validActions = RefactoringService.GetValidActions (doc, loc).Result; lastLocation = loc; lastDocument = doc.ParsedDocument; } foreach (var fix_ in validActions) { var fix = fix_; if (first) { first = false; if (ciset.CommandInfos.Count > 0) ciset.CommandInfos.AddSeparator (); } ciset.CommandInfos.Add (fix.Title, new System.Action (() => fix.Run (doc, loc))); } if (ciset.CommandInfos.Count > 0) { ainfo.Add (ciset, null); added = true; } if (IdeApp.ProjectOperations.CanJumpToDeclaration (item)) { var type = item as ICSharpCode.NRefactory.TypeSystem.IType; if (type != null && type.GetDefinition ().Parts.Count > 1) { var declSet = new CommandInfoSet (); declSet.Text = GettextCatalog.GetString ("_Go to declaration"); var ct = type.GetDefinition (); foreach (var part in ct.Parts) declSet.CommandInfos.Add (string.Format (GettextCatalog.GetString ("{0}, Line {1}"), FormatFileName (part.Region.FileName), part.Region.BeginLine), new System.Action (new JumpTo (part).Run)); ainfo.Add (declSet); } else { ainfo.Add (IdeApp.CommandService.GetCommandInfo (RefactoryCommands.GotoDeclaration), new System.Action (new JumpTo (item).Run)); } added = true; } if (item is IEntity || item is ITypeParameter || item is IVariable) { ainfo.Add (IdeApp.CommandService.GetCommandInfo (RefactoryCommands.FindReferences), new System.Action (new FindRefs (item, false).Run)); if (doc.HasProject && ReferenceFinder.HasOverloads (doc.Project.ParentSolution, item)) ainfo.Add (IdeApp.CommandService.GetCommandInfo (RefactoryCommands.FindAllReferences), new System.Action (new FindRefs (item, true).Run)); added = true; } if (item is IMethod) { IMethod method = item as IMethod; if (method.IsOverride) { ainfo.Add (GettextCatalog.GetString ("Go to _base"), new System.Action (new GotoBase ((IMethod)item).Run)); added = true; } } else if (item is ITypeDefinition) { ITypeDefinition cls = (ITypeDefinition)item; foreach (var bc in cls.DirectBaseTypes) { if (bc != null && bc.GetDefinition () != null && bc.GetDefinition ().Kind != TypeKind.Interface/* TODO: && IdeApp.ProjectOperations.CanJumpToDeclaration (bc)*/) { ainfo.Add (GettextCatalog.GetString ("Go to _base"), new System.Action (new GotoBase ((ITypeDefinition)item).Run)); break; } } if ((cls.Kind == TypeKind.Class && !cls.IsSealed) || cls.Kind == TypeKind.Interface) { ainfo.Add (cls.Kind != TypeKind.Interface ? GettextCatalog.GetString ("Find _derived classes") : GettextCatalog.GetString ("Find _implementor classes"), new System.Action (new FindDerivedClasses (cls).Run)); } // if (baseConstructor != null) { // Refactorer refactorer2 = new Refactorer (ctx, pinfo, baseConstructor.DeclaringType, baseConstructor, null); // ainfo.Add (GettextCatalog.GetString ("Go to _base"), new RefactoryOperation (refactorer2.GoToBase)); // } } if (resolveResult != null) { // List<string> namespaces = QuickFixHandler.GetResolveableNamespaces (options, out resolveDirect); // // if (item == null || namespaces.Count > 1) { // if (item == null) { // foreach (string ns in namespaces) { // // remove used namespaces for conflict resolving. // if (options.Document.CompilationUnit.IsNamespaceUsedAt (ns, options.ResolveResult.ResolvedExpression.Region.Start)) // continue; // CommandInfo info = resolveMenu.CommandInfos.Add ("using " + ns + ";", new RefactoryOperation (new ResolveNameOperation (ctx, doc, resolveResult, ns).AddImport)); // info.Icon = MonoDevelop.Ide.Gui.Stock.AddNamespace; // } // // remove all unused namespaces (for resolving conflicts) // namespaces.RemoveAll (ns => !doc.CompilationUnit.IsNamespaceUsedAt (ns, resolveResult.ResolvedExpression.Region.Start)); // } // // if (namespaces.Count > (item == null ? 0 : 1)) // ainfo.Add (resolveMenu, null); // } } // // if (cls.GetSourceProject () != null && includeModifyCommands && ((cls.ClassType == ClassType.Class) || (cls.ClassType == ClassType.Struct))) { // ciset.CommandInfos.Add (GettextCatalog.GetString ("_Encapsulate Fields..."), new RefactoryOperation (refactorer.EncapsulateField)); // ciset.CommandInfos.Add (GettextCatalog.GetString ("Override/Implement members..."), new RefactoryOperation (refactorer.OverrideOrImplementMembers)); // } // // ainfo.Add (IdeApp.CommandService.GetCommandInfo (RefactoryCommands.FindReferences), new RefactoryOperation (refactorer.FindReferences)); // // if (canRename && cls.ClassType == ClassType.Interface && eclass != null) { // // is now provided by the refactoring command infrastructure: //// ciset.CommandInfos.Add (GettextCatalog.GetString ("Implement Interface (explicit)"), new RefactoryOperation (refactorer.ImplementExplicitInterface)); //// ciset.CommandInfos.Add (GettextCatalog.GetString ("Implement Interface (implicit)"), new RefactoryOperation (refactorer.ImplementImplicitInterface)); // } else if (canRename && includeModifyCommands && cls.BaseType != null && cls.ClassType != ClassType.Interface && cls == eclass) { // // Class might have interfaces... offer to implement them // CommandInfoSet impset = new CommandInfoSet (); // CommandInfoSet expset = new CommandInfoSet (); // CommandInfoSet abstactset = new CommandInfoSet (); // bool ifaceAdded = false; // bool abstractAdded = false; // // foreach (IReturnType rt in cls.BaseTypes) { // IType iface = ctx.GetType (rt); // if (iface == null) // continue; // if (iface.ClassType == ClassType.Interface) { // Refactorer ifaceRefactorer = new Refactorer (ctx, pinfo, cls, iface, rt); // impset.CommandInfos.Add (ambience.GetString (rt, OutputFlags.IncludeGenerics), new RefactoryOperation (ifaceRefactorer.ImplementImplicitInterface)); // expset.CommandInfos.Add (ambience.GetString (rt, OutputFlags.IncludeGenerics), new RefactoryOperation (ifaceRefactorer.ImplementExplicitInterface)); // ifaceAdded = true; // } else if (ContainsAbstractMembers (iface)) { // Refactorer ifaceRefactorer = new Refactorer (ctx, pinfo, cls, iface, rt); // abstactset.CommandInfos.Add (ambience.GetString (rt, OutputFlags.IncludeGenerics), new RefactoryOperation (ifaceRefactorer.ImplementAbstractMembers)); // abstractAdded = true; // } // } // // if (ifaceAdded) { // impset.Text = GettextCatalog.GetString ("Implement Interface (implicit)"); // ciset.CommandInfos.Add (impset, null); // // expset.Text = GettextCatalog.GetString ("Implement Interface (explicit)"); // ciset.CommandInfos.Add (expset, null); // } // if (abstractAdded) { // abstactset.Text = GettextCatalog.GetString ("Implement abstract members"); // ciset.CommandInfos.Add (abstactset, null); // } // } // } // IMember eitem = resolveResult != null ? (resolveResult.CallingMember ?? resolveResult.CallingType) : null; // // string itemName = null; // if (item is IMember) // itemName = ((IMember)item).Name; // // if (item != null && eitem != null && (eitem.Equals (item) || (eitem.Name == itemName && !(eitem is IProperty) && !(eitem is IMethod)))) { // // If this occurs, then @item is either its own enclosing item, in // // which case, we don't want to show it twice, or it is the base-class // // version of @eitem, in which case we don't want to show the base-class // // @item, we'd rather show the item the user /actually/ requested, @eitem. // item = eitem; // eitem = null; // } // // IType eclass = null; // // if (item is IType) { // if (((IType)item).ClassType == ClassType.Interface) // eclass = FindEnclosingClass (ctx, editor.Name, line, column); else // eclass = (IType)item; // if (eitem is IMethod && ((IMethod)eitem).IsConstructor && eitem.DeclaringType.Equals (item)) { // item = eitem; // eitem = null; // } // } // // INode realItem = item; // if (item is InstantiatedType) // realItem = ((InstantiatedType)item).UninstantiatedType; // if (realItem is CompoundType) { // editor.GetLineColumnFromPosition (editor.CursorPosition, out line, out column); // ((CompoundType)realItem).SetMainPart (doc.FileName, line, column); // item = realItem; // } // // // // var unit = doc.CompilationUnit; // if (unit != null && unit.Usings != null && unit.Usings.Any (u => !u.IsFromNamespace && u.Region.Contains (line, column))) { // CommandInfoSet organizeUsingsMenu = new CommandInfoSet (); // organizeUsingsMenu.Text = GettextCatalog.GetString ("_Organize Usings"); // organizeUsingsMenu.CommandInfos.Add (IdeApp.CommandService.GetCommandInfo (RefactoryCommands.RemoveUnusedImports), new RefactoryOperation (delegate { // new RemoveUnusedImportsHandler ().Start (options); // })); // organizeUsingsMenu.CommandInfos.Add (IdeApp.CommandService.GetCommandInfo (MonoDevelop.Refactoring.RefactoryCommands.SortImports), new RefactoryOperation (delegate { // new SortImportsHandler ().Start (options); // })); // organizeUsingsMenu.CommandInfos.Add (IdeApp.CommandService.GetCommandInfo (MonoDevelop.Refactoring.RefactoryCommands.RemoveSortImports), new RefactoryOperation (delegate { // new RemoveSortImportsHandler ().Start (options); // })); // ainfo.Add (organizeUsingsMenu, null); // added = true; // } // // IUnresolvedFile pinfo = doc.CompilationUnit; // if (pinfo == null) // return; // // // Refactorer refactorer = new Refactorer (ctx, pinfo, eclass, realItem, null); // Ambience ambience = AmbienceService.GetAmbienceForFile (pinfo.FileName); // bool includeModifyCommands = this.IsModifiable (item); // // // // case: clicked on base in "constructor" - so pointing to the base constructor using argument count // // not 100% correct, but it's the fastest thing to do. // if (resolveResult is BaseResolveResult && eitem is IMethod && ((IMethod)eitem).IsConstructor) { // IType type = item as IType; // IMethod baseConstructor = null; // int idx1 = resolveResult.ResolvedExpression.Expression.IndexOf ('('); // int idx2 = resolveResult.ResolvedExpression.Expression.IndexOf (')'); // int paramCount = 0; // if (idx1 > 0 && idx2 > 0) { // if (idx2 - idx1 > 1) // paramCount++; // for (int i=idx1; i < idx2; i++) { // if (resolveResult.ResolvedExpression.Expression[i] == ',') // paramCount++; // } // } // foreach (IMethod m in type.Methods) { // if (m.IsConstructor && m.Parameters.Count == paramCount) // baseConstructor = m; // } // Refactorer refactorer2 = new Refactorer (ctx, pinfo, baseConstructor.DeclaringType, baseConstructor, null); // ainfo.Add (GettextCatalog.GetString ("Go to _base"), new RefactoryOperation (refactorer2.GoToBase)); // } // // else if (item is IField) { // if (includeModifyCommands) { // if (canRename) // ciset.CommandInfos.Add (GettextCatalog.GetString ("_Encapsulate Field..."), new RefactoryOperation (refactorer.EncapsulateField)); // } // } else if (added) ainfo.AddSeparator (); /* while (item != null) { CommandInfo ci; // case: clicked on base in "constructor" - so pointing to the base constructor using argument count // not 100% correct, but it's the fastest thing to do. if (resolveResult is BaseResolveResult && eitem is IMethod && ((IMethod)eitem).IsConstructor) { IType type = item as IType; IMethod baseConstructor = null; int idx1 = resolveResult.ResolvedExpression.Expression.IndexOf ('('); int idx2 = resolveResult.ResolvedExpression.Expression.IndexOf (')'); int paramCount = 0; if (idx1 > 0 && idx2 > 0) { if (idx2 - idx1 > 1) paramCount++; for (int i=idx1; i < idx2; i++) { if (resolveResult.ResolvedExpression.Expression[i] == ',') paramCount++; } } foreach (IMethod m in type.Methods) { if (m.IsConstructor && m.Parameters.Count == paramCount) baseConstructor = m; } if (baseConstructor != null && (ci = BuildRefactoryMenuForItem (ctx, doc.CompilationUnit, null, baseConstructor, true)) != null) { ainfo.Add (ci, null); added = true; } } // Add the selected item if ((ci = BuildRefactoryMenuForItem (ctx, doc.CompilationUnit, eclass, item, IsModifiable (item))) != null) { ainfo.Add (ci, null); added = true; } if (item is IParameter) { // Add the encompasing method for the previous item in the menu item = ((IParameter) item).DeclaringMember; if (item != null && (ci = BuildRefactoryMenuForItem (ctx, doc.CompilationUnit, null, item, true)) != null) { ainfo.Add (ci, null); added = true; } } if (item is IMember && !(eitem != null && eitem is IMember)) { // Add the encompasing class for the previous item in the menu item = ((IMember) item).DeclaringType; if (item != null && (ci = BuildRefactoryMenuForItem (ctx, doc.CompilationUnit, null, item, IsModifiable (item))) != null) { ainfo.Add (ci, null); added = true; } } item = eitem; eitem = null; eclass = null; } if (added) ainfo.AddSeparator ();*/ }
protected override void Update (CommandArrayInfo ainfo) { var doc = IdeApp.Workbench.ActiveDocument; if (doc == null || doc.FileName == FilePath.Null) return; var parsedDocument = doc.ParsedDocument; if (parsedDocument == null || parsedDocument.IsInvalid) return; ResolveResult resolveResult; object item = GetItem (doc, out resolveResult); bool added = false; var options = new RefactoringOptions (doc) { ResolveResult = resolveResult, SelectedItem = item }; var ciset = new CommandInfoSet (); ciset.Text = GettextCatalog.GetString ("Refactor"); bool canRename; if (item is IVariable || item is IParameter) { canRename = true; } else if (item is ITypeDefinition) { canRename = !((ITypeDefinition)item).Region.IsEmpty; } else if (item is IType) { canRename = ((IType)item).Kind == TypeKind.TypeParameter; } else if (item is IMember) { canRename = !((IMember)item).Region.IsEmpty; } else if (item is INamespace) { canRename = true; } else { canRename = false; } if (canRename) { ciset.CommandInfos.Add (IdeApp.CommandService.GetCommandInfo (MonoDevelop.Ide.Commands.EditCommands.Rename), new Action (delegate { new MonoDevelop.Refactoring.Rename.RenameHandler ().Start (null); })); added = true; } foreach (var refactoring in RefactoringService.Refactorings) { if (refactoring.IsValid (options)) { CommandInfo info = new CommandInfo (refactoring.GetMenuDescription (options)); info.AccelKey = refactoring.AccelKey; ciset.CommandInfos.Add (info, new Action (new RefactoringOperationWrapper (refactoring, options).Operation)); } } var refactoringInfo = doc.Annotation<RefactoringDocumentInfo> (); if (refactoringInfo == null) { refactoringInfo = new RefactoringDocumentInfo (); doc.AddAnnotation (refactoringInfo); } var loc = doc.Editor.Caret.Location; bool first = true; if (refactoringInfo.lastDocument != doc.ParsedDocument || loc != lastLocation) { try { refactoringInfo.validActions = RefactoringService.GetValidActions (doc, loc, new CancellationTokenSource (500).Token); } catch (TaskCanceledException) { } catch (AggregateException ae) { ae.Flatten ().Handle (x => x is TaskCanceledException); } lastLocation = loc; refactoringInfo.lastDocument = doc.ParsedDocument; } if (refactoringInfo.validActions != null && refactoringInfo.lastDocument != null && refactoringInfo.lastDocument.CreateRefactoringContext != null) { var context = refactoringInfo.lastDocument.CreateRefactoringContext (doc, CancellationToken.None); foreach (var fix_ in refactoringInfo.validActions.OrderByDescending (i => Tuple.Create (CodeActionEditorExtension.IsAnalysisOrErrorFix(i), (int)i.Severity, CodeActionEditorExtension.GetUsage (i.IdString)))) { if (CodeActionEditorExtension.IsAnalysisOrErrorFix (fix_)) continue; var fix = fix_; if (first) { first = false; if (ciset.CommandInfos.Count > 0) ciset.CommandInfos.AddSeparator (); } ciset.CommandInfos.Add (fix.Title, new Action (() => RefactoringService.ApplyFix (fix, context))); } } if (ciset.CommandInfos.Count > 0) { ainfo.Add (ciset, null); added = true; } if (IdeApp.ProjectOperations.CanJumpToDeclaration (item)) { var type = item as IType; if (type != null && type.GetDefinition ().Parts.Count > 1) { var declSet = new CommandInfoSet (); declSet.Text = GettextCatalog.GetString ("_Go to Declaration"); var ct = type.GetDefinition (); foreach (var part in ct.Parts) declSet.CommandInfos.Add (string.Format (GettextCatalog.GetString ("{0}, Line {1}"), FormatFileName (part.Region.FileName), part.Region.BeginLine), new System.Action (new JumpTo (part).Run)); ainfo.Add (declSet); } else { ainfo.Add (IdeApp.CommandService.GetCommandInfo (RefactoryCommands.GotoDeclaration), new System.Action (new JumpTo (item).Run)); } added = true; } if (item is IMember) { var member = (IMember)item; if (member.IsOverride || member.ImplementedInterfaceMembers.Any ()) { ainfo.Add (GettextCatalog.GetString ("Go to _Base Symbol"), new System.Action (new GotoBase (member).Run)); added = true; } } if (!(item is IMethod && ((IMethod)item).SymbolKind == SymbolKind.Operator) && (item is IEntity || item is ITypeParameter || item is IVariable || item is INamespace)) { ainfo.Add (IdeApp.CommandService.GetCommandInfo (RefactoryCommands.FindReferences), new System.Action (new FindRefs (item, false).Run)); if (doc.HasProject && HasOverloads (doc.Project.ParentSolution, item)) ainfo.Add (IdeApp.CommandService.GetCommandInfo (RefactoryCommands.FindAllReferences), new System.Action (new FindRefs (item, true).Run)); added = true; } if (item is IMember) { var member = (IMember)item; var handler = new FindDerivedSymbolsHandler (member); if (handler.IsValid) { var a = ainfo.Add (GettextCatalog.GetString ("Find Derived Symbols"), new Action (handler.Run)); a.AccelKey = IdeApp.CommandService.GetCommandInfo (RefactoryCommands.FindDerivedClasses).AccelKey; added = true; } } if (item is IMember) { var member = (IMember)item; if (member.SymbolKind == SymbolKind.Method || member.SymbolKind == SymbolKind.Indexer) { var findMemberOverloadsHandler = new FindMemberOverloadsHandler (doc, member); if (findMemberOverloadsHandler.IsValid) { ainfo.Add (GettextCatalog.GetString ("Find Member Overloads"), new System.Action (findMemberOverloadsHandler.Run)); added = true; } } } if (item is ITypeDefinition) { ITypeDefinition cls = (ITypeDefinition)item; foreach (var bc in cls.DirectBaseTypes) { if (bc != null && bc.GetDefinition () != null && bc.GetDefinition ().Kind != TypeKind.Interface/* TODO: && IdeApp.ProjectOperations.CanJumpToDeclaration (bc)*/) { ainfo.Add (GettextCatalog.GetString ("Go to _Base"), new System.Action (new GotoBase ((ITypeDefinition)item).Run)); break; } } if ((cls.Kind == TypeKind.Class && !cls.IsSealed) || cls.Kind == TypeKind.Interface) { var label = cls.Kind != TypeKind.Interface ? GettextCatalog.GetString ("Find _derived classes") : GettextCatalog.GetString ("Find _implementor classes"); var a = ainfo.Add (label, new System.Action (new FindDerivedClasses (cls).Run)); a.AccelKey = IdeApp.CommandService.GetCommandInfo (RefactoryCommands.FindDerivedClasses).AccelKey; } ainfo.Add (GettextCatalog.GetString ("Find Extension Methods"), new System.Action (new FindExtensionMethodHandler (doc, cls).Run)); added = true; } if (added) ainfo.AddSeparator (); }
public void OnOpenWithUpdate (CommandArrayInfo info) { ProjectFile finfo = (ProjectFile) CurrentNode.DataItem; FileViewer prev = null; foreach (FileViewer fv in IdeApp.Workbench.GetFileViewers (finfo.Name)) { if (prev != null && fv.IsExternal != prev.IsExternal) info.AddSeparator (); CommandInfo ci = info.Add (fv.Title, fv); ci.Description = GettextCatalog.GetString ("Open with '{0}'", fv.Title); prev = fv; } }
protected override void Update (CommandArrayInfo ainfo) { var doc = IdeApp.Workbench.ActiveDocument; if (doc == null || doc.FileName == FilePath.Null) return; var parsedDocument = doc.ParsedDocument; if (parsedDocument == null || parsedDocument.IsInvalid) return; ResolveResult resolveResult; object item = GetItem (doc, out resolveResult); bool added = false; var options = new RefactoringOptions (doc) { ResolveResult = resolveResult, SelectedItem = item }; var ciset = new CommandInfoSet (); ciset.Text = GettextCatalog.GetString ("Refactor"); bool canRename; if (item is IVariable || item is IParameter) { canRename = true; } else if (item is ITypeDefinition) { canRename = !((ITypeDefinition)item).Region.IsEmpty; } else if (item is IType) { canRename = ((IType)item).Kind == TypeKind.TypeParameter; } else if (item is IMember) { canRename = !((IMember)item).Region.IsEmpty; } else if (item is INamespace) { canRename = true; } else { canRename = false; } if (canRename) { ciset.CommandInfos.Add (IdeApp.CommandService.GetCommandInfo (MonoDevelop.Ide.Commands.EditCommands.Rename), new Action (delegate { new MonoDevelop.Refactoring.Rename.RenameHandler ().Start (null); })); added = true; } foreach (var refactoring in RefactoringService.Refactorings) { if (refactoring.IsValid (options)) { CommandInfo info = new CommandInfo (refactoring.GetMenuDescription (options)); info.AccelKey = refactoring.AccelKey; ciset.CommandInfos.Add (info, new Action (new RefactoringOperationWrapper (refactoring, options).Operation)); } } var loc = doc.Editor.Caret.Location; bool first = true; if (lastDocument != doc.ParsedDocument || loc != lastLocation) { if (QuickTaskStrip.EnableFancyFeatures) { var ext = doc.GetContent <CodeActionEditorExtension> (); validActions = ext != null ? ext.GetCurrentFixes () : null; } else { validActions = RefactoringService.GetValidActions (doc, loc).Result; } lastLocation = loc; lastDocument = doc.ParsedDocument; } if (validActions != null) { foreach (var fix_ in validActions) { var fix = fix_; if (first) { first = false; if (ciset.CommandInfos.Count > 0) ciset.CommandInfos.AddSeparator (); } ciset.CommandInfos.Add (fix.Title, new Action (() => fix.Run (doc, loc))); } } if (ciset.CommandInfos.Count > 0) { ainfo.Add (ciset, null); added = true; } if (IdeApp.ProjectOperations.CanJumpToDeclaration (item)) { var type = item as IType; if (type != null && type.GetDefinition ().Parts.Count > 1) { var declSet = new CommandInfoSet (); declSet.Text = GettextCatalog.GetString ("_Go to declaration"); var ct = type.GetDefinition (); foreach (var part in ct.Parts) declSet.CommandInfos.Add (string.Format (GettextCatalog.GetString ("{0}, Line {1}"), FormatFileName (part.Region.FileName), part.Region.BeginLine), new System.Action (new JumpTo (part).Run)); ainfo.Add (declSet); } else { ainfo.Add (IdeApp.CommandService.GetCommandInfo (RefactoryCommands.GotoDeclaration), new System.Action (new JumpTo (item).Run)); } added = true; } if (item is IEntity || item is ITypeParameter || item is IVariable || item is INamespace) { ainfo.Add (IdeApp.CommandService.GetCommandInfo (RefactoryCommands.FindReferences), new System.Action (new FindRefs (item, false).Run)); if (doc.HasProject && HasOverloads (doc.Project.ParentSolution, item)) ainfo.Add (IdeApp.CommandService.GetCommandInfo (RefactoryCommands.FindAllReferences), new System.Action (new FindRefs (item, true).Run)); added = true; } if (item is IMethod) { IMethod method = item as IMethod; if (method.IsOverride) { ainfo.Add (GettextCatalog.GetString ("Go to _base"), new System.Action (new GotoBase ((IMethod)item).Run)); added = true; } } else if (item is ITypeDefinition) { ITypeDefinition cls = (ITypeDefinition)item; foreach (var bc in cls.DirectBaseTypes) { if (bc != null && bc.GetDefinition () != null && bc.GetDefinition ().Kind != TypeKind.Interface/* TODO: && IdeApp.ProjectOperations.CanJumpToDeclaration (bc)*/) { ainfo.Add (GettextCatalog.GetString ("Go to _base"), new System.Action (new GotoBase ((ITypeDefinition)item).Run)); break; } } if ((cls.Kind == TypeKind.Class && !cls.IsSealed) || cls.Kind == TypeKind.Interface) { ainfo.Add (cls.Kind != TypeKind.Interface ? GettextCatalog.GetString ("Find _derived classes") : GettextCatalog.GetString ("Find _implementor classes"), new System.Action (new FindDerivedClasses (cls).Run)); } } if (added) ainfo.AddSeparator (); }
protected void OnUpdateInsertOption (CommandArrayInfo info) { foreach (string[] op in options) { if (op [0] == "-") info.AddSeparator (); else info.Add (op [0], op [1]); } }
public void OnOpenWithUpdate (CommandArrayInfo info) { SystemFile file = CurrentNode.DataItem as SystemFile; FileViewer prev = null; foreach (FileViewer fv in IdeApp.Workbench.GetFileViewers (file.Path)) { if (prev != null && fv.IsExternal != prev.IsExternal) info.AddSeparator (); info.Add (fv.Title, fv); prev = fv; } }
protected override void Update (CommandArrayInfo info) { foreach (ExternalTools.ExternalTool externalTool in ExternalTools.ExternalToolService.Tools) { //Create CommandInfo object CommandInfo commandInfo = new CommandInfo (); commandInfo.Text = externalTool.MenuCommand; commandInfo.Description = GettextCatalog.GetString ("Start tool {0}", string.Join (string.Empty, externalTool.MenuCommand.Split('&'))); commandInfo.AccelKey = externalTool.AccelKey; //Add menu item info.Add (commandInfo, externalTool); } if (info.Count > 0) info.AddSeparator (); }