public static bool UpdateFile(string changedFile) { bool shouldSave = false; bool handled = false; lock (mUpdateFileLock) { if (ProjectManager.ProjectBase != null) { handled = TryHandleProjectFileChanges(changedFile); string projectFileName = ProjectManager.ProjectBase.FullFileName; var standardizedGlux = FileManager.RemoveExtension(FileManager.Standardize(projectFileName).ToLower()) + ".glux"; var partialGlux = FileManager.RemoveExtension(FileManager.Standardize(projectFileName).ToLower()) + @"\..*\.generated\.glux"; var partialGluxRegex = new Regex(partialGlux); if (!handled && ((changedFile.ToLower() == standardizedGlux) || partialGluxRegex.IsMatch(changedFile.ToLower()))) { TaskManager.Self.OnUiThread(ReloadGlux); handled = true; } if (ProjectManager.IsContent(changedFile)) { PluginManager.ReactToChangedFile(changedFile); } #region If it's a CSV, then re-generate the code for the objects string extension = FileManager.GetExtension(changedFile); if (extension == "csv" || extension == "txt") { ReferencedFileSave rfs = ObjectFinder.Self.GetReferencedFileSaveFromFile(changedFile); bool shouldGenerate = rfs != null && (extension == "csv" || rfs.TreatAsCsv) && rfs.IsDatabaseForLocalizing == false; if (shouldGenerate) { try { CsvCodeGenerator.GenerateAndSaveDataClass(rfs, rfs.CsvDelimiter); shouldSave = true; } catch (Exception e) { GlueCommands.Self.PrintError("Error saving Class from CSV " + rfs.Name + "\n" + e.ToString()); } } } #endregion #region If it's a file that references other content we may need to update the project if (FileHelper.DoesFileReferenceContent(changedFile)) { ReferencedFileSave rfs = ObjectFinder.Self.GetReferencedFileSaveFromFile(changedFile); if (rfs != null) { string error; rfs.RefreshSourceFileCache(false, out error); if (!string.IsNullOrEmpty(error)) { ErrorReporter.ReportError(rfs.Name, error, false); } else { handled = true; } handled |= GlueCommands.Self.ProjectCommands.UpdateFileMembershipInProject(rfs); shouldSave = true; MainGlueWindow.Self.Invoke((MethodInvoker) delegate { if (rfs.GetContainerType() == ContainerType.Entity) { if (EditorLogic.CurrentEntityTreeNode != null) { if (EditorLogic.CurrentEntitySave == rfs.GetContainer()) { PluginManager.RefreshCurrentElement(); } } } else if (rfs.GetContainerType() == ContainerType.Screen) { if (EditorLogic.CurrentScreenTreeNode != null) { if (EditorLogic.CurrentScreenSave == rfs.GetContainer()) { PluginManager.RefreshCurrentElement(); } } } }); } else { // There may not be a RFS for this in Glue, but even if there's not, // this file may be referenced by other RFS's. I don't want to do a full // project scan, so we'll just see if this file is part of Visual Studio. If so // then let's add its children if (ProjectManager.ContentProject.IsFilePartOfProject(changedFile)) { string relativePath = ProjectManager.MakeRelativeContent(changedFile); shouldSave |= GlueCommands.Self.ProjectCommands.UpdateFileMembershipInProject( ProjectManager.ProjectBase, relativePath, false, false); handled |= shouldSave; } } } #endregion #region If it's a .cs file, we should see if we've added a new .cs file, and if so refresh the Element for it if (extension == "cs") { TaskManager.Self.OnUiThread(() => ReactToChangedCodeFile(changedFile)); } #endregion #region Maybe it's a directory that was added or removed if (FileManager.GetExtension(changedFile) == "") { ElementViewWindow.Invoke((MethodInvoker) delegate { try { // It's a directory, so let's just rebuild our directory TreeNodes ElementViewWindow.AddDirectoryNodes(); } catch (System.IO.IOException) { // this could be because something else is accessing the directory, so sleep, try again System.Threading.Thread.Sleep(100); ElementViewWindow.AddDirectoryNodes(); } }); } #endregion #region Check for broken references to objects in file - like an Entity may reference an object in a file but it may have been removed if (ObjectFinder.Self.GetReferencedFileSaveFromFile(changedFile) != null) { // This is a file that is part of the project, so let's see if any named objects are missing references CheckForBrokenReferencesToObjectsInFile(changedFile); } #endregion // This could be an externally built file: ProjectManager.UpdateExternallyBuiltFile(changedFile); if (handled) { PluginManager.ReceiveOutput("Handled changed file: " + changedFile); } if (shouldSave) { ProjectManager.SaveProjects(); } } } return(handled); }
public ReferencedFileSave CreateReferencedFileSaveForExistingFile(IElement containerForFile, string directoryInsideContainer, string absoluteFileName, PromptHandleEnum unknownTypeHandle, AssetTypeInfo ati, out string creationReport, out string errorMessage) { creationReport = ""; errorMessage = null; ReferencedFileSave referencedFileSaveToReturn = null; string whyItIsntValid; // Let's see if there is already an Entity with the same name string fileWithoutPath = FileManager.RemovePath(FileManager.RemoveExtension(absoluteFileName)); bool isValid = NameVerifier.IsReferencedFileNameValid(fileWithoutPath, ati, referencedFileSaveToReturn, containerForFile, out whyItIsntValid); if (!isValid) { errorMessage = "Invalid file name:\n" + fileWithoutPath + "\n" + whyItIsntValid; } else { Zipper.UnzipAndModifyFileIfZip(ref absoluteFileName); string extension = FileManager.GetExtension(absoluteFileName); bool isValidExtensionOrIsConfirmedByUser; bool isUnknownType; FlatRedBall.Glue.Plugins.ExportedImplementations.CommandInterfaces.ElementCommands.CheckAndWarnAboutUnknownFileTypes(unknownTypeHandle, extension, out isValidExtensionOrIsConfirmedByUser, out isUnknownType); string fileToAdd = null; if (isValidExtensionOrIsConfirmedByUser) { string directoryThatFileShouldBeRelativeTo = FlatRedBall.Glue.Plugins.ExportedImplementations.CommandInterfaces.ElementCommands.GetFullPathContentDirectory(containerForFile, directoryInsideContainer); string projectDirectory = ProjectManager.ContentProject.GetAbsoluteContentFolder(); bool needsToCopy = !FileManager.IsRelativeTo(absoluteFileName, projectDirectory); if (needsToCopy) { fileToAdd = directoryThatFileShouldBeRelativeTo + FileManager.RemovePath(absoluteFileName); fileToAdd = FileManager.MakeRelative(fileToAdd, ProjectManager.ContentProject.GetAbsoluteContentFolder()); try { FileHelper.RecursivelyCopyContentTo(absoluteFileName, FileManager.GetDirectory(absoluteFileName), directoryThatFileShouldBeRelativeTo); } catch (System.IO.FileNotFoundException fnfe) { errorMessage = "Could not copy the files because of a missing file: " + fnfe.Message; } } else { fileToAdd = FlatRedBall.Glue.Plugins.ExportedImplementations.CommandInterfaces.ElementCommands.GetNameOfFileRelativeToContentFolder(absoluteFileName, directoryThatFileShouldBeRelativeTo, projectDirectory); } } if (string.IsNullOrEmpty(errorMessage)) { BuildToolAssociation bta = null; if (ati != null && !string.IsNullOrEmpty(ati.CustomBuildToolName)) { bta = BuildToolAssociationManager.Self.GetBuilderToolAssociationByName(ati.CustomBuildToolName); } if (containerForFile != null) { referencedFileSaveToReturn = containerForFile.AddReferencedFile(fileToAdd, ati, bta); } else { bool useFullPathAsName = false; // todo - support built files here referencedFileSaveToReturn = AddReferencedFileToGlobalContent(fileToAdd, useFullPathAsName); } // This will be null if there was an error above in creating this file if (referencedFileSaveToReturn != null) { if (containerForFile != null) { containerForFile.HasChanged = true; } if (fileToAdd.EndsWith(".csv")) { string fileToAddAbsolute = ProjectManager.MakeAbsolute(fileToAdd); CsvCodeGenerator.GenerateAndSaveDataClass(referencedFileSaveToReturn, referencedFileSaveToReturn.CsvDelimiter); } if (isUnknownType) { referencedFileSaveToReturn.LoadedAtRuntime = false; } string error; referencedFileSaveToReturn.RefreshSourceFileCache(false, out error); if (!string.IsNullOrEmpty(error)) { ErrorReporter.ReportError(referencedFileSaveToReturn.Name, error, false); } } } } return(referencedFileSaveToReturn); }
public ReferencedFileSave CreateReferencedFileSaveForExistingFile(IElement containerForFile, string directoryInsideContainer, string absoluteFileName, PromptHandleEnum unknownTypeHandle, AssetTypeInfo ati, out string creationReport, out string errorMessage) { creationReport = ""; errorMessage = null; ReferencedFileSave referencedFileSaveToReturn = null; string whyItIsntValid; // Let's see if there is already an Entity with the same name string fileWithoutPath = FileManager.RemovePath(FileManager.RemoveExtension(absoluteFileName)); bool isValid = NameVerifier.IsReferencedFileNameValid(fileWithoutPath, ati, referencedFileSaveToReturn, containerForFile, out whyItIsntValid); if (!isValid) { errorMessage = "Invalid file name:\n" + fileWithoutPath + "\n" + whyItIsntValid; } else { Zipper.UnzipAndModifyFileIfZip(ref absoluteFileName); string extension = FileManager.GetExtension(absoluteFileName); bool isValidExtensionOrIsConfirmedByUser; bool isUnknownType; CheckAndWarnAboutUnknownFileTypes(unknownTypeHandle, extension, out isValidExtensionOrIsConfirmedByUser, out isUnknownType); if (isValidExtensionOrIsConfirmedByUser) { string directoryThatFileShouldBeRelativeTo = GetFullPathContentDirectory(containerForFile, directoryInsideContainer); string projectDirectory = ProjectManager.ContentProject.GetAbsoluteContentFolder(); string fileToAdd = GetNameOfFileRelativeToContentFolder(absoluteFileName, directoryThatFileShouldBeRelativeTo, projectDirectory); BuildToolAssociation bta = null; if (ati != null && !string.IsNullOrEmpty(ati.CustomBuildToolName)) { bta = BuildToolAssociationManager.Self.GetBuilderToolAssociationByName(ati.CustomBuildToolName); } if (containerForFile != null) { referencedFileSaveToReturn = containerForFile.AddReferencedFile(fileToAdd, ati, bta); } else { bool useFullPathAsName = false; // todo - support built files here referencedFileSaveToReturn = AddReferencedFileToGlobalContent(fileToAdd, useFullPathAsName); } // This will be null if there was an error above in creating this file if (referencedFileSaveToReturn != null) { if (containerForFile != null) { containerForFile.HasChanged = true; } if (fileToAdd.EndsWith(".csv")) { string fileToAddAbsolute = ProjectManager.MakeAbsolute(fileToAdd); CsvCodeGenerator.GenerateAndSaveDataClass(referencedFileSaveToReturn, referencedFileSaveToReturn.CsvDelimiter); } if (isUnknownType) { referencedFileSaveToReturn.LoadedAtRuntime = false; } ProjectManager.UpdateFileMembershipInProject(referencedFileSaveToReturn); PluginManager.ReactToNewFile(referencedFileSaveToReturn); GluxCommands.Self.SaveGlux(); ProjectManager.SaveProjects(); UnreferencedFilesManager.Self.RefreshUnreferencedFiles(false); string error; referencedFileSaveToReturn.RefreshSourceFileCache(false, out error); if (!string.IsNullOrEmpty(error)) { ErrorReporter.ReportError(referencedFileSaveToReturn.Name, error, false); } } } } return(referencedFileSaveToReturn); }