using System; using System.Collections.Generic; using System.Globalization; using System.Web.UI; namespace SPSolutions.SharePoint.WebControls { public class SPScriptManager : Control { protected override void OnInit(EventArgs e) { base.OnInit(e); if (!base.DesignMode) { if (SPScriptManager.GetCurrent(this.Page) != null) { throw new Exception("Only one script manager allowed"); } this.Page.Items[typeof(SPScriptManager)] = this; } } protected override void OnLoad(EventArgs e) { base.OnLoad(e); } protected override void Render(HtmlTextWriter writer) { base.Render(writer); } private IEnumerable GetCssReferences(Control control) { List list = new List(); Type type = control.GetType(); Type typeFromHandle = typeof(SPClientCssResourceAttribute); object[] customAttributes = type.GetCustomAttributes(typeFromHandle, true); for (int i = 0; i < customAttributes.Length; i++) { SPClientCssResourceAttribute sPClientCssResourceAttribute = (SPClientCssResourceAttribute)customAttributes[i]; list.Add(sPClientCssResourceAttribute.ClientResourceResolver.BuildResourcePath(sPClientCssResourceAttribute.ResourceName)); } return list; } private IEnumerable GetScriptReferences(Control control) { List list = new List(); Type type = control.GetType(); Type typeFromHandle = typeof(SPClientScriptResourceAttribute); object[] customAttributes = type.GetCustomAttributes(typeFromHandle, true); for (int i = 0; i < customAttributes.Length; i++) { SPClientScriptResourceAttribute sPClientScriptResourceAttribute = (SPClientScriptResourceAttribute)customAttributes[i]; list.Add(sPClientScriptResourceAttribute.ClientResourceResolver.BuildResourcePath(sPClientScriptResourceAttribute.ResourceName)); } return list; } public void RegisterClientCss(Control control, string styleSheet) { control.Page.ClientScript.RegisterClientScriptBlock(typeof(SPScriptManager), styleSheet, string.Format(CultureInfo.InvariantCulture, "", new object[] { styleSheet }), false); } public void RegisterClientScript(Control control, string scriptPath) { control.Page.ClientScript.RegisterClientScriptInclude(typeof(SPScriptManager), scriptPath, scriptPath); } public void RegisterCssReference(Control control) { foreach (string current in this.GetCssReferences(control)) { this.RegisterClientCss(this, current); } } public void RegisterScriptReferences(Control control) { foreach (string current in this.GetScriptReferences(control)) { this.RegisterClientScript(this, current); } } public static SPScriptManager GetCurrent(Page page) { if (page == null) { throw new ArgumentNullException("page"); } return page.Items[typeof(SPScriptManager)] as SPScriptManager; } } }