major improvements to project system including 'virtual' in-memory file system for projects and multiple project types (natures)

This commit is contained in:
Michael Becker 2020-10-22 21:21:04 -04:00
parent 4887657ad6
commit a1ec00983b
No known key found for this signature in database
GPG Key ID: 506F54899E2BFED7
15 changed files with 260 additions and 81 deletions

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE UniversalEditor SYSTEM "U:\Doctypes\UniversalEditor.dtd">
<UniversalEditor Version="3.0">
<ProjectTypes>
<ProjectType ID="{69878862-DA7D-4DC6-B0A1-50D8FAB4242F}">
<Information>
<Title>PlayStation(R) Mobile Project</Title>
<ProjectFileExtension>.psproj</ProjectFileExtension>
</Information>
<Tasks>
<!--
ActionTypes are defined in libraries.
{EE505E05-F125-4718-BA0A-879C72B5125A} corresponds to the built-in task action type ExecutableAction
When Tasks are executed, each Action in Actions gets executed.
When Actions are executed, the TaskType gets the inner XML of the task and processes it to extract parameters.
Certain tags are expanded by the preprocessor, like StringBuilder which is common to all TaskTypes.
-->
<!-- Build Project -->
<Task ID="{3EFB95BA-D2E8-46D0-9939-814DA4F5AB22}">
<Actions>
</Actions>
</Task>
</Tasks>
</ProjectType>
</ProjectTypes>
</UniversalEditor>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE UniversalEditor SYSTEM "U:\Doctypes\UniversalEditor.dtd">
<UniversalEditor Version="3.0">
<ProjectTypes>
<ProjectType ID="{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}">
<Information>
<Title>C# Project</Title>
</Information>
<Tasks>
<!--
ActionTypes are defined in libraries.
{EE505E05-F125-4718-BA0A-879C72B5125A} corresponds to the built-in task action type ExecutableAction
When Tasks are executed, each Action in Actions gets executed.
When Actions are executed, the TaskType gets the inner XML of the task and processes it to extract parameters.
Certain tags are expanded by the preprocessor, like StringBuilder which is common to all TaskTypes.
-->
<!-- Build Project -->
<Task ID="{3EFB95BA-D2E8-46D0-9939-814DA4F5AB22}">
<Actions>
</Actions>
</Task>
</Tasks>
</ProjectType>
</ProjectTypes>
</UniversalEditor>

View File

@ -1,7 +1,14 @@
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8" ?>
<UniversalEditor Version="2.0"> <UniversalEditor Version="2.0">
<ProjectTemplates> <ProjectTemplates>
<ProjectTemplate ID="{BF876842-64CA-4832-A562-DBA6970C691A}" TypeID="{33C51321-C18B-409C-A7D0-BEF65BFEFC9A}"> <ProjectTemplate ID="{BF876842-64CA-4832-A562-DBA6970C691A}" TypeID="{69878862-DA7D-4DC6-B0A1-50D8FAB4242F}">
<ProjectTypes>
<!-- These are also called 'natures' in Eclipse -->
<!-- SCE.PSM.projecttype -->
<ProjectType ID="{69878862-DA7D-4DC6-B0A1-50D8FAB4242F}" />
<!-- Microsoft.CSharp.projecttype -->
<ProjectType ID="{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}" />
</ProjectTypes>
<Information> <Information>
<Title>Basic PlayStation(R) Mobile Project</Title> <Title>Basic PlayStation(R) Mobile Project</Title>
<ProjectNamePrefix>PsmApp</ProjectNamePrefix> <ProjectNamePrefix>PsmApp</ProjectNamePrefix>

View File

@ -313,6 +313,8 @@
<Content Include="Templates\Project\SCE\PSM\content\AppMain.cs" /> <Content Include="Templates\Project\SCE\PSM\content\AppMain.cs" />
<Content Include="Templates\Project\SCE\PSM\content\shaders\Simple.vcg" /> <Content Include="Templates\Project\SCE\PSM\content\shaders\Simple.vcg" />
<Content Include="Templates\Project\SCE\PSM\content\shaders\Simple.fcg" /> <Content Include="Templates\Project\SCE\PSM\content\shaders\Simple.fcg" />
<Content Include="ProjectTypes\{69878862-DA7D-4DC6-B0A1-50D8FAB4242F}.uexml" />
<Content Include="ProjectTypes\{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}.uexml" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Content Include="Configuration\Application.upl" /> <Content Include="Configuration\Application.upl" />

View File

@ -24,7 +24,7 @@ using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using MBS.Framework.Logic; using MBS.Framework.Logic;
using UniversalEditor.Accessors;
using UniversalEditor.DataFormats.Markup.XML; using UniversalEditor.DataFormats.Markup.XML;
using UniversalEditor.DataFormats.PropertyList.XML; using UniversalEditor.DataFormats.PropertyList.XML;
using UniversalEditor.ObjectModels.Markup; using UniversalEditor.ObjectModels.Markup;
@ -336,6 +336,10 @@ namespace UniversalEditor.DataFormats.UEPackage
{ {
MarkupTagElement tagTitle = (tagInformation.Elements["Title"] as MarkupTagElement); MarkupTagElement tagTitle = (tagInformation.Elements["Title"] as MarkupTagElement);
if (tagTitle != null) projtype.Title = tagTitle.Value; if (tagTitle != null) projtype.Title = tagTitle.Value;
MarkupTagElement tagProjectFileExtension = (tagInformation.Elements["ProjectFileExtension"] as MarkupTagElement);
if (tagProjectFileExtension != null) projtype.ProjectFileExtension = tagProjectFileExtension.Value;
MarkupTagElement tagIconPath = (tagInformation.Elements["IconPath"] as MarkupTagElement); MarkupTagElement tagIconPath = (tagInformation.Elements["IconPath"] as MarkupTagElement);
if (tagIconPath != null) if (tagIconPath != null)
{ {
@ -702,7 +706,11 @@ namespace UniversalEditor.DataFormats.UEPackage
{ {
try try
{ {
template.ProjectType = Common.Reflection.GetProjectTypeByTypeID(new Guid(attTypeID.Value)); ProjectType projectType = Common.Reflection.GetProjectTypeByTypeID(new Guid(attTypeID.Value));
if (projectType != null)
{
template.ProjectTypes.Add(projectType);
}
} }
catch catch
{ {
@ -780,16 +788,36 @@ namespace UniversalEditor.DataFormats.UEPackage
MarkupTagElement tagFileSystem = (tagTemplate.Elements["FileSystem"] as MarkupTagElement); MarkupTagElement tagFileSystem = (tagTemplate.Elements["FileSystem"] as MarkupTagElement);
if (tagFileSystem != null) if (tagFileSystem != null)
{ {
MarkupTagElement tagFiles = (tagFileSystem.Elements["Files"] as MarkupTagElement); MarkupAttribute attCopyFrom = tagFileSystem.Attributes["CopyFrom"];
if (tagFiles != null) if (attCopyFrom != null)
{ {
foreach (MarkupElement elFile in tagFiles.Elements) string dir = System.IO.Path.GetDirectoryName(Accessor.GetFileName());
string copyFrom = System.IO.Path.Combine(new string[] { dir, attCopyFrom.Value });
if (System.IO.Directory.Exists(copyFrom))
{ {
MarkupTagElement tagFile = (elFile as MarkupTagElement); string[] files = System.IO.Directory.GetFiles(copyFrom, "*", System.IO.SearchOption.AllDirectories);
if (tagFile == null) continue; for (int i = 0; i < files.Length; i++)
if (tagFile.FullName != "File") continue; {
ProjectFile pf = new ProjectFile();
pf.SourceFileAccessor = new MemoryAccessor(System.IO.File.ReadAllBytes(files[i]), System.IO.Path.GetFileName(files[i]));
pf.DestinationFileName = files[i].Substring(copyFrom.Length + 1);
template.FileSystem.Files.Add(pf);
}
}
}
else
{
MarkupTagElement tagFiles = (tagFileSystem.Elements["Files"] as MarkupTagElement);
if (tagFiles != null)
{
foreach (MarkupElement elFile in tagFiles.Elements)
{
MarkupTagElement tagFile = (elFile as MarkupTagElement);
if (tagFile == null) continue;
if (tagFile.FullName != "File") continue;
LoadProjectFile(tagFile, template.FileSystem.Files); LoadProjectFile(tagFile, template.FileSystem.Files);
}
} }
} }
} }

View File

@ -108,6 +108,8 @@ namespace UniversalEditor.ObjectModels.Project
/// </summary> /// </summary>
public string SourceFileName { get { return mvarSourceFileName; } set { mvarSourceFileName = value; } } public string SourceFileName { get { return mvarSourceFileName; } set { mvarSourceFileName = value; } }
public Accessor SourceFileAccessor { get; set; } = null;
private string mvarDestinationFileName = String.Empty; private string mvarDestinationFileName = String.Empty;
/// <summary> /// <summary>
/// The name of the project file in the project itself, which can be different from the file name of the file on disk. /// The name of the project file in the project itself, which can be different from the file name of the file on disk.
@ -127,7 +129,8 @@ namespace UniversalEditor.ObjectModels.Project
{ {
ProjectFile clone = new ProjectFile(); ProjectFile clone = new ProjectFile();
clone.DestinationFileName = (mvarDestinationFileName.Clone() as string); clone.DestinationFileName = (mvarDestinationFileName.Clone() as string);
clone.SourceFileName = (mvarSourceFileName.Clone() as string); clone.SourceFileName = (mvarSourceFileName?.Clone() as string);
clone.SourceFileAccessor = SourceFileAccessor?.Clone() as Accessor;
clone.Configuration = (mvarConfiguration.Clone() as PropertyListObjectModel); clone.Configuration = (mvarConfiguration.Clone() as PropertyListObjectModel);
return clone; return clone;
} }

View File

@ -52,7 +52,7 @@ namespace UniversalEditor.ObjectModels.Project
Configuration.Clear(); Configuration.Clear();
FileSystem.Clear(); FileSystem.Clear();
ID = Guid.Empty; ID = Guid.Empty;
ProjectType = null; ProjectTypes.Clear();
References.Clear(); References.Clear();
RelativeFileName = String.Empty; RelativeFileName = String.Empty;
Title = String.Empty; Title = String.Empty;
@ -64,7 +64,10 @@ namespace UniversalEditor.ObjectModels.Project
Configuration.CopyTo(clone.Configuration); Configuration.CopyTo(clone.Configuration);
FileSystem.CopyTo(clone.FileSystem); FileSystem.CopyTo(clone.FileSystem);
clone.ID = ID; clone.ID = ID;
clone.ProjectType = ProjectType; for (int i = 0; i < ProjectTypes.Count; i++)
{
clone.ProjectTypes.Add(ProjectTypes[i]);
}
foreach (Reference _ref in References) foreach (Reference _ref in References)
{ {
clone.References.Add(_ref); clone.References.Add(_ref);
@ -73,6 +76,8 @@ namespace UniversalEditor.ObjectModels.Project
clone.Title = (Title.Clone() as string); clone.Title = (Title.Clone() as string);
} }
public string BasePath { get; set; } = null;
/// <summary> /// <summary>
/// Gets or sets the globally-unique identifier (GUID) for this <see cref="ProjectObjectModel" />. /// Gets or sets the globally-unique identifier (GUID) for this <see cref="ProjectObjectModel" />.
/// </summary> /// </summary>
@ -99,10 +104,12 @@ namespace UniversalEditor.ObjectModels.Project
/// <value>The file system containing the <see cref="ProjectFile" />s and <see cref="ProjectFolder" />s referenced by this <see cref="ProjectObjectModel" />.</value> /// <value>The file system containing the <see cref="ProjectFile" />s and <see cref="ProjectFolder" />s referenced by this <see cref="ProjectObjectModel" />.</value>
public ProjectFileSystem FileSystem { get; } = new ProjectFileSystem(); public ProjectFileSystem FileSystem { get; } = new ProjectFileSystem();
/// <summary> /// <summary>
/// Gets or sets a <see cref="ProjectType" /> containing common settings and build actions shared between multiple projects of the same <see cref="ProjectType" />. /// Gets a collection of <see cref="ProjectType" />s containing common settings and build actions shared between multiple projects of the
/// same <see cref="ProjectType" />.
/// </summary> /// </summary>
/// <value>The <see cref="ProjectType" /> containing common settings and build actions shared between multiple projects of the same <see cref="ProjectType" />.</value> /// <value>A collection of <see cref="ProjectType" />s containing common settings and build actions shared between multiple projects of the
public ProjectType ProjectType { get; set; } = null; /// same <see cref="ProjectType" />.</value>
public ProjectType.ProjectTypeCollection ProjectTypes { get; } = new ProjectType.ProjectTypeCollection();
/// <summary> /// <summary>
/// Gets or sets the relative path to the <see cref="ProjectObjectModel" />. /// Gets or sets the relative path to the <see cref="ProjectObjectModel" />.
/// </summary> /// </summary>

View File

@ -59,6 +59,8 @@ namespace UniversalEditor.ObjectModels.Solution
Configuration.CopyTo(solution.Configuration); Configuration.CopyTo(solution.Configuration);
} }
public string BasePath { get; set; } = null;
/// <summary> /// <summary>
/// Gets a collection of <see cref="ProjectObjectModel" /> instances representing the projects contained within this solution. /// Gets a collection of <see cref="ProjectObjectModel" /> instances representing the projects contained within this solution.
/// </summary> /// </summary>

View File

@ -57,6 +57,8 @@ namespace UniversalEditor
private ProjectTypeVariable.ProjectTypeVariableCollection mvarVariables = new ProjectTypeVariable.ProjectTypeVariableCollection(); private ProjectTypeVariable.ProjectTypeVariableCollection mvarVariables = new ProjectTypeVariable.ProjectTypeVariableCollection();
public ProjectTypeVariable.ProjectTypeVariableCollection Variables { get { return mvarVariables; } } public ProjectTypeVariable.ProjectTypeVariableCollection Variables { get { return mvarVariables; } }
public string ProjectFileExtension { get; set; } = null;
} }
/// <summary> /// <summary>
/// A shortcut placed in the "Add New Item" menu when the project is selected. When /// A shortcut placed in the "Add New Item" menu when the project is selected. When

View File

@ -229,8 +229,7 @@ namespace UniversalEditor
/// </summary> /// </summary>
public string[] Path { get { return mvarPath; } set { mvarPath = value; } } public string[] Path { get { return mvarPath; } set { mvarPath = value; } }
private ProjectType mvarProjectType = null; public ProjectType.ProjectTypeCollection ProjectTypes { get; } = new ProjectType.ProjectTypeCollection();
public ProjectType ProjectType { get { return mvarProjectType; } set { mvarProjectType = value; } }
private string mvarProjectNamePrefix = String.Empty; private string mvarProjectNamePrefix = String.Empty;
public string ProjectNamePrefix { get { return mvarProjectNamePrefix; } set { mvarProjectNamePrefix = value; } } public string ProjectNamePrefix { get { return mvarProjectNamePrefix; } set { mvarProjectNamePrefix = value; } }
@ -248,10 +247,12 @@ namespace UniversalEditor
public ProjectObjectModel Create() public ProjectObjectModel Create()
{ {
ProjectObjectModel p = new ProjectObjectModel(); ProjectObjectModel p = new ProjectObjectModel();
p.ProjectType = mvarProjectType; for (int i = 0; i < ProjectTypes.Count; i++)
{
p.ProjectTypes.Add(ProjectTypes[i]);
}
mvarFileSystem.CopyTo(p.FileSystem); mvarFileSystem.CopyTo(p.FileSystem);
mvarConfiguration.CopyTo(p.Configuration); mvarConfiguration.CopyTo(p.Configuration);
return p; return p;
} }

View File

@ -276,61 +276,72 @@ namespace UniversalEditor.UserInterface.Dialogs
case NewDialogMode.Project: case NewDialogMode.Project:
{ {
ProjectTemplate template = tvTemplate.SelectedRows[0].GetExtraData<ProjectTemplate>("dt"); ProjectTemplate template = tvTemplate.SelectedRows[0].GetExtraData<ProjectTemplate>("dt");
if (template.ProjectType != null) if (template.ProjectTypes.Count > 0)
{ {
if (template.ProjectType.Variables.Count > 0) CustomSettingsProvider csp = new CustomSettingsProvider();
{
CustomOption.CustomOptionCollection coll = new CustomOption.CustomOptionCollection();
foreach (ProjectTypeVariable ptv in template.ProjectType.Variables)
{
switch (ptv.Type)
{
case ProjectTypeVariableType.Text:
{
CustomOptionText co = new CustomOptionText(ptv.Name, ptv.Title);
coll.Add(co);
break;
}
case ProjectTypeVariableType.Choice:
{
List<CustomOptionFieldChoice> choices = new List<CustomOptionFieldChoice>();
foreach (KeyValuePair<string, object> kvp in ptv.ValidValues)
{
choices.Add(new CustomOptionFieldChoice(kvp.Key, kvp.Value, kvp.Value == ptv.DefaultValue));
}
CustomOptionChoice co = new CustomOptionChoice(ptv.Name, ptv.Title, true, choices.ToArray()); for (int i = 0; i < template.ProjectTypes.Count; i++)
coll.Add(co); {
break; SettingsGroup sg = new SettingsGroup(template.ProjectTypes[i].Title);
} if (template.ProjectTypes[i].Variables.Count > 0)
case ProjectTypeVariableType.FileOpen: {
foreach (ProjectTypeVariable ptv in template.ProjectTypes[i].Variables)
{
switch (ptv.Type)
{ {
CustomOptionFile co = new CustomOptionFile(ptv.Name, ptv.Title); case ProjectTypeVariableType.Text:
co.DialogMode = CustomOptionFileDialogMode.Open; {
coll.Add(co); sg.Settings.Add(new TextSetting(ptv.Name, ptv.Title));
break; break;
} }
case ProjectTypeVariableType.FileSave: case ProjectTypeVariableType.Choice:
{ {
CustomOptionFile co = new CustomOptionFile(ptv.Name, ptv.Title); List<ChoiceSetting.ChoiceSettingValue> choices = new List<ChoiceSetting.ChoiceSettingValue>();
co.DialogMode = CustomOptionFileDialogMode.Save; foreach (KeyValuePair<string, object> kvp in ptv.ValidValues)
coll.Add(co); {
break; choices.Add(new ChoiceSetting.ChoiceSettingValue(kvp.Key, kvp.Key, kvp.Value));
}
sg.Settings.Add(new ChoiceSetting(ptv.Name, ptv.Title, null, choices.ToArray()));
break;
}
case ProjectTypeVariableType.FileOpen:
{
FileSetting co = new FileSetting(ptv.Name, ptv.Title);
co.Mode = FileDialogMode.Open;
sg.Settings.Add(co);
break;
}
case ProjectTypeVariableType.FileSave:
{
FileSetting co = new FileSetting(ptv.Name, ptv.Title);
co.Mode = FileDialogMode.Save;
sg.Settings.Add(co);
break;
}
} }
} }
} }
if (!Engine.CurrentEngine.ShowCustomOptionDialog(ref coll, template.ProjectType.Title + " properties")) // template.ProjectType.Variables[co.PropertyName].Value = co.GetValue().ToString();
// TODO: Figure out how to assign variable values to the newly
// created project from the template
if (sg.Settings.Count > 0)
{
// only add the SettingsGroup if there are settings to be displayed
csp.SettingsGroups.Add(sg);
}
}
SettingsDialog dlg = new SettingsDialog();
dlg.SettingsProviders.Clear();
dlg.SettingsProviders.Add(csp);
if (csp.SettingsGroups.Count > 0)
{
if (dlg.ShowDialog() != DialogResult.OK)
{ {
return; return;
} }
foreach (CustomOption co in coll)
{
// template.ProjectType.Variables[co.PropertyName].Value = co.GetValue().ToString();
// TODO: Figure out how to assign variable values to the newly
// created project from the template
}
} }
} }
else else

View File

@ -201,8 +201,8 @@ namespace UniversalEditor.UserInterface
AddPanel("Document Explorer", DockingItemPlacement.Bottom, pnlDocumentExplorer); AddPanel("Document Explorer", DockingItemPlacement.Bottom, pnlDocumentExplorer);
DockingContainer dcExplorerProperties = AddPanelContainer(DockingItemPlacement.Right, null); DockingContainer dcExplorerProperties = null; // AddPanelContainer(DockingItemPlacement.Right, null);
AddPanel("Solution Explorer", DockingItemPlacement.Top, pnlSolutionExplorer, dcExplorerProperties); AddPanel("Solution Explorer", DockingItemPlacement.Left, pnlSolutionExplorer, dcExplorerProperties);
AddPanel("Properties", DockingItemPlacement.Bottom, pnlPropertyList, dcExplorerProperties); AddPanel("Properties", DockingItemPlacement.Bottom, pnlPropertyList, dcExplorerProperties);
AddPanel("Error List", DockingItemPlacement.Bottom, pnlErrorList); AddPanel("Error List", DockingItemPlacement.Bottom, pnlErrorList);
@ -403,6 +403,12 @@ namespace UniversalEditor.UserInterface
ProjectObjectModel project = pjt.Create(); ProjectObjectModel project = pjt.Create();
project.ID = Guid.NewGuid(); project.ID = Guid.NewGuid();
project.Title = dlg.ProjectTitle; project.Title = dlg.ProjectTitle;
// go through and update all referenced variables
foreach (ProjectFile pf in project.FileSystem.Files)
{
pf.DestinationFileName = pf.DestinationFileName.Replace("$(Project.Title)", project.Title);
}
solution.Projects.Add(project); solution.Projects.Add(project);
CurrentSolution = solution; CurrentSolution = solution;
@ -1139,16 +1145,18 @@ namespace UniversalEditor.UserInterface
if (dlg.ShowDialog() == DialogResult.OK) if (dlg.ShowDialog() == DialogResult.OK)
{ {
_CurrentSolutionDocument = new Document(CurrentSolution, df, new FileAccessor(dlg.SelectedFileNames[dlg.SelectedFileNames.Count - 1], true, true)); SaveProjectAs(dlg.SelectedFileName, df);
_CurrentSolutionDocument.Accessor.Open();
_CurrentSolutionDocument.Save();
_CurrentSolutionDocument.Accessor.Close();
} }
} }
public void SaveProjectAs(string FileName, DataFormat df) public void SaveProjectAs(string FileName, DataFormat df)
{ {
throw new NotImplementedException(); _CurrentSolutionDocument = new Document(CurrentSolution, df, new FileAccessor(FileName, true, true));
_CurrentSolutionDocument.Accessor.Open();
_CurrentSolutionDocument.Save();
_CurrentSolutionDocument.Accessor.Close();
CurrentSolution.BasePath = System.IO.Path.GetDirectoryName(FileName);
} }
public void SaveAll() public void SaveAll()

View File

@ -237,22 +237,28 @@ namespace UniversalEditor.UserInterface.Panels
// TODO: implement what happens when we activate a row in the solution explorer list // TODO: implement what happens when we activate a row in the solution explorer list
// typically: // typically:
// - if it is a ProjectFile we want to open the respective file in a new document tab // - if it is a ProjectFile we want to open the respective file in a new document tab - DONE
// - if it is a ProjectFolder we just want to expand/collapse tree (default action) // - if it is a ProjectFolder we just want to expand/collapse tree (default action) - DONE
// - if it is a special folder named "Properties", or the project item itself, it should display the special project properties dialog // - if it is a special folder named "Properties", or the project item itself, it should display the special project properties dialog
// - if it is a special folder named "Properties/Resources", the resource editor shall be shown // - if it is a special folder named "Properties/Resources", the resource editor shall be shown
// these last two conditions can be simplified by simply having the Properties folder open the project file in an editor, and implementing
// an editor for ProjectObjectModel which is essentially the "project properties" window (a la VS)
ProjectObjectModel project = e.Row.GetExtraData<ProjectObjectModel>("project"); ProjectObjectModel project = e.Row.GetExtraData<ProjectObjectModel>("project");
ProjectFile file = e.Row.GetExtraData<ProjectFile>("file"); ProjectFile file = e.Row.GetExtraData<ProjectFile>("file");
ProjectFolder folder = e.Row.GetExtraData<ProjectFolder>("folder"); ProjectFolder folder = e.Row.GetExtraData<ProjectFolder>("folder");
if (project != null) if (project != null)
{ {
MessageDialog.ShowDialog(String.Format("Opening project properties for {0}", e.Row.RowColumns[0].Value), "Info", MessageDialogButtons.OK); Accessors.MemoryAccessor ma = new Accessors.MemoryAccessor(new byte[0], String.Format("{0} Properties", project.Title));
Document d = new Document(project, null, ma);
d.Title = String.Format("{0} Properties", project.Title);
HostApplication.CurrentWindow.OpenFile(d);
} }
else if (file != null) else if (file != null)
{ {
if (String.IsNullOrEmpty(file.SourceFileName)) if (file.SourceFileAccessor != null)
{ {
MessageDialog.ShowDialog("TODO: Implement OpenDocument() call so we can open embedded files (i.e. that do not actually exist as 'files')", "NOT IMPLEMENTED", MessageDialogButtons.OK, MessageDialogIcon.Error); Engine.CurrentEngine.LastWindow.OpenFile(new Document(file.SourceFileAccessor));
} }
else else
{ {

View File

@ -29,6 +29,7 @@ using UniversalEditor.ObjectModels.Project;
using UniversalEditor.ObjectModels.PropertyList; using UniversalEditor.ObjectModels.PropertyList;
using UniversalEditor.ObjectModels.Solution; using UniversalEditor.ObjectModels.Solution;
using System.Linq; using System.Linq;
using System.Text;
namespace UniversalEditor.DataFormats.Project.Microsoft.VisualStudio namespace UniversalEditor.DataFormats.Project.Microsoft.VisualStudio
{ {
@ -183,7 +184,7 @@ namespace UniversalEditor.DataFormats.Project.Microsoft.VisualStudio
MarkupTagElement tagProjectGUID = new MarkupTagElement(); MarkupTagElement tagProjectGUID = new MarkupTagElement();
tagProjectGUID.FullName = "ProjectGuid"; tagProjectGUID.FullName = "ProjectGuid";
tagProjectGUID.Value = proj.ID.ToString("D"); tagProjectGUID.Value = proj.ID.ToString("B").ToUpper();
tagPropertyGroup.Elements.Add(tagProjectGUID); tagPropertyGroup.Elements.Add(tagProjectGUID);
MarkupTagElement tagOutputType = new MarkupTagElement(); MarkupTagElement tagOutputType = new MarkupTagElement();
@ -198,7 +199,17 @@ namespace UniversalEditor.DataFormats.Project.Microsoft.VisualStudio
MarkupTagElement tagProjectTypeGUIDs = new MarkupTagElement(); MarkupTagElement tagProjectTypeGUIDs = new MarkupTagElement();
tagProjectTypeGUIDs.FullName = "ProjectTypeGuids"; tagProjectTypeGUIDs.FullName = "ProjectTypeGuids";
tagProjectTypeGUIDs.Value = proj.ProjectType.ID.ToString("B");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < proj.ProjectTypes.Count; i++)
{
sb.Append(proj.ProjectTypes[i].ID.ToString("B").ToUpper());
if (i < proj.ProjectTypes.Count - 1)
{
sb.Append(";");
}
}
tagProjectTypeGUIDs.Value = sb.ToString();
tagPropertyGroup.Elements.Add(tagProjectTypeGUIDs); tagPropertyGroup.Elements.Add(tagProjectTypeGUIDs);
MarkupTagElement tagAssemblyName = new MarkupTagElement(); MarkupTagElement tagAssemblyName = new MarkupTagElement();

View File

@ -30,6 +30,7 @@ using UniversalEditor.ObjectModels.Solution;
using UniversalEditor.ObjectModels.Project; using UniversalEditor.ObjectModels.Project;
using UniversalEditor.DataFormats.Project.Microsoft.VisualStudio; using UniversalEditor.DataFormats.Project.Microsoft.VisualStudio;
using System.Linq; using System.Linq;
using System.Collections.Generic;
namespace UniversalEditor.DataFormats.Solution.Microsoft.VisualStudio namespace UniversalEditor.DataFormats.Solution.Microsoft.VisualStudio
{ {
@ -108,6 +109,8 @@ namespace UniversalEditor.DataFormats.Solution.Microsoft.VisualStudio
string projectTitle = paramz[0].Trim(); string projectTitle = paramz[0].Trim();
string projectRelativeFileName = paramz[1].Trim(); string projectRelativeFileName = paramz[1].Trim();
string projectFileName = solutionPath + System.IO.Path.DirectorySeparatorChar.ToString() + projectRelativeFileName; string projectFileName = solutionPath + System.IO.Path.DirectorySeparatorChar.ToString() + projectRelativeFileName;
string projectDirectory = System.IO.Path.GetDirectoryName(projectFileName);
Guid projectID = new Guid(paramz[2].Trim()); Guid projectID = new Guid(paramz[2].Trim());
if (projectTypeID == KnownProjectTypeIDs.SolutionFolder) if (projectTypeID == KnownProjectTypeIDs.SolutionFolder)
@ -122,6 +125,7 @@ namespace UniversalEditor.DataFormats.Solution.Microsoft.VisualStudio
{ {
if (UniversalEditor.Common.Reflection.GetAvailableObjectModel<ProjectObjectModel>(projectFileName, out ProjectObjectModel project)) if (UniversalEditor.Common.Reflection.GetAvailableObjectModel<ProjectObjectModel>(projectFileName, out ProjectObjectModel project))
{ {
project.BasePath = projectDirectory;
project.Title = projectTitle; project.Title = projectTitle;
sol.Projects.Add(project); sol.Projects.Add(project);
lastProject = project; lastProject = project;
@ -173,7 +177,7 @@ namespace UniversalEditor.DataFormats.Solution.Microsoft.VisualStudio
foreach (ProjectObjectModel project in sol.Projects) foreach (ProjectObjectModel project in sol.Projects)
{ {
string projdir = soldir + "/" + project.Title; string projdir = soldir + "/" + project.Title;
project.RelativeFileName = project.Title + "\\" + project.Title + ".ueproj"; project.RelativeFileName = project.Title + "\\" + project.Title + GetFileExtensionForProjectType(project.ProjectTypes);
/* /*
if (project is SolutionFolder) if (project is SolutionFolder)
@ -184,8 +188,13 @@ namespace UniversalEditor.DataFormats.Solution.Microsoft.VisualStudio
else else
{ {
*/ */
Guid projectTypeGuid = Guid.Empty; Guid projectTypeGuid = Guid.Empty;
if (project.ProjectType != null) projectTypeGuid = project.ProjectType.ID; if (project.ProjectTypes.Count > 0)
{
projectTypeGuid = project.ProjectTypes[0].ID;
}
writer.WriteLine("Project(\"" + projectTypeGuid.ToString("B").ToUpper() + "\") = \"" + project.Title + "\", \"" + project.RelativeFileName + "\", \"" + project.ID.ToString("B").ToUpper() + "\""); writer.WriteLine("Project(\"" + projectTypeGuid.ToString("B").ToUpper() + "\") = \"" + project.Title + "\", \"" + project.RelativeFileName + "\", \"" + project.ID.ToString("B").ToUpper() + "\"");
writer.WriteLine("EndProject"); writer.WriteLine("EndProject");
/* /*
@ -197,7 +206,25 @@ namespace UniversalEditor.DataFormats.Solution.Microsoft.VisualStudio
System.IO.Directory.CreateDirectory(projdir); System.IO.Directory.CreateDirectory(projdir);
} }
foreach (ProjectFile pf in project.FileSystem.Files)
{
pf.SourceFileAccessor.Open();
pf.SourceFileAccessor.Seek(0, SeekOrigin.Begin);
byte[] data = pf.SourceFileAccessor.Reader.ReadToEnd();
pf.SourceFileAccessor.Close();
string filename = System.IO.Path.Combine(new string[] { projdir, pf.DestinationFileName });
string filedir = System.IO.Path.GetDirectoryName(filename);
if (!System.IO.Directory.Exists(filedir))
{
System.IO.Directory.CreateDirectory(filedir);
}
System.IO.File.WriteAllBytes(System.IO.Path.Combine(new string[] { projdir, pf.DestinationFileName }), data);
}
Document.Save(project, new VisualStudioProjectDataFormat(), new FileAccessor(projdir + "/" + project.Title + ".ueproj", true, true), true); Document.Save(project, new VisualStudioProjectDataFormat(), new FileAccessor(projdir + "/" + project.Title + ".ueproj", true, true), true);
project.BasePath = projdir;
} }
writer.WriteLine("Global"); writer.WriteLine("Global");
@ -226,5 +253,18 @@ namespace UniversalEditor.DataFormats.Solution.Microsoft.VisualStudio
writer.WriteLine("\tEndGlobalSection"); writer.WriteLine("\tEndGlobalSection");
writer.WriteLine("EndGlobal"); writer.WriteLine("EndGlobal");
} }
private string GetFileExtensionForProjectType(ProjectType.ProjectTypeCollection projectTypes)
{
ProjectType projectType = null;
if (projectTypes.Count > 0)
projectType = projectTypes[0];
if (projectType?.ProjectFileExtension != null)
{
return projectType.ProjectFileExtension;
}
return ".ueproj";
}
} }
} }