Replaced the old VS templates with ones that offer more flexiblity. Started replacing the Content Project for the samples with our custom project type. Inlcuded a basic not yet working AssimpImporter.
218 lines
8.4 KiB
C#
218 lines
8.4 KiB
C#
/* ****************************************************************************
|
|
*
|
|
* Copyright (c) Microsoft Corporation.
|
|
*
|
|
* This source code is subject to terms and conditions of the Apache License, Version 2.0. A
|
|
* copy of the license can be found in the License.html file at the root of this distribution. If
|
|
* you cannot locate the Apache License, Version 2.0, please send an email to
|
|
* vspython@microsoft.com. By using this source code in any fashion, you are agreeing to be bound
|
|
* by the terms of the Apache License, Version 2.0.
|
|
*
|
|
* You must not remove this notice, or any other, from this software.
|
|
*
|
|
* ***************************************************************************/
|
|
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics.CodeAnalysis;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace Microsoft.VisualStudio.Project.Automation {
|
|
/// <summary>
|
|
/// This can navigate a collection object only (partial implementation of ProjectItems interface)
|
|
/// </summary>
|
|
[SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")]
|
|
[ComVisible(true)]
|
|
public class OANavigableProjectItems : EnvDTE.ProjectItems {
|
|
#region fields
|
|
private OAProject project;
|
|
private HierarchyNode nodeWithItems;
|
|
#endregion
|
|
|
|
#region properties
|
|
/// <summary>
|
|
/// Defines a relationship to the associated project.
|
|
/// </summary>
|
|
public OAProject Project {
|
|
get {
|
|
return this.project;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Defines the node that contains the items
|
|
/// </summary>
|
|
public HierarchyNode NodeWithItems {
|
|
get {
|
|
return this.nodeWithItems;
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region ctor
|
|
/// <summary>
|
|
/// Constructor.
|
|
/// </summary>
|
|
/// <param name="project">The associated project.</param>
|
|
/// <param name="nodeWithItems">The node that defines the items.</param>
|
|
public OANavigableProjectItems(OAProject project, HierarchyNode nodeWithItems) {
|
|
this.project = project;
|
|
this.nodeWithItems = nodeWithItems;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region EnvDTE.ProjectItems
|
|
|
|
/// <summary>
|
|
/// Gets a value indicating the number of objects in the collection.
|
|
/// </summary>
|
|
public virtual int Count {
|
|
get {
|
|
int count = 0;
|
|
UIThread.Instance.RunSync(() => {
|
|
for (HierarchyNode child = this.NodeWithItems.FirstChild; child != null; child = child.NextSibling) {
|
|
if (child.GetAutomationObject() is EnvDTE.ProjectItem) {
|
|
count += 1;
|
|
}
|
|
}
|
|
});
|
|
return count;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the immediate parent object of a ProjectItems collection.
|
|
/// </summary>
|
|
public virtual object Parent {
|
|
get {
|
|
return this.nodeWithItems.GetAutomationObject();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets an enumeration indicating the type of object.
|
|
/// </summary>
|
|
public virtual string Kind {
|
|
get {
|
|
// TODO: Add OAProjectItems.Kind getter implementation
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the top-level extensibility object.
|
|
/// </summary>
|
|
public virtual EnvDTE.DTE DTE {
|
|
get {
|
|
return (EnvDTE.DTE)this.project.DTE;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the project hosting the project item or items.
|
|
/// </summary>
|
|
public virtual EnvDTE.Project ContainingProject {
|
|
get {
|
|
return this.project;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Adds one or more ProjectItem objects from a directory to the ProjectItems collection.
|
|
/// </summary>
|
|
/// <param name="directory">The directory from which to add the project item.</param>
|
|
/// <returns>A ProjectItem object.</returns>
|
|
public virtual EnvDTE.ProjectItem AddFromDirectory(string directory) {
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates a new project item from an existing item template file and adds it to the project.
|
|
/// </summary>
|
|
/// <param name="fileName">The full path and file name of the template project file.</param>
|
|
/// <param name="name">The file name to use for the new project item.</param>
|
|
/// <returns>A ProjectItem object. </returns>
|
|
public virtual EnvDTE.ProjectItem AddFromTemplate(string fileName, string name) {
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Creates a new folder in Solution Explorer.
|
|
/// </summary>
|
|
/// <param name="name">The name of the folder node in Solution Explorer.</param>
|
|
/// <param name="kind">The type of folder to add. The available values are based on vsProjectItemsKindConstants and vsProjectItemKindConstants</param>
|
|
/// <returns>A ProjectItem object.</returns>
|
|
public virtual EnvDTE.ProjectItem AddFolder(string name, string kind) {
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Copies a source file and adds it to the project.
|
|
/// </summary>
|
|
/// <param name="filePath">The path and file name of the project item to be added.</param>
|
|
/// <returns>A ProjectItem object. </returns>
|
|
public virtual EnvDTE.ProjectItem AddFromFileCopy(string filePath) {
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Adds a project item from a file that is installed in a project directory structure.
|
|
/// </summary>
|
|
/// <param name="fileName">The file name of the item to add as a project item. </param>
|
|
/// <returns>A ProjectItem object. </returns>
|
|
public virtual EnvDTE.ProjectItem AddFromFile(string fileName) {
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get Project Item from index
|
|
/// </summary>
|
|
/// <param name="index">Either index by number (1-based) or by name can be used to get the item</param>
|
|
/// <returns>Project Item. ArgumentException if invalid index is specified</returns>
|
|
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
|
|
public virtual EnvDTE.ProjectItem Item(object index) {
|
|
// Changed from MPFProj: throws ArgumentException instead of returning null (http://mpfproj10.codeplex.com/workitem/9158)
|
|
if (index is int) {
|
|
int realIndex = (int)index - 1;
|
|
if (realIndex >= 0) {
|
|
for (HierarchyNode child = this.NodeWithItems.FirstChild; child != null; child = child.NextSibling) {
|
|
var item = child.GetAutomationObject() as EnvDTE.ProjectItem;
|
|
if (item != null) {
|
|
if (realIndex == 0) {
|
|
return item;
|
|
}
|
|
realIndex -= 1;
|
|
}
|
|
}
|
|
}
|
|
} else if (index is string) {
|
|
string name = (string)index;
|
|
for (HierarchyNode child = this.NodeWithItems.FirstChild; child != null; child = child.NextSibling) {
|
|
var item = child.GetAutomationObject() as EnvDTE.ProjectItem;
|
|
if (item != null && String.Compare(item.Name, name, StringComparison.OrdinalIgnoreCase) == 0) {
|
|
return item;
|
|
}
|
|
}
|
|
}
|
|
throw new ArgumentException();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns an enumeration for items in a collection.
|
|
/// </summary>
|
|
/// <returns>An IEnumerator for this object.</returns>
|
|
public virtual IEnumerator GetEnumerator() {
|
|
for (HierarchyNode child = this.NodeWithItems.FirstChild; child != null; child = child.NextSibling) {
|
|
var item = child.GetAutomationObject() as EnvDTE.ProjectItem;
|
|
if (item != null) {
|
|
yield return item;
|
|
}
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|