using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Collections.Specialized; using System.Text; public delegate void SortableListRenderElementHandler(HtmlTextWriter writer, ListItem li); public enum SortableListRenderStyle { Default,None } namespace WebBlocks { public class SortableList : ListControl, IPostBackDataHandler { internal const string ULStyle = "margin: 0; padding: 0px; list-style-type: none;"; internal const string LIStyle = "cursor: move; margin: 1px; padding: 2px 5px; background-color: #EEEEEE; border: 1px solid #DDDDDD;"; //private static bool JavascriptIncluded = false; private string JSObjectName { get { return "sort" + this.ClientID; } } private SortableListRenderStyle _RenderStyle = SortableListRenderStyle.Default; private SortableListRenderStyle RenderStyle { get { return _RenderStyle; } set { _RenderStyle = value; } } #region properties private string CommaSeperatedOrder { get { return (string)ViewState["CommaSeperatedOrder"]; } set { ViewState["CommaSeperatedOrder"] = value; } } public NameValueCollection GetValueOrderList() { string []cso = CommaSeperatedOrder.Split(','); NameValueCollection ret = new NameValueCollection(); for (int i = 0; i < cso.Length; i++) { int index = Int32.Parse(cso[i]); ret.Add(Items[index].Value, i.ToString()); } return ret; } #endregion public SortableList() { } #region IPostBackDataHandler Members public virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection) { if (CommaSeperatedOrder != null) { if (!CommaSeperatedOrder.Equals(postCollection[postDataKey])) { CommaSeperatedOrder = postCollection[postDataKey]; return true; } } return false; } public virtual void RaisePostDataChangedEvent() { OnOrderChanged(); } public event EventHandler OrderChanged; public virtual void OnOrderChanged() { if (OrderChanged != null) OrderChanged(this, null); } #endregion #region overrides protected override void OnPreRender(EventArgs e) { if (this.Visible) { if (!Page.ClientScript.IsClientScriptIncludeRegistered("prototype")) Page.ClientScript.RegisterClientScriptInclude("prototype", Page.ClientScript.GetWebResourceUrl(typeof(WebBlocksResources.WebBlocksResources), "WebBlocksResources.prototype.js")); if (!Page.ClientScript.IsClientScriptIncludeRegistered("scriptaculous")) Page.ClientScript.RegisterClientScriptInclude("scriptaculous", Page.ClientScript.GetWebResourceUrl(typeof(WebBlocksResources.WebBlocksResources), "WebBlocksResources.scriptaculous.js")); if (!Page.ClientScript.IsClientScriptIncludeRegistered("effects")) Page.ClientScript.RegisterClientScriptInclude("effects", Page.ClientScript.GetWebResourceUrl(typeof(WebBlocksResources.WebBlocksResources), "WebBlocksResources.effects.js")); if (!Page.ClientScript.IsClientScriptIncludeRegistered("dragdrop")) Page.ClientScript.RegisterClientScriptInclude("dragdrop", Page.ClientScript.GetWebResourceUrl(typeof(WebBlocksResources.WebBlocksResources), "WebBlocksResources.dragdrop.js")); if (!Page.ClientScript.IsClientScriptBlockRegistered("saveSortState")) Page.ClientScript.RegisterClientScriptBlock(typeof(string), "saveSortState", "function saveSortState(fld,target) { document.forms[0][fld].value = Sortable.sequence(target); }", true); Page.ClientScript.RegisterOnSubmitStatement(typeof(string), "sorter" + this.ClientID, "saveSortState('" + this.UniqueID + "','" + this.ClientID + "'); "); } base.OnPreRender(e); } protected override void PerformDataBinding(System.Collections.IEnumerable dataSource) { base.PerformDataBinding(dataSource); // also set the sort order now, if its not set if (CommaSeperatedOrder == null) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < Items.Count; i++) { sb.Append(i.ToString()); sb.Append(","); } CommaSeperatedOrder = sb.ToString().TrimEnd(','); } } public event SortableListRenderElementHandler RenderElement; public virtual void OnRenderElement(HtmlTextWriter writer, ListItem li) { if (RenderElement != null) RenderElement(writer, li); else writer.Write(li.Text); } protected override void Render(HtmlTextWriter writer) { if (this.Visible) { writer.AddAttribute(HtmlTextWriterAttribute.Type, "hidden"); writer.AddAttribute(HtmlTextWriterAttribute.Value, this.CommaSeperatedOrder); writer.AddAttribute(HtmlTextWriterAttribute.Name, this.UniqueID); writer.RenderBeginTag(HtmlTextWriterTag.Input); writer.RenderEndTag(); if (Items.Count > 0) { writer.Write("\n"); } // create the javascript for this object writer.Write(""); } } #endregion } }