My contributions to SPExLib
I just discovered Wictor Wilen (et al)’s excellent CodePlex project: SharePoint Extensions Lib, which aims to simplify SharePoint development on .NET 3.5 SP1 and up.
Since I never took the time to figure out how exactly to contribute directly to a CodePlex project, I instead first did an ad-hoc contribution of my (or rather Rob Garrett’s really) SPlist.AddItemOptimized() method. I then quickly went through the methods that are there so far in SPExLib, and culled from my own library those that overlapped. Below is the filtered result: these are extension methods not currently in the SPExlib project (as of June 04 2009).
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint;
namespace SPExLib.SharePoint
{
#region Site Extensions
/// <summary>
/// SPSite Extension Methods
/// </summary>
public static class SiteExtensions
{
/// <summary>
/// Gets a built in site field (column).
/// </summary>
/// <param name="site">The site.</param>
/// <param name="builtInFieldId">The built in field id.</param>
/// <returns>The Built In <see cref="SPField"/>.</returns>
public static SPField GetBuiltInField(this SPSite site, Guid builtInFieldId)
{
return site.RootWeb.Fields[builtInFieldId];
}
/// <summary>
/// Gets a <see cref="List{SPList}"/> of all lists contained within the site collection, including those in the root web and all the sub sites.
/// </summary>
/// <param name="site">The site.</param>
/// <returns>A <see cref="List{SPList}"/> containing all the lists.</returns>
public static List<SPList> GetAllLists(this SPSite site)
{
List<SPList> allLists = new List<SPList>();
for (int i = 0; i < site.AllWebs.Count; i++)
{
using (SPWeb web = site.AllWebs[i])
{
allLists.AddRange(web.Lists.Cast<SPList>());
}
}
return allLists;
}
}
#endregion
#region Web Extensions
/// <summary>
/// Extensions to the SPWeb class
/// </summary>
public static class WebExtensions
{
/// <summary>
/// Gets the relative URL of the web.
/// </summary>
/// <param name="web">The web.</param>
/// <returns>The Url of the web, relative to the site.</returns>
public static string GetRelativeUrl(this SPWeb web)
{
string siteUrl = web.Site.Url;
string webUrl = web.Url;
if (webUrl.Contains(siteUrl))
return webUrl.Replace(siteUrl, "");
return null;
}
/// <summary>
/// Gets the list from the list's URL, relative to the Web (which is the url used to create the list).
/// </summary>
/// <param name="web">The web.</param>
/// <param name="listUrl">The list URL, relative to the web (equals the url used to create the list).</param>
/// <returns>A <see cref="SPList"/> instance, or null, if the list was not found.</returns>
public static SPList GetListFromListUrl(this SPWeb web, string listUrl)
{
SPList result = null;
listUrl = string.Format("{0}/{1}", web.Url, listUrl);
try
{
result = web.GetList(listUrl);
}
catch { }
return result;
}
}
#endregion
#region SPList Extensions
/// <summary>
/// SPList Extension Methods
/// </summary>
public static class ListExtensions
{
/// <summary>
/// Adds a content type to the list, optionally adding the content type fields to the default view for the list.
/// </summary>
/// <param name="list">The list.</param>
/// <param name="contentType">The content type.</param>
/// <param name="addColumnsToDefaultView">if set to <c>true</c> add columns to the list's default view.</param>
/// <returns>The <see cref="SPContentType"/> instance.</returns>
public static SPContentType AddContentType(this SPList list, SPContentType contentType, bool addColumnsToDefaultView)
{
if (contentType == null || list.ContentTypes.ContainsContentType(contentType.Id))
return contentType;
contentType = list.ContentTypes.Add(contentType);
if (addColumnsToDefaultView)
{
bool viewUpdated = false;
SPView defaultView = list.DefaultView;
//SPViewFieldCollection viewFields = list.DefaultView.ViewFields;
//Add content type fields (but only those not hidden, and also not ContentType and Title)
foreach (SPField field in contentType.Fields)
{
if (!defaultView.ViewFields.Contains(field.InternalName)
&& !field.Hidden && !contentType.FieldLinks[field.Id].Hidden
&& !"|Title|ContentType|Name|".Contains(field.InternalName)
)
{
defaultView.ViewFields.Add(field);
viewUpdated = true;
}
}
if (viewUpdated)
{
defaultView.DefaultView = true;
defaultView.Update();
}
}
list.Update();
return contentType;
}
#endregion
#region SPDocumentLibrary
/// <summary>
/// Adds the content type to the document library, optionally adding the content type fields to the default view for the list.
/// </summary>
/// <param name="documentLibrary">The document library.</param>
/// <param name="contentType">The content type.</param>
/// <param name="addColumnsToDefaultView">if set to <c>true</c> [add columns to default view].</param>
/// <returns>The <see cref="SPContentType"/> instance.</returns>
public static SPContentType AddContentType(this SPDocumentLibrary documentLibrary, SPContentType contentType, bool addColumnsToDefaultView)
{
return ((SPList)documentLibrary).AddContentType(contentType, addColumnsToDefaultView);
}
#endregion
#region SPListCollection
/// <summary>
/// Creates a list based on the specified title, description, URL, Feature ID, template type, document template type, and options for displaying a link to the list in Quick Launch.
/// Overloads and corrects the parameter types of the default Add method
/// </summary>
/// <param name="listCollection">The list collection.</param>
/// <param name="title">The title.</param>
/// <param name="description">The description.</param>
/// <param name="url">The URL.</param>
/// <param name="featureId">The feature id.</param>
/// <param name="templateType">The template type.</param>
/// <param name="docTemplateType">The doc template type.</param>
/// <param name="quickLaunchOptions">The quick launch options.</param>
/// <returns>A GUID that identifies the new list.</returns>
public static Guid Add(this SPListCollection listCollection, string title, string description, string url, Guid featureId,
SPListTemplateType templateType, int docTemplateType, SPListTemplate.QuickLaunchOptions quickLaunchOptions)
{
return listCollection.Add(title, description, url, featureId.ToString("B").ToUpper(),
(int)templateType, docTemplateType.ToString(), quickLaunchOptions);
}
#endregion
#region SPViewFieldCollection
/// <summary>
/// Determines whether the view field collection contains a field of the specified internal name.
/// </summary>
/// <param name="viewFieldCollection">The view field collection.</param>
/// <param name="internalFieldName">Internal name of the field.</param>
/// <returns>
/// <c>true</c> if the view field collection contains the field; otherwise, <c>false</c>.
/// </returns>
public static bool Contains(this SPViewFieldCollection viewFieldCollection, string internalFieldName)
{
return viewFieldCollection.Cast<string>().Any(f => f == internalFieldName);
}
/// <summary>
/// Adds a specified field to the collection.
/// </summary>
/// <param name="col">The collection.</param>
/// <param name="fieldGuid">The field's Guid.</param>
public static void Add(this SPViewFieldCollection col, Guid fieldGuid)
{
col.Add(col.View.ParentList.Fields[fieldGuid]);
}
/// <summary>
/// Deletes the specified field from the collection.
/// </summary>
/// <param name="col">The collection.</param>
/// <param name="fieldGuid">The field's Guid.</param>
public static void Delete(this SPViewFieldCollection col, Guid fieldGuid)
{
col.Delete(col.View.ParentList.Fields[fieldGuid]);
}
}
#endregion
#region SPContentType (and related classes) extensions
/// <summary>
/// SPContentType and related class extensions
/// </summary>
public static class ContentTypeExtensions
{
#region SPFieldLinkCollection Extensions
/// <summary>
/// Adds a field to the <see cref="SPFieldLinkCollection"/>.
/// </summary>
/// <param name="fieldLinkCollection">The field link collection.</param>
/// <param name="field">The field.</param>
public static void AddField(this SPFieldLinkCollection fieldLinkCollection, SPField field)
{
fieldLinkCollection.Add(new SPFieldLink(field));
}
/// <summary>
/// Clears the fields in a <see cref="SPFieldLinkCollection"/>.
/// </summary>
/// <param name="fieldLinkCollection">The field link collection.</param>
public static void ClearFields(this SPFieldLinkCollection fieldLinkCollection)
{
for (int i = fieldLinkCollection.Count - 1; i >= 0; i--)
{
fieldLinkCollection.Delete(fieldLinkCollection[i].Id);
}
}
#endregion
#region SPContentType Extensions
/// <summary>
/// Adds a field link to the <see cref="SPContentType"/>.
/// </summary>
/// <param name="contentType">The content type.</param>
/// <param name="field">The field.</param>
public static void AddFieldLink(this SPContentType contentType, SPField field)
{
contentType.FieldLinks.Add(new SPFieldLink(field));
}
/// <summary>
/// First clears the field links collection from the content type, then re-adds all Parent content type field links.
/// </summary>
/// <param name="contentType">The content type.</param>
public static void ResetFieldLinks(this SPContentType contentType)
{
contentType.FieldLinks.ClearFields();
foreach (SPFieldLink fl in contentType.Parent.FieldLinks)
{
contentType.FieldLinks.Add(fl);
}
}
/// <summary>
/// Clears the event receivers from the content type.
/// </summary>
/// <param name="contentType">The content type.</param>
public static void ResetEventReceivers(this SPContentType contentType)
{
for (int i = contentType.EventReceivers.Count - 1; i >= 0; i--)
{
contentType.EventReceivers[i].Delete();
}
//TODO: Does a content type inherit it's parent content type receiver?
//contentType.EventReceivers = contentType.Parent.EventReceivers;
}
#endregion
#region SPContentTypeCollection Extensions
/// <summary>
/// Determines whether the <see cref="SPContentTypeCollection"/> contains a content type with the specified name.
/// </summary>
/// <param name="contentTypeCollection">The content type collection.</param>
/// <param name="name">The name.</param>
/// <returns>
/// <c>true</c> if the content type collection contains a content type with the specified name; otherwise, <c>false</c>.
/// </returns>
public static bool Contains(this SPContentTypeCollection contentTypeCollection, string name)
{
//return contentTypeCollection.Cast<SPContentType>().Any(ct => ct.Name == name);
return (contentTypeCollection[name] != null);
}
/// <summary>
/// Determines whether the content type collection contains a content type with the specified <see cref="SPContentTypeId"/>.
/// </summary>
/// <param name="contentTypeCollection">The content type collection.</param>
/// <param name="contentTypeID">The content type ID.</param>
/// <returns>
/// <c>true</c> if the content type collection contains a content type with the specified <see cref="SPContentTypeId"/>; otherwise, <c>false</c>.
/// </returns>
public static bool ContainsContentType(this SPContentTypeCollection contentTypeCollection, SPContentTypeId contentTypeID)
{
//old way
//for (int i=0; i < contentTypeCollection.Count; i++)
//{
// if (contentTypeCollection[i].Id == contentTypeID)
// return true;
//}
//return false;
//new cool way:
//return contentTypeCollection.Cast<SPContentType>().Any(ct => ct.Id == contentTypeID);
//simple way
return (contentTypeCollection[contentTypeID] != null);
}
/// <summary>
/// Deletes a sealed content type by unsealing and un-readonly-ing the content type before attempting to delete it.
/// </summary>
/// <param name="contentTypeCollection">The content type collection.</param>
/// <param name="name">The name.</param>
/// <returns></returns>
public static bool DeleteSealedContentType(this SPContentTypeCollection contentTypeCollection, string name)
{
bool success = false;
try
{
SPContentType contentType = contentTypeCollection[name];
contentType.Sealed = false;
contentType.ReadOnly = false;
contentTypeCollection.Delete(contentType.Id);
success = !contentTypeCollection.ContainsContentType(contentType.Id);
}
catch { }
return success;
}
#endregion
}
#endregion
/// <summary>
/// Extension methods for SPFile
/// </summary>
public static class SPFileExtensions
{
/// <summary>
/// Gets the file size as string.
/// </summary>
/// <param name="file">The file.</param>
/// <returns></returns>
public static string GetFileSizeAsString(this SPFile file)
{
double s = file.Length;
string[] format = new string[] { "{0} bytes", "{0} KB", "{0} MB", "{0} GB", "{0} TB", "{0} PB", "{0} EB", "{0} ZB", "{0} YB" };
int i = 0;
while (i < format.Length - 1 && s >= 1024)
{
s = (int)(100 * s / 1024) / 100.0;
i++;
}
return string.Format(format[i], s.ToString("###,###,###.##"));
}
}
} Labels: c#, howto, me-me-me, moss, sharepoint
0 Comments:
Post a Comment
<< Home