43
43
public class MoveTypeToFile : MonoDevelop.CodeActions.CodeActionProvider
45
public override IEnumerable<MonoDevelop.CodeActions.CodeAction> GetActions (MonoDevelop.Ide.Gui.Document document, TextLocation loc, CancellationToken cancellationToken)
45
public override IEnumerable<MonoDevelop.CodeActions.CodeAction> GetActions (MonoDevelop.Ide.Gui.Document document, object refactoringContext, TextLocation loc, CancellationToken cancellationToken)
47
var context = new MDRefactoringContext (document, loc);
47
var context = (MDRefactoringContext)refactoringContext;
48
48
return GetActions (context);
50
50
protected IEnumerable<MonoDevelop.CodeActions.CodeAction> GetActions (MDRefactoringContext context)
54
54
var type = GetTypeDeclaration (context);
57
if (Path.GetFileNameWithoutExtension (context.Document.FileName) == type.Name)
57
if (Path.GetFileNameWithoutExtension (context.TextEditor.FileName) == type.Name)
60
60
if (IsSingleType (context)) {
61
title = String.Format (GettextCatalog.GetString ("_Rename file to '{0}'"), Path.GetFileName (GetCorrectFileName (context, type)));
61
title = String.Format (GettextCatalog.GetString ("Rename file to '{0}'"), Path.GetFileName (GetCorrectFileName (context, type)));
63
title = String.Format (GettextCatalog.GetString ("_Move type to file '{0}'"), Path.GetFileName (GetCorrectFileName (context, type)));
63
title = String.Format (GettextCatalog.GetString ("Move type to file '{0}'"), Path.GetFileName (GetCorrectFileName (context, type)));
65
65
yield return new MonoDevelop.CodeActions.DefaultCodeAction (title, (d, l) => {
66
66
var ctx = new MDRefactoringContext (d, l);
67
67
string correctFileName = GetCorrectFileName (ctx, type);
68
68
if (IsSingleType (ctx)) {
69
FileService.RenameFile (ctx.Document.FileName, correctFileName);
70
if (ctx.Document.Project != null)
71
ctx.Document.Project.Save (new NullProgressMonitor ());
69
FileService.RenameFile (ctx.TextEditor.FileName, correctFileName);
70
if (ctx.Project != null)
71
ctx.Project.Save (new NullProgressMonitor ());
82
82
static void CreateNewFile (MDRefactoringContext context, TypeDeclaration type, string correctFileName)
84
var content = context.Document.Editor.Text;
84
var content = context.TextEditor.Text;
86
var types = new List<TypeDeclaration> (context.Unit.GetTypes ().Where (t => t.StartLocation != type.StartLocation));
86
var types = new List<EntityDeclaration> (context.Unit.GetTypes ().Where (t => t.StartLocation != type.StartLocation));
87
87
types.Sort ((x, y) => y.StartLocation.CompareTo (x.StartLocation));
89
89
foreach (var removeType in types) {
92
92
content = content.Remove (start, end - start);
95
if (context.Document.Project is MonoDevelop.Projects.DotNetProject) {
96
string header = StandardHeaderService.GetHeader (context.Document.Project, correctFileName, true);
95
if (context.Project != null) {
96
string header = StandardHeaderService.GetHeader (context.Project, correctFileName, true);
97
97
if (!string.IsNullOrEmpty (header))
98
content = header + context.Document.Editor.EolMarker + StripHeader (content);
98
content = header + context.TextEditor.EolMarker + StripHeader (content);
100
100
content = StripDoubleBlankLines (content);
102
102
File.WriteAllText (correctFileName, content);
103
context.Document.Project.AddFile (correctFileName);
104
MonoDevelop.Ide.IdeApp.ProjectOperations.Save (context.Document.Project);
103
context.Project.AddFile (correctFileName);
104
MonoDevelop.Ide.IdeApp.ProjectOperations.Save (context.Project);
107
107
static bool IsBlankLine (TextDocument doc, int i)
157
157
internal static string GetCorrectFileName (MDRefactoringContext context, EntityDeclaration type)
159
159
if (type == null)
160
return context.Document.FileName;
161
return Path.Combine (Path.GetDirectoryName (context.Document.FileName), type.Name + Path.GetExtension (context.Document.FileName));
160
return context.TextEditor.FileName;
161
return Path.Combine (Path.GetDirectoryName (context.TextEditor.FileName), type.Name + Path.GetExtension (context.TextEditor.FileName));