218 lines
8.4 KiB
C#
Raw Normal View History

/* ****************************************************************************
*
* 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
}
}