// // // // // $Revision: $ // using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using ICSharpCode.Core; using ICSharpCode.Core.Presentation; using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Refactoring; namespace ICSharpCode.SharpDevelop.Refactoring { /// /// Description of ContextCommandsHelper. /// public class ContextActionsHelper { public static ContextActionsPopup MakePopupWithDerivedClasses(IClass baseClass) { var derivedClassesTree = RefactoringService.FindDerivedClassesTree(baseClass); var popupViewModel = new ContextActionsViewModel { Title = MenuService.ConvertLabel(StringParser.Parse( "${res:SharpDevelop.Refactoring.ClassesDerivingFrom}", new StringTagPair("Name", baseClass.Name)))}; popupViewModel.Actions = new PopupTreeViewModelBuilder().BuildTreeViewModel(derivedClassesTree); return new ContextActionsPopup { Actions = popupViewModel }; } public static ContextActionsPopup MakePopupWithBaseClasses(IClass @class) { var baseClassList = @class.ClassInheritanceTree.Where( baseClass => (baseClass != @class) && (baseClass.CompilationUnit != null) && (baseClass.CompilationUnit.FileName != null)); var popupViewModel = new ContextActionsViewModel { Title = MenuService.ConvertLabel(StringParser.Parse( "${res:SharpDevelop.Refactoring.BaseClassesOf}", new StringTagPair("Name", @class.Name)))}; popupViewModel.Actions = new PopupListViewModelBuilder().BuildListViewModel(baseClassList); return new ContextActionsPopup { Actions = popupViewModel }; } public static ContextActionsPopup MakePopupWithOverrides(IMember member) { var derivedClassesTree = RefactoringService.FindDerivedClassesTree(member.DeclaringType); var popupViewModel = new ContextActionsViewModel { Title = MenuService.ConvertLabel(StringParser.Parse( "${res:SharpDevelop.Refactoring.OverridesOf}", new string[,] {{ "Name", member.FullyQualifiedName }}))}; popupViewModel.Actions = new OverridesPopupTreeViewModelBuilder(member).BuildTreeViewModel(derivedClassesTree); return new ContextActionsPopup { Actions = popupViewModel }; } class PopupViewModelBuilder { protected IAmbience LabelAmbience { get; set; } protected PopupViewModelBuilder() { this.LabelAmbience = AmbienceService.GetCurrentAmbience(); this.LabelAmbience.ConversionFlags = ConversionFlags.ShowTypeParameterList; } protected ContextActionViewModel MakeGoToClassAction(IClass @class, ObservableCollection childActions) { return new ContextActionViewModel { Action = new GoToClassAction(@class, this.LabelAmbience), Image = ClassBrowserIconService.GetIcon(@class).ImageSource, Comment = string.Format("(in {0})", @class.Namespace), ChildActions = childActions }; } } class PopupListViewModelBuilder : PopupViewModelBuilder { public ObservableCollection BuildListViewModel(IEnumerable classList) { return new ObservableCollection( classList.Select(@class => MakeGoToClassAction(@class, null))); } } class PopupTreeViewModelBuilder : PopupViewModelBuilder { public ObservableCollection BuildTreeViewModel(IEnumerable> classTree) { return new ObservableCollection( classTree.Select( node => MakeGoToClassAction (node.Content, BuildTreeViewModel(node.Children)))); } } class OverridesPopupTreeViewModelBuilder : PopupViewModelBuilder { IMember member; public OverridesPopupTreeViewModelBuilder(IMember member) { if (member == null) throw new ArgumentNullException("member"); this.member = member; } protected ContextActionViewModel MakeGoToMemberAction(IClass containingClass, ObservableCollection childActions) { var overridenMember = MemberLookupHelper.FindSimilarMember(containingClass, this.member); if (overridenMember == null || overridenMember.Region.IsEmpty) return null; return new ContextActionViewModel { Action = new GoToMemberAction(overridenMember, this.LabelAmbience), Image = ClassBrowserIconService.GetIcon(overridenMember).ImageSource, Comment = string.Format("(in {0})", containingClass.FullyQualifiedName), ChildActions = childActions }; } public ObservableCollection BuildTreeViewModel(IEnumerable> classTree) { return new ObservableCollection( classTree.Select( node => MakeGoToMemberAction(node.Content, BuildTreeViewModel(node.Children))).Where(action => action != null)); } } } }