/// Copyright (c) Microsoft Corporation. All rights reserved.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.InteropServices;
namespace Microsoft.VisualStudio.Project.Automation
{
///
/// This can navigate a collection object only (partial implementation of ProjectItems interface)
///
[SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")]
[ComVisible(true), CLSCompliant(false)]
public class OANavigableProjectItems : EnvDTE.ProjectItems
{
#region fields
private OAProject project;
private IList items;
private HierarchyNode nodeWithItems;
#endregion
#region properties
///
/// Defines an internal list of project items
///
internal IList Items
{
get
{
return this.items;
}
}
///
/// Defines a relationship to the associated project.
///
internal OAProject Project
{
get
{
return this.project;
}
}
///
/// Defines the node that contains the items
///
internal HierarchyNode NodeWithItems
{
get
{
return this.nodeWithItems;
}
}
#endregion
#region ctor
///
/// Constructor.
///
/// The associated project.
/// The node that defines the items.
public OANavigableProjectItems(OAProject project, HierarchyNode nodeWithItems)
{
this.project = project;
this.nodeWithItems = nodeWithItems;
this.items = this.GetListOfProjectItems();
}
///
/// Constructor.
///
/// The associated project.
/// A list of items that will make up the items defined by this object.
/// The node that defines the items.
public OANavigableProjectItems(OAProject project, IList items, HierarchyNode nodeWithItems)
{
this.items = items;
this.project = project;
this.nodeWithItems = nodeWithItems;
}
#endregion
#region EnvDTE.ProjectItems
///
/// Gets a value indicating the number of objects in the collection.
///
public virtual int Count
{
get
{
return items.Count;
}
}
///
/// Gets the immediate parent object of a ProjectItems collection.
///
public virtual object Parent
{
get
{
return this.nodeWithItems.GetAutomationObject();
}
}
///
/// Gets an enumeration indicating the type of object.
///
public virtual string Kind
{
get
{
// TODO: Add OAProjectItems.Kind getter implementation
return null;
}
}
///
/// Gets the top-level extensibility object.
///
public virtual EnvDTE.DTE DTE
{
get
{
return (EnvDTE.DTE)this.project.DTE;
}
}
///
/// Gets the project hosting the project item or items.
///
public virtual EnvDTE.Project ContainingProject
{
get
{
return this.project;
}
}
///
/// Adds one or more ProjectItem objects from a directory to the ProjectItems collection.
///
/// The directory from which to add the project item.
/// A ProjectItem object.
public virtual EnvDTE.ProjectItem AddFromDirectory(string directory)
{
throw new NotImplementedException();
}
///
/// Creates a new project item from an existing item template file and adds it to the project.
///
/// The full path and file name of the template project file.
/// The file name to use for the new project item.
/// A ProjectItem object.
public virtual EnvDTE.ProjectItem AddFromTemplate(string fileName, string name)
{
throw new NotImplementedException();
}
///
/// Creates a new folder in Solution Explorer.
///
/// The name of the folder node in Solution Explorer.
/// The type of folder to add. The available values are based on vsProjectItemsKindConstants and vsProjectItemKindConstants
/// A ProjectItem object.
public virtual EnvDTE.ProjectItem AddFolder(string name, string kind)
{
throw new NotImplementedException();
}
///
/// Copies a source file and adds it to the project.
///
/// The path and file name of the project item to be added.
/// A ProjectItem object.
public virtual EnvDTE.ProjectItem AddFromFileCopy(string filePath)
{
throw new NotImplementedException();
}
///
/// Adds a project item from a file that is installed in a project directory structure.
///
/// The file name of the item to add as a project item.
/// A ProjectItem object.
public virtual EnvDTE.ProjectItem AddFromFile(string fileName)
{
throw new NotImplementedException();
}
///
/// Get Project Item from index
///
/// Either index by number (1-based) or by name can be used to get the item
/// Project Item. null is return if invalid index is specified
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
public virtual EnvDTE.ProjectItem Item(object index)
{
if(index is int)
{
int realIndex = (int)index - 1;
if(realIndex >= 0 && realIndex < this.items.Count)
{
return (EnvDTE.ProjectItem)items[realIndex];
}
return null;
}
else if(index is string)
{
string name = (string)index;
foreach(EnvDTE.ProjectItem item in items)
{
if(String.Compare(item.Name, name, StringComparison.OrdinalIgnoreCase) == 0)
{
return item;
}
}
}
return null;
}
///
/// Returns an enumeration for items in a collection.
///
/// An IEnumerator for this object.
public virtual IEnumerator GetEnumerator()
{
if(this.items == null)
{
yield return null;
}
int count = items.Count;
for(int i = 0; i < count; i++)
{
yield return items[i];
}
}
#endregion
#region virtual methods
///
/// Retrives a list of items associated with the current node.
///
/// A List of project items
protected IList GetListOfProjectItems()
{
List list = new List();
for(HierarchyNode child = this.NodeWithItems.FirstChild; child != null; child = child.NextSibling)
{
EnvDTE.ProjectItem item = child.GetAutomationObject() as EnvDTE.ProjectItem;
if(null != item)
{
list.Add(item);
}
}
return list;
}
#endregion
}
}