private static void RemoveFromProjectOptionalSaveAndRegenerate(bool saveAndRegenerate, bool askAreYouSure, bool askToDelete)
{
// delete object, remove object, DeleteObject, RemoveObject, remove from project,
// remove from screen, remove from entity, remove file
///////////////////////////////EARLY OUT///////////////////////////////////////
// This can now be called by pushing Delete, so we should check if deleting is valid
if (EditorLogic.CurrentTreeNode == null || EditorLogic.CurrentTreeNode.Parent == null ||
EditorLogic.CurrentTreeNode.Text.EndsWith(".cs") || EditorLogic.CurrentTreeNode.Tag == null)
{
return;
}
//////////////////////////////END EARLY OUT/////////////////////////////////////
lock (FileWatchManager.LockObject)
{
// Search terms: removefromproject, remove from project, remove file, remove referencedfilesave
List<string> filesToRemove = new List<string>();
if (ProjectManager.StatusCheck() == ProjectManager.CheckResult.Passed)
{
#region Find out if the user really wants to remove this - don't ask if askAreYouSure is false
DialogResult reallyRemoveResult = DialogResult.Yes;
if (askAreYouSure)
{
string message = "Are you sure you want to remove this:\n\n" + EditorLogic.CurrentTreeNode.Tag.ToString();
reallyRemoveResult =
MessageBox.Show(message, "Remove?", MessageBoxButtons.YesNo);
}
#endregion
if (reallyRemoveResult == DialogResult.Yes)
{
#region If is NamedObjectSave
// test deep first
if (EditorLogic.CurrentNamedObject != null)
{
ProjectManager.RemoveNamedObject(EditorLogic.CurrentNamedObject, true, true, filesToRemove);
//ProjectManager.RemoveNamedObject(EditorLogic.CurrentNamedObject);
}
#endregion
#region Else if is StateSave
else if (EditorLogic.CurrentStateSave != null)
{
var name = EditorLogic.CurrentStateSave.Name;
EditorLogic.CurrentElement.RemoveState(EditorLogic.CurrentStateSave);
AskToRemoveCustomVariablesWithoutState(EditorLogic.CurrentElement);
EditorLogic.CurrentElementTreeNode.UpdateReferencedTreeNodes();
PluginManager.ReactToStateRemoved(EditorLogic.CurrentElement, name);
GluxCommands.Self.SaveGlux();
}
#endregion
#region Else if is StateSaveCategory
else if (EditorLogic.CurrentStateSaveCategory != null)
{
EditorLogic.CurrentElement.StateCategoryList.Remove(EditorLogic.CurrentStateSaveCategory);
EditorLogic.CurrentElementTreeNode.UpdateReferencedTreeNodes();
GluxCommands.Self.SaveGlux();
}
#endregion
#region Else if is ReferencedFileSave
else if (EditorLogic.CurrentReferencedFile != null)
{
var toRemove = EditorLogic.CurrentReferencedFile;
// this could happen at the same time as file flushing, which can cause locks. Therefore we need to add this as a task:
TaskManager.Self.AddSync(() =>
{
GluxCommands.Self.RemoveReferencedFile(toRemove, filesToRemove, saveAndRegenerate);
},
"Remove file " + toRemove.ToString());
//ProjectManager.RemoveReferencedFile(EditorLogic.CurrentReferencedFile);
}
#endregion
#region Else if is CustomVariable
else if (EditorLogic.CurrentCustomVariable != null)
{
ProjectManager.RemoveCustomVariable(EditorLogic.CurrentCustomVariable, filesToRemove);
//ProjectManager.RemoveCustomVariable(EditorLogic.CurrentCustomVariable);
}
#endregion
#region Else if is EventSave
else if (EditorLogic.CurrentEventResponseSave != null)
{
EditorLogic.CurrentElement.Events.Remove(EditorLogic.CurrentEventResponseSave);
GlueCommands.Self.RefreshCommands.RefreshUiForSelectedElement();
}
#endregion
#region Else if is ScreenSave
// Then test higher if deep didn't get removed
else if (EditorLogic.CurrentScreenSave != null)
{
var screenToRemove = EditorLogic.CurrentScreenSave;
TaskManager.Self.AddSync(() =>
{
RemoveScreen(screenToRemove, filesToRemove);
},
"Remove screen");
}
#endregion
#region Else if is EntitySave
else if (EditorLogic.CurrentEntitySave != null)
{
RemoveEntity(EditorLogic.CurrentEntitySave, filesToRemove);
//ProjectManager.RemoveEntity(EditorLogic.CurrentEntitySave);
}
#endregion
#region Files were deleted and the user wants to be asked to delete
if (filesToRemove.Count != 0 && askToDelete)
{
for (int i = 0; i < filesToRemove.Count; i++)
{
if (FileManager.IsRelative(filesToRemove[i]))
{
filesToRemove[i] = ProjectManager.MakeAbsolute(filesToRemove[i]);
}
filesToRemove[i] = filesToRemove[i].Replace("\\", "/");
}
StringFunctions.RemoveDuplicates(filesToRemove, true);
ListBoxWindow lbw = new ListBoxWindow();
string messageString = "What would you like to do with the following files:\n";
lbw.Message = messageString;
foreach (string s in filesToRemove)
{
lbw.AddItem(s);
}
lbw.ClearButtons();
lbw.AddButton("Nothing - leave them as part of the game project", DialogResult.No);
lbw.AddButton("Remove them from the project but keep the files", DialogResult.OK);
lbw.AddButton("Remove and delete the files", DialogResult.Yes);
DialogResult result = lbw.ShowDialog();
if (result == DialogResult.OK || result == DialogResult.Yes)
{
foreach (string file in filesToRemove)
{
string fileName = ProjectManager.MakeAbsolute(file);
// This file may have been removed
// in windows explorer, and now removed
// from Glue. Check to prevent a crash.
ProjectManager.RemoveItemFromAllProjects(fileName, false);
}
}
if (result == DialogResult.Yes)
{
foreach (string file in filesToRemove)
{
string fileName = ProjectManager.MakeAbsolute(file);
// This file may have been removed
// in windows explorer, and now removed
// from Glue. Check to prevent a crash.
if (File.Exists(fileName))
{
FileHelper.DeleteFile(fileName);
}
}
}
}
#endregion
if (saveAndRegenerate)
{
Action regenerateAction = null;
if (EditorLogic.CurrentScreenTreeNode != null)
{
var screen = EditorLogic.CurrentScreenSave;
regenerateAction = () =>
FlatRedBall.Glue.CodeGeneration.CodeGeneratorIElement.GenerateElementAndDerivedCode(screen);
}
else if (EditorLogic.CurrentEntityTreeNode != null)
{
var entity = EditorLogic.CurrentEntitySave;
regenerateAction = () =>
FlatRedBall.Glue.CodeGeneration.CodeGeneratorIElement.GenerateElementAndDerivedCode(entity);
}
else if (EditorLogic.CurrentReferencedFile != null)
{
regenerateAction = ContentLoadWriter.UpdateLoadGlobalContentCode;
// Vic asks - do we have to do anything else here? I don't think so...
}
TaskManager.Self.AddSync(() =>
{
if (regenerateAction != null)
{
regenerateAction();
}
ProjectManager.SaveProjects();
GluxCommands.Self.SaveGlux();
},
"Save and regenerate after removal");
}
}
}
}
}