// // // // // $Revision: $ // using System; using System.IO; using System.Linq; using ICSharpCode.Core; using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Editor.Commands; using ICSharpCode.SharpDevelop.Refactoring; namespace SharpRefactoring.ContextActions { /// /// Description of CacheClassAtCaret. /// public class CacheClassAtCaret : IContextActionCache { public IClass Class { get; private set; } public bool IsClassFileNameCorrect { get; private set; } public string CorrectClassFileName { get; private set; } public bool IsCorrectClassFileNameAvailable { get; private set; } public bool IsClassReadOnly { get; private set; } public bool IsCaretAtClassDeclaration { get; private set; } public bool IsFixClassFileNameAvailable { get { return !IsClassReadOnly && IsCaretAtClassDeclaration && !IsClassFileNameCorrect && IsCorrectClassFileNameAvailable; } } public void Initialize(EditorContext context) { this.Class = GetClass(context.CurrentSymbol); if (this.Class == null) return; var c = this.Class; // TODO cache var classDecls = context.GetClassDeclarationsOnCurrentLine().ToList(); this.IsCaretAtClassDeclaration = classDecls.Count == 1 && (classDecls[0].FullyQualifiedName == c.FullyQualifiedName); this.IsClassFileNameCorrect = (c.IsInnerClass() || (!c.IsUserCode()) || c.Name.Equals(Path.GetFileNameWithoutExtension(c.CompilationUnit.FileName), StringComparison.OrdinalIgnoreCase)); if (string.IsNullOrEmpty(c.CompilationUnit.FileName)) { // Cannot get path this.CorrectClassFileName = null; this.IsCorrectClassFileNameAvailable = false; return; } this.CorrectClassFileName = Path.Combine(Path.GetDirectoryName(c.CompilationUnit.FileName), c.Name + Path.GetExtension(c.CompilationUnit.FileName)); this.IsCorrectClassFileNameAvailable = (FileUtility.IsValidPath(CorrectClassFileName) && Path.IsPathRooted(CorrectClassFileName) && !File.Exists(CorrectClassFileName)); this.IsClassReadOnly = FindReferencesAndRenameHelper.IsReadOnly(this.Class); } IClass GetClass(ResolveResult currentSymbol) { if (currentSymbol == null || currentSymbol.ResolvedType == null) return null; IClass c = currentSymbol.ResolvedType.GetUnderlyingClass(); if (c == null) return null; c = c.ProjectContent.GetClass(c.FullyQualifiedName, c.TypeParameters.Count, c.ProjectContent.Language, GetClassOptions.LookForInnerClass); return ClassBookmarkSubmenuBuilder.GetCurrentPart(c); } } }