From: Dion O. <dol...@us...> - 2006-01-23 01:28:52
|
Update of /cvsroot/magicajax/magicajax/Core/UI/Controls In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27153/magicajax/Core/UI/Controls Modified Files: AjaxHtmlForm.cs AjaxPanel.cs Log Message: Fix for .NET 1,1 Stylesheet updates on callback Index: AjaxHtmlForm.cs =================================================================== RCS file: /cvsroot/magicajax/magicajax/Core/UI/Controls/AjaxHtmlForm.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** AjaxHtmlForm.cs 20 Jan 2006 01:35:56 -0000 1.1 --- AjaxHtmlForm.cs 23 Jan 2006 01:28:41 -0000 1.2 *************** *** 1,216 **** ! 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; ! using System.Collections.Specialized; ! using System.Text.RegularExpressions; ! using System.Text; ! namespace MagicAjax.UI.Controls ! { ! /// <summary> ! /// TODO. As you can see, this code is not yet finished ! /// </summary> ! public class AjaxHtmlForm : System.Web.UI.HtmlControls.HtmlForm ! { ! public AjaxHtmlForm() { } ! private ArrayList _previousScriptFPs = new ArrayList(); ! private ArrayList _currentScriptFPs = new ArrayList(); ! protected override void RenderChildren(HtmlTextWriter writer) ! { ! if (MagicAjaxContext.Current.IsAjaxCall) ! { ! // Get the fingerprints of the scripts sent previous time ! if (Page.Request.Form["__MAGICAJAX_SCRIPT_FINGERPRINTS"] != null) ! { ! _previousScriptFPs.AddRange(Page.Request.Form["__MAGICAJAX_SCRIPT_FINGERPRINTS"].Split(';')); ! } ! ReflectHiddenFields(); ! //ReflectWebFormScript(); ?? ! ReflectClientScriptBlocks(); ! } ! else ! { ! SetAllScriptFingerPrints(); ! ! Page.ClientScript.RegisterHiddenField("__MAGICAJAX_SCRIPT_FINGERPRINTS", ! string.Join(";", (string[])_currentScriptFPs.ToArray(typeof(string)))); ! } ! base.RenderChildren(writer); ! ! if (MagicAjaxContext.Current.IsAjaxCall) ! { ! ReflectArrayDeclares(); ! //ReflectExpandoAttribute(); !! ! ReflectClientStartupScripts(); ! //set __MAGICAJAX_SCRIPT_FINGERPRINTS field ! string newFingerprints = string.Join(";", (string[])_currentScriptFPs.ToArray(typeof(string))); ! ! if (Page.Request.Form["__MAGICAJAX_SCRIPT_FINGERPRINTS"] != newFingerprints) ! { ! AjaxCallHelper.WriteSetFieldScript("__MAGICAJAX_SCRIPT_FINGERPRINTS", ! string.Join(";", (string[])_currentScriptFPs.ToArray(typeof(string)))); ! } ! } ! } ! ! private void ReflectClientScriptBlocks() ! { ! IDictionary regScripts = (IDictionary)(Util.GetPrivateField(Page.ClientScript, typeof(ClientScriptManager), "_registeredClientScriptBlocks")); ! SetScriptDictionaryFingerPrints(regScripts, true); ! //TODO: _registeredOnSubmitStatements !! ! } ! private void ReflectClientStartupScripts() ! { ! IDictionary regScripts = (IDictionary)(Util.GetPrivateField(Page.ClientScript, typeof(ClientScriptManager), "_registeredClientStartupScripts")); ! SetScriptDictionaryFingerPrints(regScripts, true); ! } ! ! private void ReflectArrayDeclares() ! { ! IDictionary regArrays = (IDictionary)(Util.GetPrivateField(Page.ClientScript, typeof(ClientScriptManager), "_registeredArrayDeclares")); ! SetArrayDictionaryFingerPrints(regArrays, true); ! } ! ! private void SetAllScriptFingerPrints() ! { ! IDictionary regScripts; ! ! //ReflectWebFormScript(); ?? ! regScripts = (IDictionary)(Util.GetPrivateField(Page.ClientScript, typeof(ClientScriptManager), "_registeredClientScriptBlocks")); ! SetScriptDictionaryFingerPrints(regScripts, false); ! IDictionary regArrays = (IDictionary)(Util.GetPrivateField(Page.ClientScript, typeof(ClientScriptManager), "_registeredArrayDeclares")); ! SetArrayDictionaryFingerPrints(regArrays, false); ! ! //ReflectExpandoAttribute(); !! ! regScripts = (IDictionary)(Util.GetPrivateField(Page.ClientScript, typeof(ClientScriptManager), "_registeredClientStartupScripts")); ! SetScriptDictionaryFingerPrints(regScripts, false); ! } ! private void SetArrayDictionaryFingerPrints(IDictionary regArrays, bool reflectScripts) ! { ! if (regArrays != null) ! { ! foreach (DictionaryEntry fld in regArrays) ! { ! StringBuilder sb = new StringBuilder(); ! string key = (string)fld.Key; ! ArrayList values = (ArrayList)fld.Value; ! sb.Append("var "); ! sb.Append(key); ! sb.Append(" = new Array("); ! for (int i = 0; i<values.Count; i++) ! { ! if (i >0) ! sb.Append(", "); ! sb.Append((string)values[i]); ! } ! sb.Append(");"); ! string script = sb.ToString(); ! string scriptFP = Util.GetFingerprint(script); ! _currentScriptFPs.Add(scriptFP); ! ! if (reflectScripts && !_previousScriptFPs.Contains(scriptFP)) ! { ! NameValueCollection scriptAttributes = new NameValueCollection(); ! scriptAttributes.Add("type", "text/javascript"); ! AjaxCallHelper.WriteAddScriptElementScript(script, scriptAttributes); ! } ! } ! } ! } ! private void SetScriptDictionaryFingerPrints(IDictionary regScripts, bool reflectScripts) ! { ! if (regScripts != null) ! { ! foreach (DictionaryEntry fld in regScripts) ! { ! int keyHash = fld.Key.GetHashCode(); ! string script = (string)fld.Value; ! string scriptFP = Util.GetFingerprint(string.Format("{0}:{1}", keyHash, script)); ! _currentScriptFPs.Add(scriptFP); ! if (reflectScripts && !_previousScriptFPs.Contains(scriptFP)) ! { ! if (!script.StartsWith("\r\n<script")) ! { ! NameValueCollection scriptAttributes = new NameValueCollection(); ! scriptAttributes.Add("type", "text/javascript"); ! AjaxCallHelper.WriteAddScriptElementScript(script, scriptAttributes); ! } ! else ! { ! Match match = Util.ScriptTagsRegEx.Match(script); ! if (match.Success) ! { ! CaptureCollection attrnamesOption = match.Groups["attrname"].Captures; ! CaptureCollection attrvaluesOption = match.Groups["attrvalue"].Captures; ! NameValueCollection scriptAttributes = new NameValueCollection(); ! for (int j = 0; j < attrnamesOption.Count; j++) ! { ! scriptAttributes.Add(attrnamesOption[j].Value, attrvaluesOption[j].Value); ! } ! string scriptText = match.Groups["script"].Value; ! AjaxCallHelper.WriteAddScriptElementScript(scriptText, scriptAttributes); ! } ! } ! } ! } ! } ! } ! /// <summary> ! /// Reflects hidden fields back to client ! /// </summary> ! /// <param name="page"></param> ! private void ReflectHiddenFields() ! { ! IDictionary regFields = (IDictionary)(Util.GetPrivateField(Page.ClientScript, typeof(ClientScriptManager), "_registeredHiddenFields")); ! // for 1.1: IDictionary regFields = (IDictionary)(Util.GetPrivateField(Page, typeof(Page), "_registeredHiddenFields")); ! if (regFields != null) ! { ! foreach (DictionaryEntry fld in regFields) ! { ! string key = (string)fld.Key; ! string value = (string)fld.Value; ! // For now, don't reflect system hidden fields (starting with "__"). ! // TODO: find out why __VIEWSTATE is never registered...? ! if (key != null && !key.StartsWith("__")) ! { ! if (Page.Request.Form[key] == null) ! AjaxCallHelper.WriteAddHiddenFieldScript(key, value); ! else ! AjaxCallHelper.WriteSetFieldScript(key, value); ! } ! } ! } ! } ! } ! } \ No newline at end of file --- 1,356 ---- ! //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.HtmlControls; ! //using System.Collections; ! //using System.Collections.Specialized; ! //using System.Text.RegularExpressions; ! //using System.Text; ! //using System.Globalization; ! //namespace MagicAjax.UI.Controls ! //{ ! // /// <summary> ! // /// This special Ajax form is injected into the Page object on Init. ! // /// It handles reflecting scripts, stylesheet and hidden fields that ! // /// were added or changed on an Ajax callback. ! // /// </summary> ! // public class AjaxHtmlForm : System.Web.UI.HtmlControls.HtmlForm ! // { ! // public AjaxHtmlForm() {} ! // /// <summary> List of previous fingerprints of all script blocks </summary> ! // private ArrayList _previousScriptFPs = new ArrayList(); ! // /// <summary> List of current fingerprints of all script blocks </summary> ! // private ArrayList _currentScriptFPs = new ArrayList(); ! // protected override void RenderChildren(HtmlTextWriter writer) ! // { ! //#if NET_2_0 ! // // For ASP.NET 2.0, reflect the head-tag's stylesheet- or ! // // title-changes back to client ! // HandleHeader(MagicAjaxContext.Current.IsAjaxCall); ! //#endif ! // if (MagicAjaxContext.Current.IsAjaxCall) ! // { ! // // Get the fingerprints of the scripts sent previous time ! // if (Page.Request.Form["__MAGICAJAX_SCRIPT_FINGERPRINTS"] != null) ! // { ! // _previousScriptFPs.AddRange(Page.Request.Form["__MAGICAJAX_SCRIPT_FINGERPRINTS"].Split(';')); ! // } ! // HandleHiddenFields(); ! // HandleClientScriptBlocks(true); ! // HandleOnSubmitStatements(true); ! // } ! // else ! // { ! // // Not in Ajax call, so create fingerprints of all script blocks ! // HandleClientScriptBlocks(false); ! // HandleArrayDeclares(false); ! // HandleClientStartupScripts(false); ! // HandleOnSubmitStatements(false); ! // // Store scriptblock fingerprints in hidden field ! // Page.RegisterHiddenField("__MAGICAJAX_SCRIPT_FINGERPRINTS", ! // string.Join(";", (string[])_currentScriptFPs.ToArray(typeof(string)))); ! // } ! // // Original render method ! // base.RenderChildren(writer); ! // // Reflect added startup-scripts and arrays AFTER reflecting the controls HTML ! // if (MagicAjaxContext.Current.IsAjaxCall) ! // { ! // HandleArrayDeclares(true); ! // HandleClientStartupScripts(true); ! // // Store scriptblock fingerprints in hidden field ! // string allScriptFPs = string.Join(";", (string[])_currentScriptFPs.ToArray(typeof(string))); ! // if (Page.Request.Form["__MAGICAJAX_SCRIPT_FINGERPRINTS"] != allScriptFPs) ! // AjaxCallHelper.WriteSetFieldScript("__MAGICAJAX_SCRIPT_FINGERPRINTS", allScriptFPs); ! // } ! // } ! // /// <summary> ! // /// Reflects registered Hidden fields if added/changed on callback ! // /// </summary> ! // /// <param name="page"></param> ! // private void HandleHiddenFields() ! // { ! // IDictionary regFields = GetPageHiddenDictionary("_registeredHiddenFields"); ! // if (regFields != null) ! // { ! // foreach (DictionaryEntry fld in regFields) ! // { ! // string key = (string)fld.Key; ! // string value = (string)fld.Value; ! // // For now, don't reflect system hidden fields (starting with "__"). ! // // TODO: find out why __VIEWSTATE is never registered...? ! // if (key != null && !key.StartsWith("__") && value != Page.Request.Form[key]) ! // { ! // if (Page.Request.Form[key] == null) ! // AjaxCallHelper.WriteAddHiddenFieldScript(key, value); ! // else ! // AjaxCallHelper.WriteSetFieldScript(key, value); ! // } ! // } ! // } ! // } ! ! // /// <summary> ! // /// Handle registered ClientScriptBlocks to see if some where added/changed on callback/postback ! // /// </summary> ! // private void HandleClientScriptBlocks(bool reflectToClient) ! // { ! // IDictionary regScripts = GetPageHiddenDictionary("_registeredClientScriptBlocks"); ! // SetScriptDictionaryFingerPrints(regScripts, reflectToClient); ! // } ! ! // /// <summary> ! // /// Handle registered OnSubmitStatements to see if some where added/changed on callback/postback ! // /// </summary> ! // /// <param name="reflectToClient"></param> ! // private void HandleOnSubmitStatements(bool reflectToClient) ! // { ! // IDictionary regScripts = GetPageHiddenDictionary("_registeredOnSubmitStatements"); ! // if (regScripts != null) ! // { ! // ListDictionary onSubmitStatementItem = new ListDictionary(); ! // StringBuilder onSubmitStringBuilder = new StringBuilder(); ! // onSubmitStringBuilder.Append("\r\n<script type=\"text/javascript\">\r\n<!--\r\n"); ! // onSubmitStringBuilder.Append("function WebForm_OnSubmit() {\r\n"); ! ! // foreach (string value in regScripts.Values) ! // onSubmitStringBuilder.Append(value); ! ! // onSubmitStringBuilder.Append("\r\nreturn true;\r\n}"); ! // onSubmitStringBuilder.Append("// -->\r\n</script>\r\n"); ! ! // onSubmitStatementItem.Add("_registeredOnSubmitStatements", onSubmitStringBuilder.ToString()); ! ! // SetScriptDictionaryFingerPrints(onSubmitStatementItem, reflectToClient); ! // } ! // } ! ! // /// <summary> ! // /// Handle registered ClientStartupScripts to see if some where added/changed on callback/postback ! // /// </summary> ! // /// <param name="reflectToClient"></param> ! // private void HandleClientStartupScripts(bool reflectToClient) ! // { ! // IDictionary regScripts = GetPageHiddenDictionary("_registeredClientStartupScripts"); ! // SetScriptDictionaryFingerPrints(regScripts, reflectToClient); ! // } ! ! // /// <summary> ! // /// Handle declared client-Arrays to see if some where added/changed on callback/postback ! // /// </summary> ! // /// <param name="reflectToClient"></param> ! // private void HandleArrayDeclares(bool reflectToClient) ! // { ! // IDictionary regArrays = GetPageHiddenDictionary("_registeredArrayDeclares"); ! // SetArrayDictionaryFingerPrints(regArrays, reflectToClient); ! // } ! // //private void SetAllScriptFingerPrints() ! // //{ ! // // IDictionary regDictionary = GetPageHiddenDictionary("_registeredClientScriptBlocks"); ! // // SetScriptDictionaryFingerPrints(regDictionary, false); ! // // regDictionary = GetPageHiddenDictionary("_registeredArrayDeclares"); ! // // SetArrayDictionaryFingerPrints(regDictionary, false); ! ! // // regDictionary = GetPageHiddenDictionary("_registeredClientStartupScripts"); ! // // SetScriptDictionaryFingerPrints(regDictionary, false); ! // //} ! ! // /// <summary> ! // /// Sets fingerprints for declared Arrays. ! // /// When reflectToClient is set to true, reflects added/changed Array-declarations ! // /// back to the client. ! // /// </summary> ! // /// <param name="regArrays"></param> ! // /// <param name="reflectToClient"></param> ! // private void SetArrayDictionaryFingerPrints(IDictionary regArrays, bool reflectToClient) ! // { ! // if (regArrays != null) ! // { ! // foreach (DictionaryEntry fld in regArrays) ! // { ! // StringBuilder sb = new StringBuilder(); ! ! // string key = (string)fld.Key; ! // ArrayList values = (ArrayList)fld.Value; ! // sb.Append("var "); ! // sb.Append(key); ! // sb.Append(" = new Array("); ! // for (int i = 0; i<values.Count; i++) ! // { ! // if (i >0) ! // sb.Append(", "); ! // sb.Append((string)values[i]); ! // } ! // sb.Append(");"); ! // string script = sb.ToString(); ! // string scriptFP = Util.GetFingerprint(script); ! // _currentScriptFPs.Add(scriptFP); ! // if (reflectToClient && !_previousScriptFPs.Contains(scriptFP)) ! // { ! // NameValueCollection scriptAttributes = new NameValueCollection(); ! // scriptAttributes.Add("type", "text/javascript"); ! // AjaxCallHelper.WriteAddScriptElementScript(script, scriptAttributes); ! // } ! // } ! // } ! // } ! ! // /// <summary> ! // /// Sets fingerprints for registered Script blocks. ! // /// When reflectToClient is set to true, reflects added/changed scripts ! // /// back to the client. ! // /// </summary> ! // /// <param name="regScripts"></param> ! // /// <param name="reflectToClient"></param> ! // private void SetScriptDictionaryFingerPrints(IDictionary regScripts, bool reflectToClient) ! // { ! // if (regScripts != null) ! // { ! // foreach (DictionaryEntry fld in regScripts) ! // { ! // int keyHash = fld.Key.GetHashCode(); ! // string script = (string)fld.Value; ! // string scriptFP = Util.GetFingerprint(string.Format("{0}:{1}", keyHash, script)); ! // _currentScriptFPs.Add(scriptFP); ! // if (reflectToClient && !_previousScriptFPs.Contains(scriptFP)) ! // { ! // if (script.IndexOf("<script") == -1) ! // { ! // NameValueCollection scriptAttributes = new NameValueCollection(); ! // scriptAttributes.Add("type", "text/javascript"); ! // AjaxCallHelper.WriteAddScriptElementScript(script, scriptAttributes); ! // } ! // else ! // { ! // Match match = Util.ScriptTagsRegEx.Match(script); ! // if (match.Success) ! // { ! // CaptureCollection attrnamesOption = match.Groups["attrname"].Captures; ! // CaptureCollection attrvaluesOption = match.Groups["attrvalue"].Captures; ! // NameValueCollection scriptAttributes = new NameValueCollection(); ! // for (int j = 0; j < attrnamesOption.Count; j++) ! // { ! // scriptAttributes.Add(attrnamesOption[j].Value, attrvaluesOption[j].Value); ! // } ! // string scriptText = match.Groups["script"].Value; ! // AjaxCallHelper.WriteAddScriptElementScript(scriptText, scriptAttributes); ! // } ! // } ! // } ! // } ! // } ! // } ! // /// <summary> ! // /// Uses reflection to get the private dictionary field 'fieldName'. ! // /// Uses Page.ClientScript for .NET 2.0, and the Page-object for .NET 1.1 ! // /// </summary> ! // /// <param name="fieldName"></param> ! // /// <returns></returns> ! // private IDictionary GetPageHiddenDictionary(string fieldName) ! // { ! //#if NET_2_0 ! // return (IDictionary)(Util.GetPrivateField(Page.ClientScript, typeof(ClientScriptManager), fieldName)); ! //#else ! // return (IDictionary)(Util.GetPrivateField(Page, typeof(Page), fieldName)); ! //#endif ! // } ! //#if NET_2_0 ! // /// <summary> ! // /// Handles style,title and link tags (inside HEAD) that were added/changed during callback. ! // /// For first page-request, only stores hidden field containing fingerprints ! // /// of the tags inside the html head section. ! // /// When reflectToClient is true, also reflects the changed tags inside head. ! // /// </summary> ! // /// <param name="reflectToClient"></param> ! // private void HandleHeader(bool reflectToClient) ! // { ! // if (Page.Header != null) ! // { ! // ArrayList _previousHeaderFPs = new ArrayList(); ! // ArrayList _currentHeaderFPs = new ArrayList(); ! ! // // Get the fingerprints of the head-tags sent previous time ! // if (Page.Request.Form["__MAGICAJAX_HEAD_FINGERPRINTS"] != null) ! // { ! // _previousHeaderFPs.AddRange(Page.Request.Form["__MAGICAJAX_HEAD_FINGERPRINTS"].Split(';')); ! // } ! ! // StringBuilder sbHeader = new StringBuilder(); ! // HtmlTextWriter headerWriter = new HtmlTextWriter(new System.IO.StringWriter(sbHeader)); ! // Page.Header.RenderControl(headerWriter); ! ! // //strip <header> tag ! // string header = sbHeader.ToString(); ! ! // MatchCollection matches = Util.HeaderTagsRegEx.Matches(header); ! // for (int i=0; i<matches.Count; i++) ! // { ! // Match match = matches[i]; ! ! // string matchFP = Util.GetFingerprint(match.Value); ! // _currentHeaderFPs.Add(matchFP); ! ! // if (reflectToClient && !_previousHeaderFPs.Contains(matchFP)) ! // { ! // string tagName = match.Groups["tag"].Value.ToLower(CultureInfo.InvariantCulture); ! // string innerText = match.Groups["inner"].Success ? match.Groups["inner"].Value.ToLower(CultureInfo.InvariantCulture) : String.Empty; ! ! // NameValueCollection attrNameValues = new NameValueCollection(); ! ! // if (tagName == "link") ! // { ! // CaptureCollection attributes = match.Groups["attribute"].Captures; ! // CaptureCollection attrnames = match.Groups["attrname"].Captures; ! // CaptureCollection attrvalues = match.Groups["attrvalue"].Captures; ! ! // for (int j=0; j < attributes.Count; j++) ! // { ! // string attrname = attrnames[j].Value.ToLower(System.Globalization.CultureInfo.InvariantCulture); ! // attrNameValues.Add (attrname, attrvalues[j].Value); ! // } ! // } ! ! // AjaxCallHelper.WriteAddHeaderElementScript(tagName, innerText, attrNameValues); ! // } ! // } ! ! // string allHeadFPs = string.Join(";", (string[])_currentHeaderFPs.ToArray(typeof(string))); ! ! // // Store head-tag fingerprints in hidden field ! // if (reflectToClient && Page.Request.Form["__MAGICAJAX_HEAD_FINGERPRINTS"] != allHeadFPs) ! // AjaxCallHelper.WriteSetFieldScript("__MAGICAJAX_HEAD_FINGERPRINTS", allHeadFPs); ! // else if (!reflectToClient) ! // Page.RegisterHiddenField("__MAGICAJAX_HEAD_FINGERPRINTS", allHeadFPs); ! // } ! // } ! //#endif ! // } ! //} \ No newline at end of file Index: AjaxPanel.cs =================================================================== RCS file: /cvsroot/magicajax/magicajax/Core/UI/Controls/AjaxPanel.cs,v retrieving revision 1.50 retrieving revision 1.51 diff -C2 -d -r1.50 -r1.51 *** AjaxPanel.cs 20 Jan 2006 01:35:56 -0000 1.50 --- AjaxPanel.cs 23 Jan 2006 01:28:41 -0000 1.51 *************** *** 273,276 **** --- 273,278 ---- { Page.RegisterHiddenField (ControlCollectionState.GetControlFingerprintsField(this.ClientID), String.Empty); + Page.RegisterHiddenField("__MAGICAJAX_SCRIPT_FINGERPRINTS", String.Empty); + Page.RegisterHiddenField("__MAGICAJAX_HEAD_FINGERPRINTS", String.Empty); } *************** *** 286,292 **** --- 288,330 ---- DisableClientValidators(); } + + if (Context != null) + { + if (!Context.Items.Contains("__MAGICAJAX_FIRST_PANELID")) + Context.Items.Add("__MAGICAJAX_FIRST_PANELID", this.ClientID); + + if (!Context.Items.Contains("__MAGICAJAX_LAST_PANELID")) + Context.Items.Add("__MAGICAJAX_LAST_PANELID", this.ClientID); + else + Context.Items["__MAGICAJAX_LAST_PANELID"] = this.ClientID; + } } #endregion + protected override void OnPreRender(EventArgs e) + { + base.OnPreRender(e); + + #region Reflect hidden fields + scripts + if (MagicAjaxContext.Current.IsAjaxCall && (string)Context.Items["__MAGICAJAX_FIRST_PANELID"] == this.ClientID) + { + #if NET_2_0 + // For ASP.NET 2.0, reflect the head-tag's stylesheet- or + // title-changes back to client + HandleHeader(true, null); + #endif + // Get the fingerprints of the scripts sent previous time + if (Page.Request.Form["__MAGICAJAX_SCRIPT_FINGERPRINTS"] != null) + { + _previousScriptFPs.AddRange(Page.Request.Form["__MAGICAJAX_SCRIPT_FINGERPRINTS"].Split(';')); + } + + HandleHiddenFields(); + HandleClientScriptBlocks(true); + HandleOnSubmitStatements(true); + } + #endregion + } + #region override OnAjaxCallEnd protected override void OnAjaxCallEnd(EventArgs e) *************** *** 350,353 **** --- 388,422 ---- #region override RenderChildren + + /// <summary> List of previous fingerprints of all script blocks </summary> + private ArrayList _previousScriptFPs + { + get + { + if (!Context.Items.Contains("_previousScriptFPs")) + Context.Items.Add("_previousScriptFPs", new ArrayList()); + return (ArrayList)Context.Items["_previousScriptFPs"]; + } + set + { + Context.Items["_previousScriptFPs"] = value; + } + } + + /// <summary> List of current fingerprints of all script blocks </summary> + private ArrayList _currentScriptFPs + { + get + { + if (!Context.Items.Contains("_currentScriptFPs")) + Context.Items.Add("_currentScriptFPs", new ArrayList()); + return (ArrayList)Context.Items["_currentScriptFPs"]; + } + set + { + Context.Items["_currentScriptFPs"] = value; + } + } + /// <summary> /// Does a normal rendering of the child controls. *************** *** 360,370 **** protected override void RenderChildren(HtmlTextWriter writer) { ! if (MagicAjaxContext == null) ! { ! // It's in VS Designer, do the default render ! base.RenderChildren(writer); ! return; ! } System.Text.StringBuilder sbFull = new System.Text.StringBuilder(); System.Text.StringBuilder sb = new System.Text.StringBuilder(); --- 429,460 ---- protected override void RenderChildren(HtmlTextWriter writer) { ! if (MagicAjaxContext == null) ! { ! // It's in VS Designer, do the default render ! base.RenderChildren(writer); ! return; ! } ! ! #region Reflect hidden fields + scripts ! if ((string)Context.Items["__MAGICAJAX_FIRST_PANELID"] == this.ClientID) ! { ! #if NET_2_0 ! // For ASP.NET 2.0, reflect the head-tag's stylesheet- or ! // title-changes back to client ! HandleHeader(false, writer); ! #endif ! // Not in Ajax call, so create fingerprints of all script blocks ! HandleClientScriptBlocks(false); ! HandleArrayDeclares(false); ! HandleClientStartupScripts(false); ! HandleOnSubmitStatements(false); + // Store scriptblock fingerprints in hidden field + writer.WriteLine( + string.Format("<script type='text/javascript'>AJAXCbo.SetField('__MAGICAJAX_SCRIPT_FINGERPRINTS','{0}');</script>", + string.Join(";", (string[])_currentScriptFPs.ToArray(typeof(string))))); + } + #endregion + System.Text.StringBuilder sbFull = new System.Text.StringBuilder(); System.Text.StringBuilder sb = new System.Text.StringBuilder(); *************** *** 899,902 **** --- 989,1007 ---- if ( IsPageNoStoreMode ) SaveControlState(); + + if ((string)Context.Items["__MAGICAJAX_LAST_PANELID"] == this.ClientID) + { + // Reflect added startup-scripts and arrays AFTER reflecting the controls HTML + if (MagicAjaxContext.Current.IsAjaxCall) + { + HandleArrayDeclares(true); + HandleClientStartupScripts(true); + + // Store scriptblock fingerprints in hidden field + string allScriptFPs = string.Join(";", (string[])_currentScriptFPs.ToArray(typeof(string))); + if (Page.Request.Form["__MAGICAJAX_SCRIPT_FINGERPRINTS"] != allScriptFPs) + AjaxCallHelper.WriteSetFieldScript("__MAGICAJAX_SCRIPT_FINGERPRINTS", allScriptFPs); + } + } } #endregion *************** *** 1510,1513 **** --- 1615,1885 ---- } #endregion + + #region temp + /// <summary> + /// Reflects registered Hidden fields if added/changed on callback + /// </summary> + /// <param name="page"></param> + private void HandleHiddenFields() + { + IDictionary regFields = GetPageHiddenDictionary("_registeredHiddenFields"); + if (regFields != null) + { + foreach (DictionaryEntry fld in regFields) + { + string key = (string)fld.Key; + string value = (string)fld.Value; + // For now, don't reflect system hidden fields (starting with "__"). + // TODO: find out why __VIEWSTATE is never registered...? + if (key != null && !key.StartsWith("__") && value != Page.Request.Form[key]) + { + if (Page.Request.Form[key] == null) + AjaxCallHelper.WriteAddHiddenFieldScript(key, value); + else + AjaxCallHelper.WriteSetFieldScript(key, value); + } + } + } + } + + /// <summary> + /// Handle registered ClientScriptBlocks to see if some where added/changed on callback/postback + /// </summary> + private void HandleClientScriptBlocks(bool reflectToClient) + { + IDictionary regScripts = GetPageHiddenDictionary("_registeredClientScriptBlocks"); + SetScriptDictionaryFingerPrints(regScripts, reflectToClient); + } + + /// <summary> + /// Handle registered OnSubmitStatements to see if some where added/changed on callback/postback + /// </summary> + /// <param name="reflectToClient"></param> + private void HandleOnSubmitStatements(bool reflectToClient) + { + IDictionary regScripts = GetPageHiddenDictionary("_registeredOnSubmitStatements"); + if (regScripts != null) + { + ListDictionary onSubmitStatementItem = new ListDictionary(); + StringBuilder onSubmitStringBuilder = new StringBuilder(); + onSubmitStringBuilder.Append("\r\n<script type=\"text/javascript\">\r\n<!--\r\n"); + onSubmitStringBuilder.Append("function WebForm_OnSubmit() {\r\n"); + + foreach (string value in regScripts.Values) + onSubmitStringBuilder.Append(value); + + onSubmitStringBuilder.Append("\r\nreturn true;\r\n}"); + onSubmitStringBuilder.Append("// -->\r\n</script>\r\n"); + + onSubmitStatementItem.Add("_registeredOnSubmitStatements", onSubmitStringBuilder.ToString()); + + SetScriptDictionaryFingerPrints(onSubmitStatementItem, reflectToClient); + } + } + + /// <summary> + /// Handle registered ClientStartupScripts to see if some where added/changed on callback/postback + /// </summary> + /// <param name="reflectToClient"></param> + private void HandleClientStartupScripts(bool reflectToClient) + { + IDictionary regScripts = GetPageHiddenDictionary("_registeredClientStartupScripts"); + SetScriptDictionaryFingerPrints(regScripts, reflectToClient); + } + + /// <summary> + /// Handle declared client-Arrays to see if some where added/changed on callback/postback + /// </summary> + /// <param name="reflectToClient"></param> + private void HandleArrayDeclares(bool reflectToClient) + { + IDictionary regArrays = GetPageHiddenDictionary("_registeredArrayDeclares"); + SetArrayDictionaryFingerPrints(regArrays, reflectToClient); + } + + /// <summary> + /// Sets fingerprints for declared Arrays. + /// When reflectToClient is set to true, reflects added/changed Array-declarations + /// back to the client. + /// </summary> + /// <param name="regArrays"></param> + /// <param name="reflectToClient"></param> + private void SetArrayDictionaryFingerPrints(IDictionary regArrays, bool reflectToClient) + { + if (regArrays != null) + { + foreach (DictionaryEntry fld in regArrays) + { + StringBuilder sb = new StringBuilder(); + + string key = (string)fld.Key; + ArrayList values = (ArrayList)fld.Value; + + sb.Append("var "); + sb.Append(key); + sb.Append(" = new Array("); + + for (int i = 0; i<values.Count; i++) + { + if (i >0) + sb.Append(", "); + sb.Append((string)values[i]); + } + sb.Append(");"); + + string script = sb.ToString(); + string scriptFP = Util.GetFingerprint(script); + + _currentScriptFPs.Add(scriptFP); + + if (reflectToClient && !_previousScriptFPs.Contains(scriptFP)) + { + NameValueCollection scriptAttributes = new NameValueCollection(); + scriptAttributes.Add("type", "text/javascript"); + AjaxCallHelper.WriteAddScriptElementScript(script, scriptAttributes); + } + } + } + } + + /// <summary> + /// Sets fingerprints for registered Script blocks. + /// When reflectToClient is set to true, reflects added/changed scripts + /// back to the client. + /// </summary> + /// <param name="regScripts"></param> + /// <param name="reflectToClient"></param> + private void SetScriptDictionaryFingerPrints(IDictionary regScripts, bool reflectToClient) + { + if (regScripts != null) + { + foreach (DictionaryEntry fld in regScripts) + { + int keyHash = fld.Key.GetHashCode(); + string script = (string)fld.Value; + string scriptFP = Util.GetFingerprint(string.Format("{0}:{1}", keyHash, script)); + + _currentScriptFPs.Add(scriptFP); + + if (reflectToClient && !_previousScriptFPs.Contains(scriptFP)) + { + if (script.IndexOf("<script") == -1) + { + NameValueCollection scriptAttributes = new NameValueCollection(); + scriptAttributes.Add("type", "text/javascript"); + AjaxCallHelper.WriteAddScriptElementScript(script, scriptAttributes); + } + else + { + Match match = Util.ScriptTagsRegEx.Match(script); + if (match.Success) + { + CaptureCollection attrnamesOption = match.Groups["attrname"].Captures; + CaptureCollection attrvaluesOption = match.Groups["attrvalue"].Captures; + + NameValueCollection scriptAttributes = new NameValueCollection(); + for (int j = 0; j < attrnamesOption.Count; j++) + { + scriptAttributes.Add(attrnamesOption[j].Value, attrvaluesOption[j].Value); + } + + string scriptText = match.Groups["script"].Value; + + AjaxCallHelper.WriteAddScriptElementScript(scriptText, scriptAttributes); + } + } + } + } + } + } + + /// <summary> + /// Uses reflection to get the private dictionary field 'fieldName'. + /// Uses Page.ClientScript for .NET 2.0, and the Page-object for .NET 1.1 + /// </summary> + /// <param name="fieldName"></param> + /// <returns></returns> + private IDictionary GetPageHiddenDictionary(string fieldName) + { + #if NET_2_0 + return (IDictionary)(Util.GetPrivateField(Page.ClientScript, typeof(ClientScriptManager), fieldName)); + #else + return (IDictionary)(Util.GetPrivateField(Page, typeof(Page), fieldName)); + #endif + } + + #if NET_2_0 + /// <summary> + /// Handles style,title and link tags (inside HEAD) that were added/changed during callback. + /// For first page-request, only stores hidden field containing fingerprints + /// of the tags inside the html head section. + /// When reflectToClient is true, also reflects the changed tags inside head. + /// </summary> + /// <param name="reflectToClient"></param> + private void HandleHeader(bool reflectToClient, HtmlTextWriter writer) + { + if (Page.Header != null) + { + ArrayList _previousHeaderFPs = new ArrayList(); + ArrayList _currentHeaderFPs = new ArrayList(); + + // Get the fingerprints of the head-tags sent previous time + if (Page.Request.Form["__MAGICAJAX_HEAD_FINGERPRINTS"] != null) + { + _previousHeaderFPs.AddRange(Page.Request.Form["__MAGICAJAX_HEAD_FINGERPRINTS"].Split(';')); + } + + StringBuilder sbHeader = new StringBuilder(); + HtmlTextWriter headerWriter = new HtmlTextWriter(new System.IO.StringWriter(sbHeader)); + Page.Header.RenderControl(headerWriter); + + //strip <header> tag + string header = sbHeader.ToString(); + + MatchCollection matches = Util.HeaderTagsRegEx.Matches(header); + for (int i=0; i<matches.Count; i++) + { + Match match = matches[i]; + + string matchFP = Util.GetFingerprint(match.Value); + _currentHeaderFPs.Add(matchFP); + + if (reflectToClient && !_previousHeaderFPs.Contains(matchFP)) + { + string tagName = match.Groups["tag"].Value.ToLower(CultureInfo.InvariantCulture); + string innerText = match.Groups["inner"].Success ? match.Groups["inner"].Value.ToLower(CultureInfo.InvariantCulture) : String.Empty; + + NameValueCollection attrNameValues = new NameValueCollection(); + + if (tagName == "link") + { + CaptureCollection attributes = match.Groups["attribute"].Captures; + CaptureCollection attrnames = match.Groups["attrname"].Captures; + CaptureCollection attrvalues = match.Groups["attrvalue"].Captures; + + for (int j=0; j < attributes.Count; j++) + { + string attrname = attrnames[j].Value.ToLower(System.Globalization.CultureInfo.InvariantCulture); + attrNameValues.Add (attrname, attrvalues[j].Value); + } + } + + AjaxCallHelper.WriteAddHeaderElementScript(tagName, innerText, attrNameValues); + } + } + + string allHeadFPs = string.Join(";", (string[])_currentHeaderFPs.ToArray(typeof(string))); + + // Store head-tag fingerprints in hidden field + if (reflectToClient && Page.Request.Form["__MAGICAJAX_HEAD_FINGERPRINTS"] != allHeadFPs) + AjaxCallHelper.WriteSetFieldScript("__MAGICAJAX_HEAD_FINGERPRINTS", allHeadFPs); + else if (!reflectToClient) + writer.WriteLine( + string.Format("<script type='text/javascript'>AJAXCbo.SetField('__MAGICAJAX_HEAD_FINGERPRINTS','{0}');</script>", allHeadFPs)); + //Page.RegisterHiddenField("__MAGICAJAX_HEAD_FINGERPRINTS", allHeadFPs); + } + } + #endif + #endregion } } \ No newline at end of file |