From: Argiris K. <be...@us...> - 2005-11-10 12:53:17
|
Update of /cvsroot/magicajax/MagicAjax NET 1.1/UI/Controls In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21307/UI/Controls Modified Files: AjaxPanel.cs Log Message: Many changes to get NoStore page mode working. Set it as the default mode. Index: AjaxPanel.cs =================================================================== RCS file: /cvsroot/magicajax/MagicAjax NET 1.1/UI/Controls/AjaxPanel.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** AjaxPanel.cs 24 Oct 2005 23:42:38 -0000 1.1 --- AjaxPanel.cs 10 Nov 2005 12:53:09 -0000 1.2 *************** *** 71,77 **** /// </remarks> [Designer("MagicAjax.UI.Design.AjaxPanelDesigner, MagicAjax"), ! ParseChildrenAttribute(false), ! PersistChildren(true), ! ToolboxData("<{0}:AjaxPanel runat=server>AjaxPanel</{0}:AjaxPanel>")] public class AjaxPanel : RenderedByScriptControl, IFormDataLoadedEventHandler, INamingContainer { --- 71,77 ---- /// </remarks> [Designer("MagicAjax.UI.Design.AjaxPanelDesigner, MagicAjax"), ! ParseChildrenAttribute(false), ! PersistChildren(true), ! ToolboxData("<{0}:AjaxPanel runat=server>AjaxPanel</{0}:AjaxPanel>")] public class AjaxPanel : RenderedByScriptControl, IFormDataLoadedEventHandler, INamingContainer { *************** *** 83,86 **** --- 83,87 ---- private Hashtable _controlHtmls = new Hashtable(); private NoVerifyRenderingPage _noVerifyPage = new NoVerifyRenderingPage(); + private ControlCollectionState _controlState = new ControlCollectionState(); #endregion *************** *** 138,228 **** #region Public Methods - #region override RenderByScript - /// <summary> - /// It scans child controls for added, removed or altered controls and sends - /// the appropriate javascript to the client. - /// </summary> - public override void RenderByScript() - { - DisableVerifyRendering (true); - - System.Text.StringBuilder sb = new System.Text.StringBuilder(); - HtmlTextWriter litewriter = new HtmlTextWriter(new System.IO.StringWriter(sb)); - - System.Text.StringBuilder sbFull = new System.Text.StringBuilder(); - HtmlTextWriter fullwriter = new HtmlTextWriter(new System.IO.StringWriter(sbFull)); - - bool allControlsAreNew = (Controls.Count == _addedControls.Count); - - if ( ! this.IsRenderedOnPage || allControlsAreNew ) - { - // Render all the controls in a single html rendering. - - for (int i=0; i < Controls.Count; i++) - { - Control con = Controls[i]; - - fullwriter.WriteBeginTag ("span"); - fullwriter.WriteAttribute ("id", GetAjaxElemID(con)); - fullwriter.Write (HtmlTextWriter.TagRightChar); - - ExtendedRenderControl (con, fullwriter, litewriter); - - fullwriter.WriteEndTag ("span"); - - _controlHtmls[con] = sb.ToString(); - sb.Length = 0; - } - - if (sbFull.Length > 0) - { - CallBackHelper.WriteSetHtmlOfElementScript (sbFull.ToString(), ClientID); - } - } - else - { - foreach (Control con in _removedControls) - { - _controlHtmls.Remove (con); - CallBackHelper.WriteRemoveElementScript (ClientID, GetAjaxElemID(con)); - } - - for (int i=0; i < Controls.Count; i++) - { - Control con = Controls[i]; - - string html; - sbFull.Length = sb.Length = 0; - - if (_addedControls.Contains(con)) - { - // It's a new control, create it on the client at the appropriate place. - ExtendedRenderControl (con, fullwriter, litewriter); - - CallBackHelper.WriteAddElementScript (ClientID, "span", GetAjaxElemID(con), sbFull.ToString(), GetNextExistingElement(i)); - _controlHtmls[con] = sb.ToString(); - } - else - { - ExtendedRenderControl (con, litewriter); - html = sb.ToString(); - - // If it's html rendering is the same, ignore it. - if (html != (string)_controlHtmls[con]) - { - ExtendedWriteSetHtmlOfElementScript (html, GetAjaxElemID(con)); - _controlHtmls[con] = html; - } - } - } - } - - DisableVerifyRendering (false); - - _addedControls.Clear(); - _removedControls.Clear(); - } - #endregion - #region RaiseFormDataLoadedEvent /// <summary> --- 139,142 ---- *************** *** 333,337 **** { if (_addedControls.Contains(control)) ! _addedControls.Remove (control); else _removedControls.Add (control); --- 247,251 ---- { if (_addedControls.Contains(control)) ! _addedControls.Remove (control); else _removedControls.Add (control); *************** *** 352,377 **** protected override void RenderChildren(HtmlTextWriter writer) { DisableVerifyRendering (true); - System.Text.StringBuilder sbFull = new System.Text.StringBuilder(); System.Text.StringBuilder sb = new System.Text.StringBuilder(); - HtmlTextWriter fullwriter = new HtmlTextWriter(new System.IO.StringWriter(sbFull)); HtmlTextWriter litewriter = new HtmlTextWriter(new System.IO.StringWriter(sb)); ! for (int i=0; i < Controls.Count; i++) { ! Control con = Controls[i]; ! writer.WriteBeginTag ("span"); ! writer.WriteAttribute ("id", GetAjaxElemID(con)); ! writer.Write (HtmlTextWriter.TagRightChar); ! ! ExtendedRenderControl (con, fullwriter, litewriter); ! writer.Write (sbFull.ToString()); ! _controlHtmls[con] = sb.ToString(); ! sbFull.Length = 0; ! sb.Length = 0; ! writer.WriteEndTag ("span"); } --- 266,457 ---- protected override void RenderChildren(HtmlTextWriter writer) { + if ( CallBackHelper.IsCallBack && IsPageNoStoreMode ) + { + LoadControlState(); + DoScriptRendering (writer); + } + else + { + DisableVerifyRendering (true); + + System.Text.StringBuilder sbFull = new System.Text.StringBuilder(); + System.Text.StringBuilder sb = new System.Text.StringBuilder(); + HtmlTextWriter fullwriter = new HtmlTextWriter(new System.IO.StringWriter(sbFull)); + HtmlTextWriter litewriter = new HtmlTextWriter(new System.IO.StringWriter(sb)); + + for (int i=0; i < Controls.Count; i++) + { + Control con = Controls[i]; + + writer.WriteBeginTag ("span"); + writer.WriteAttribute ("id", GetAjaxElemID(con)); + writer.Write (HtmlTextWriter.TagRightChar); + + ExtendedRenderControl (con, fullwriter, litewriter); + writer.Write (sbFull.ToString()); + _controlHtmls[con] = sb.ToString(); + sbFull.Length = 0; + sb.Length = 0; + + writer.WriteEndTag ("span"); + } + + DisableVerifyRendering (false); + + _addedControls.Clear(); + _removedControls.Clear(); + } + + if ( IsPageNoStoreMode ) + SaveControlState(); + } + #endregion + + protected virtual void SaveControlState() + { + _controlState.SetControlIDs (_controlHtmls); + _controlState.Save (this.UniqueID); + } + + protected virtual void LoadControlState() + { + _controlState = ControlCollectionState.LoadState (this.UniqueID); + + if (_controlState == null) + { + // State expired + Page.Response.Redirect (Page.Request.RawUrl); + } + + // Find new and previous controls + _addedControls.Clear(); + _controlHtmls.Clear(); + foreach (Control con in this.Controls) + { + if ( _controlState.ControlIDHtmls.ContainsKey(con.ClientID) ) + { + _controlHtmls[con] = _controlState.ControlIDHtmls[con.ClientID]; + } + else + { + _addedControls.Add (con); + } + } + + // Find removed controls + _removedControls.Clear(); + foreach (string clientID in _controlState.ControlIDHtmls.Keys) + { + int i; + for (i=0; i < this.Controls.Count; i++) + { + if (this.Controls[i].ClientID == clientID) + break; + } + + if (i == this.Controls.Count) + { + // The control is removed. Add a control with the same id + // so that DoScriptRendering "removes" it from page + if ( clientID.StartsWith (this.ClientID) ) + { + Literal lit = new Literal(); + lit.ID = clientID.Substring(this.ClientID.Length + 1); + _removedControls.Add (lit); + } + } + } + } + + #region override RenderByScript + protected override void RenderByScript() + { + DoScriptRendering (new HtmlTextWriter(System.IO.TextWriter.Null)); + } + #endregion + + #region DoScriptRendering + /// <summary> + /// It scans child controls for added, removed or altered controls and sends + /// the appropriate javascript to the client. + /// </summary> + protected virtual void DoScriptRendering (HtmlTextWriter output) + { DisableVerifyRendering (true); System.Text.StringBuilder sb = new System.Text.StringBuilder(); HtmlTextWriter litewriter = new HtmlTextWriter(new System.IO.StringWriter(sb)); ! System.Text.StringBuilder sbFull = new System.Text.StringBuilder(); ! HtmlTextWriter fullwriter = new HtmlTextWriter(new System.IO.StringWriter(sbFull)); ! ! bool allControlsAreNew = (Controls.Count == _addedControls.Count); ! ! if ( ! this.IsRenderedOnPage || allControlsAreNew ) { ! // Render all the controls in a single html rendering. ! for (int i=0; i < Controls.Count; i++) ! { ! Control con = Controls[i]; ! fullwriter.WriteBeginTag ("span"); ! fullwriter.WriteAttribute ("id", GetAjaxElemID(con)); ! fullwriter.Write (HtmlTextWriter.TagRightChar); ! ! ExtendedRenderControl (con, fullwriter, litewriter); ! ! fullwriter.WriteEndTag ("span"); ! ! _controlHtmls[con] = sb.ToString(); ! sb.Length = 0; ! } ! ! if (sbFull.Length > 0) ! { ! string html = sbFull.ToString(); ! CallBackHelper.WriteSetHtmlOfElementScript (html, ClientID); ! output.Write (html); ! } ! } ! else ! { ! foreach (Control con in _removedControls) ! { ! _controlHtmls.Remove (con); ! CallBackHelper.WriteRemoveElementScript (ClientID, GetAjaxElemID(con)); ! } ! ! for (int i=0; i < Controls.Count; i++) ! { ! Control con = Controls[i]; ! ! string html; ! sbFull.Length = sb.Length = 0; ! ! if (_addedControls.Contains(con)) ! { ! // It's a new control, create it on the client at the appropriate place. ! ExtendedRenderControl (con, fullwriter, litewriter); ! ! html = sbFull.ToString(); ! CallBackHelper.WriteAddElementScript (ClientID, "span", GetAjaxElemID(con), html, GetNextExistingElement(i)); ! output.Write (html); ! ! _controlHtmls[con] = sb.ToString(); ! } ! else ! { ! ExtendedRenderControl (con, output, litewriter); ! html = sb.ToString(); ! ! // If it's html rendering is the same, ignore it. ! if (html != (string)_controlHtmls[con]) ! { ! ExtendedWriteSetHtmlOfElementScript (html, GetAjaxElemID(con)); ! _controlHtmls[con] = html; ! } ! } ! } } *************** *** 490,494 **** } ! HtmlTextWriter extwriter = new HtmlTextWriter(extTextWriter); control.RenderControl (extwriter); --- 570,574 ---- } ! HtmlTextWriter extwriter = new HtmlTextWriter(extTextWriter); control.RenderControl (extwriter); *************** *** 522,525 **** --- 602,609 ---- // at the first CallBack. + // Try not using DisableVerify at all if it's IsPageNoStoreMode + if ( this.IsPageNoStoreMode ) + return; + Page page = (disable) ? _noVerifyPage : this.Page; for (int i=0; i < Controls.Count; i++) *************** *** 645,648 **** --- 729,772 ---- #endregion + #region Private Class ControlCollectionState + [Serializable] + private class ControlCollectionState + { + private Hashtable _controlIDHtmls; + + public static ControlCollectionState LoadState(string panelUniqueID) + { + return (ControlCollectionState) HttpContext.Current.Session[GetPageKey(panelUniqueID)]; + } + + public static string GetPageKey (string panelUniqueID) + { + return String.Format("__ControlState_{0}_{1}", HttpContext.Current.Request.RawUrl, panelUniqueID); + } + + public Hashtable ControlIDHtmls + { + get { return _controlIDHtmls; } + } + + public void SetControlIDs (Hashtable controlHtmls) + { + _controlIDHtmls.Clear(); + foreach (Control con in controlHtmls.Keys) + _controlIDHtmls.Add (con.ClientID, (string)controlHtmls[con]); + } + + public void Save(string panelUniqueID) + { + HttpContext.Current.Session[GetPageKey(panelUniqueID)] = this; + } + + public ControlCollectionState() + { + _controlIDHtmls = new Hashtable(); + } + } + #endregion + #region Private Class ExtendedTextWriter /// <summary> |