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