| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456 |
- //
- // System.Web.UI.ClientScriptManager.cs
- //
- // Authors:
- // Duncan Mak ([email protected])
- // Gonzalo Paniagua ([email protected])
- // Andreas Nahr ([email protected])
- // Lluis Sanchez ([email protected])
- //
- // (C) 2002,2003 Ximian, Inc. (http://www.ximian.com)
- // (c) 2003 Novell, Inc. (http://www.novell.com)
- //
- //
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the
- // "Software"), to deal in the Software without restriction, including
- // without limitation the rights to use, copy, modify, merge, publish,
- // distribute, sublicense, and/or sell copies of the Software, and to
- // permit persons to whom the Software is furnished to do so, subject to
- // the following conditions:
- //
- // The above copyright notice and this permission notice shall be
- // included in all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- //
- using System;
- using System.Collections;
- using System.Text;
- namespace System.Web.UI
- {
- #if NET_2_0
- public sealed
- #else
- internal
- #endif
- class ClientScriptManager
- {
- Hashtable registeredArrayDeclares;
- ScriptEntry clientScriptBlocks;
- ScriptEntry startupScriptBlocks;
- Hashtable hiddenFields;
- ScriptEntry submitStatements;
- ScriptEntry scriptIncludes;
- Page page;
-
- internal ClientScriptManager (Page page)
- {
- this.page = page;
- }
- #if !NET_2_0
- public string GetPostBackClientEvent (Control control, string argument)
- {
- return GetPostBackEventReference (control, argument);
- }
- #endif
- public string GetPostBackClientHyperlink (Control control, string argument)
- {
- return "javascript:" + GetPostBackEventReference (control, argument);
- }
-
- public string GetPostBackEventReference (Control control, string argument)
- {
- page.RequiresPostBackScript ();
- return String.Format ("__doPostBack('{0}','{1}')", control.UniqueID, argument);
- }
-
- #if NET_2_0
- public string GetPostBackEventReference (PostBackOptions options)
- {
- if (options.ActionUrl == null && options.ValidationGroup == null && !options.TrackFocus &&
- !options.AutoPostBack && !options.PerformValidation)
- {
- if (!options.ClientSubmit)
- return null;
- if (options.RequiresJavaScriptProtocol)
- return GetPostBackClientHyperlink (options.TargetControl, options.Argument);
- else
- return GetPostBackEventReference (options.TargetControl, options.Argument);
- }
-
- if (!IsClientScriptIncludeRegistered (typeof(Page), "webform")) {
- RegisterClientScriptInclude (typeof(Page), "webform", GetWebResourceUrl (typeof(Page), "webform.js"));
- }
-
- if (options.ActionUrl != null)
- RegisterHiddenField (Page.PreviousPageID, page.Request.FilePath);
-
- if (options.ClientSubmit || options.ActionUrl != null)
- page.RequiresPostBackScript ();
-
- return String.Format ("{0}WebForm_DoPostback({1},{2},{3},{4},{5},{6},{7},{8})",
- options.RequiresJavaScriptProtocol ? "javascript:" : "",
- ClientScriptManager.GetScriptLiteral (options.TargetControl.UniqueID),
- ClientScriptManager.GetScriptLiteral (options.Argument),
- ClientScriptManager.GetScriptLiteral (options.ActionUrl),
- ClientScriptManager.GetScriptLiteral (options.AutoPostBack),
- ClientScriptManager.GetScriptLiteral (options.PerformValidation),
- ClientScriptManager.GetScriptLiteral (options.TrackFocus),
- ClientScriptManager.GetScriptLiteral (options.ClientSubmit),
- ClientScriptManager.GetScriptLiteral (options.ValidationGroup)
- );
- }
-
- public string GetCallbackEventReference (Control control, string argument, string clientCallback, string context)
- {
- return GetCallbackEventReference (control.UniqueID, argument, clientCallback, context, null, false);
- }
- public string GetCallbackEventReference (Control control, string argument, string clientCallback, string context, bool useAsync)
- {
- return GetCallbackEventReference (control.UniqueID, argument, clientCallback, context, null, useAsync);
- }
- public string GetCallbackEventReference (Control control, string argument, string clientCallback, string context, string clientErrorCallback, bool useAsync)
- {
- return GetCallbackEventReference (control.UniqueID, argument, clientCallback, context, clientErrorCallback, useAsync);
- }
- public string GetCallbackEventReference (string target, string argument, string clientCallback, string context, string clientErrorCallback, bool useAsync)
- {
- page.RequiresPostBackScript ();
- if (!IsClientScriptIncludeRegistered (typeof(Page), "callback"))
- RegisterClientScriptInclude (typeof(Page), "callback", GetWebResourceUrl (typeof(Page), "callback.js"));
-
- return string.Format ("WebForm_DoCallback ('{0}', {1}, {2}, {3}, {4})", target, argument, clientCallback, context, clientErrorCallback);
- }
- #endif
-
- #if NET_2_0
- public
- #else
- internal
- #endif
- string GetWebResourceUrl(Type type, string resourceName)
- {
- if (type == null)
- throw new ArgumentNullException ("type");
-
- if (resourceName == null || resourceName.Length == 0)
- throw new ArgumentNullException ("type");
-
- return System.Web.Handlers.AssemblyResourceLoader.GetResourceUrl (type, resourceName);
- }
-
- public bool IsClientScriptBlockRegistered (string key)
- {
- return IsScriptRegistered (clientScriptBlocks, GetType(), key);
- }
-
- public bool IsClientScriptBlockRegistered (Type type, string key)
- {
- return IsScriptRegistered (clientScriptBlocks, type, key);
- }
-
- public bool IsStartupScriptRegistered (string key)
- {
- return IsScriptRegistered (startupScriptBlocks, GetType(), key);
- }
-
- public bool IsStartupScriptRegistered (Type type, string key)
- {
- return IsScriptRegistered (startupScriptBlocks, type, key);
- }
-
- public bool IsOnSubmitStatementRegistered (string key)
- {
- return IsScriptRegistered (submitStatements, GetType(), key);
- }
-
- public bool IsOnSubmitStatementRegistered (Type type, string key)
- {
- return IsScriptRegistered (submitStatements, type, key);
- }
-
- public bool IsClientScriptIncludeRegistered (string key)
- {
- return IsScriptRegistered (scriptIncludes, GetType(), key);
- }
-
- public bool IsClientScriptIncludeRegistered (Type type, string key)
- {
- return IsScriptRegistered (scriptIncludes, type, key);
- }
-
- bool IsScriptRegistered (ScriptEntry scriptList, Type type, string key)
- {
- while (scriptList != null) {
- if (scriptList.Type == type && scriptList.Key == key)
- return true;
- scriptList = scriptList.Next;
- }
- return false;
- }
-
- public void RegisterArrayDeclaration (string arrayName, string arrayValue)
- {
- if (registeredArrayDeclares == null)
- registeredArrayDeclares = new Hashtable();
-
- if (!registeredArrayDeclares.ContainsKey (arrayName))
- registeredArrayDeclares.Add (arrayName, new ArrayList());
-
- ((ArrayList) registeredArrayDeclares[arrayName]).Add(arrayValue);
- }
-
- void RegisterScript (ref ScriptEntry scriptList, Type type, string key, string script, bool addScriptTags)
- {
- ScriptEntry last = null;
- ScriptEntry entry = scriptList;
- while (entry != null) {
- if (entry.Type == type && entry.Key == key)
- return;
- last = entry;
- entry = entry.Next;
- }
-
- if (addScriptTags)
- script = "<script language=javascript>\n<!--\n" + script + "\n// -->\n</script>";
- entry = new ScriptEntry (type, key, script);
-
- if (last != null) last.Next = entry;
- else scriptList = entry;
- }
-
- internal void RegisterClientScriptBlock (string key, string script)
- {
- RegisterScript (ref clientScriptBlocks, GetType(), key, script, false);
- }
-
- public void RegisterClientScriptBlock (Type type, string key, string script)
- {
- RegisterScript (ref clientScriptBlocks, type, key, script, false);
- }
-
- public void RegisterClientScriptBlock (Type type, string key, string script, bool addScriptTags)
- {
- RegisterScript (ref clientScriptBlocks, type, key, script, addScriptTags);
- }
-
- public void RegisterHiddenField (string hiddenFieldName, string hiddenFieldInitialValue)
- {
- if (hiddenFields == null)
- hiddenFields = new Hashtable ();
- if (!hiddenFields.ContainsKey (hiddenFieldName))
- hiddenFields.Add (hiddenFieldName, hiddenFieldInitialValue);
- }
-
- internal void RegisterOnSubmitStatement (string key, string script)
- {
- RegisterScript (ref submitStatements, GetType (), key, script, false);
- }
-
- public void RegisterOnSubmitStatement (Type type, string key, string script)
- {
- RegisterScript (ref submitStatements, type, key, script, false);
- }
-
- internal void RegisterStartupScript (string key, string script)
- {
- RegisterScript (ref startupScriptBlocks, GetType(), key, script, false);
- }
-
- public void RegisterStartupScript (Type type, string key, string script)
- {
- RegisterScript (ref startupScriptBlocks, type, key, script, false);
- }
-
- public void RegisterStartupScript (Type type, string key, string script, bool addScriptTags)
- {
- RegisterScript (ref startupScriptBlocks, type, key, script, addScriptTags);
- }
- public void RegisterClientScriptInclude (string key, string url)
- {
- RegisterScript (ref scriptIncludes, GetType(), key, url, false);
- }
-
- public void RegisterClientScriptInclude (Type type, string key, string url)
- {
- RegisterScript (ref scriptIncludes, type, key, url, false);
- }
- #if NET_2_0
- public void RegisterClientScriptResource (Type type, string resourceName)
- {
- RegisterScript (ref scriptIncludes, type, "resource-" + resourceName, GetWebResourceUrl (type, resourceName), false);
- }
- [MonoTODO]
- public void RegisterExpandoAttribute (string controlId,
- string name,
- string value)
- {
- throw new NotImplementedException ();
- }
- [MonoTODO]
- public void RegisterExpandoAttribute(string controlId,
- string attributeName,
- string attributeValue,
- bool encode)
- {
- throw new NotImplementedException ();
- }
- #endif
- void WriteScripts (HtmlTextWriter writer, ScriptEntry scriptList)
- {
- while (scriptList != null) {
- writer.WriteLine (scriptList.Script);
- scriptList = scriptList.Next;
- }
- }
-
- internal void WriteHiddenFields (HtmlTextWriter writer)
- {
- if (hiddenFields == null)
- return;
-
- foreach (string key in hiddenFields.Keys) {
- string value = hiddenFields [key] as string;
- writer.WriteLine ("\n<input type=\"hidden\" name=\"{0}\" value=\"{1}\" />", key, value);
- }
-
- hiddenFields = null;
- }
-
- internal void WriteClientScriptIncludes (HtmlTextWriter writer)
- {
- ScriptEntry entry = scriptIncludes;
- while (entry != null) {
- writer.WriteLine ("\n<script src=\"{0}\" type=\"text/javascript\"></script>", entry.Script);
- entry = entry.Next;
- }
- }
-
- internal void WriteClientScriptBlocks (HtmlTextWriter writer)
- {
- WriteScripts (writer, clientScriptBlocks);
- }
-
- internal void WriteStartupScriptBlocks (HtmlTextWriter writer)
- {
- WriteScripts (writer, startupScriptBlocks);
- }
-
- internal void WriteArrayDeclares (HtmlTextWriter writer)
- {
- if (registeredArrayDeclares != null) {
- writer.WriteLine();
- writer.WriteLine("<script language=\"javascript\">");
- writer.WriteLine("<!--");
- IDictionaryEnumerator arrayEnum = registeredArrayDeclares.GetEnumerator();
- while (arrayEnum.MoveNext()) {
- writer.Write("\tvar ");
- writer.Write(arrayEnum.Key);
- writer.Write(" = new Array(");
- IEnumerator arrayListEnum = ((ArrayList) arrayEnum.Value).GetEnumerator();
- bool isFirst = true;
- while (arrayListEnum.MoveNext()) {
- if (isFirst)
- isFirst = false;
- else
- writer.Write(", ");
- writer.Write(arrayListEnum.Current);
- }
- writer.WriteLine(");");
- }
- writer.WriteLine("// -->");
- writer.WriteLine("</script>");
- writer.WriteLine();
- }
- }
- #if NET_2_0
- internal string GetClientValidationEvent (string validationGroup) {
- return "if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate('" + validationGroup + "');";
- }
- #endif
- internal string GetClientValidationEvent ()
- {
- return "if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate();";
- }
- internal string WriteSubmitStatements ()
- {
- if (submitStatements == null) return null;
-
- StringBuilder sb = new StringBuilder ();
- ScriptEntry entry = submitStatements;
- while (entry != null) {
- sb.Append (entry.Script);
- entry = entry.Next;
- }
- return sb.ToString ();
- }
-
- internal static string GetScriptLiteral (object ob)
- {
- if (ob == null)
- return "null";
- else if (ob is string) {
- string s = (string)ob;
- s = s.Replace ("\"", "\\\"");
- return "\"" + s + "\"";
- } else if (ob is bool) {
- return ob.ToString().ToLower();
- } else {
- return ob.ToString ();
- }
- }
-
- class ScriptEntry
- {
- public Type Type;
- public string Key;
- public string Script;
- public ScriptEntry Next;
-
- public ScriptEntry (Type type, string key, string script)
- {
- Key = key;
- Type = type;
- Script = script;
- }
- }
- #if NET_2_0
- // helper method
- internal static string EnsureEndsWithSemicolon (string value) {
- if (value != null && value.Length > 0 && !value.EndsWith (";"))
- return value += ";";
- return value;
- }
- #endif
- }
- }
|