e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
350 lines
14 KiB
C#
350 lines
14 KiB
C#
//------------------------------------------------------------------------------
|
|
// <copyright file="HtmlControlAdapter.cs" company="Microsoft">
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
//------------------------------------------------------------------------------
|
|
|
|
using System.Collections;
|
|
using System.Diagnostics;
|
|
using System.Web.UI.MobileControls;
|
|
using System.Web.UI.MobileControls.Adapters;
|
|
using System.Security.Permissions;
|
|
|
|
#if COMPILING_FOR_SHIPPED_SOURCE
|
|
namespace System.Web.UI.MobileControls.ShippedAdapterSource
|
|
#else
|
|
namespace System.Web.UI.MobileControls.Adapters
|
|
#endif
|
|
|
|
{
|
|
/*
|
|
* HtmlControlAdapter base class contains html specific methods.
|
|
*
|
|
* Copyright (c) 2000 Microsoft Corporation
|
|
*/
|
|
/// <include file='doc\HtmlControlAdapter.uex' path='docs/doc[@for="HtmlControlAdapter"]/*' />
|
|
[AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal)]
|
|
[AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Minimal)]
|
|
[Obsolete("The System.Web.Mobile.dll assembly has been deprecated and should no longer be used. For information about how to develop ASP.NET mobile applications, see http://go.microsoft.com/fwlink/?LinkId=157231.")]
|
|
public class HtmlControlAdapter : System.Web.UI.MobileControls.Adapters.ControlAdapter
|
|
{
|
|
/// <include file='doc\HtmlControlAdapter.uex' path='docs/doc[@for="HtmlControlAdapter.PageAdapter"]/*' />
|
|
protected HtmlPageAdapter PageAdapter
|
|
{
|
|
get
|
|
{
|
|
return ((HtmlPageAdapter)Page.Adapter);
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\HtmlControlAdapter.uex' path='docs/doc[@for="HtmlControlAdapter.FormAdapter"]/*' />
|
|
protected HtmlFormAdapter FormAdapter
|
|
{
|
|
get
|
|
{
|
|
return (HtmlFormAdapter)Control.Form.Adapter;
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\HtmlControlAdapter.uex' path='docs/doc[@for="HtmlControlAdapter.RequiresFormTag"]/*' />
|
|
public virtual bool RequiresFormTag
|
|
{
|
|
get
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\HtmlControlAdapter.uex' path='docs/doc[@for="HtmlControlAdapter.Render"]/*' />
|
|
public override void Render(HtmlTextWriter writer)
|
|
{
|
|
HtmlMobileTextWriter htmlWriter = (HtmlMobileTextWriter)writer;
|
|
Render(htmlWriter);
|
|
}
|
|
|
|
/// <include file='doc\HtmlControlAdapter.uex' path='docs/doc[@for="HtmlControlAdapter.Render1"]/*' />
|
|
public virtual void Render(HtmlMobileTextWriter writer)
|
|
{
|
|
RenderChildren(writer);
|
|
}
|
|
|
|
/// <include file='doc\HtmlControlAdapter.uex' path='docs/doc[@for="HtmlControlAdapter.RenderPostBackEventReference"]/*' />
|
|
protected void RenderPostBackEventReference(HtmlMobileTextWriter writer, String argument)
|
|
{
|
|
PageAdapter.RenderPostBackEvent(writer, Control.UniqueID, argument);
|
|
}
|
|
|
|
/// <include file='doc\HtmlControlAdapter.uex' path='docs/doc[@for="HtmlControlAdapter.RenderPostBackEventAsAttribute"]/*' />
|
|
protected void RenderPostBackEventAsAttribute(
|
|
HtmlMobileTextWriter writer,
|
|
String attributeName,
|
|
String argument)
|
|
{
|
|
writer.Write(" ");
|
|
writer.Write(attributeName);
|
|
writer.Write("=\"");
|
|
RenderPostBackEventReference(writer, argument);
|
|
writer.Write("\" ");
|
|
}
|
|
|
|
/// <include file='doc\HtmlControlAdapter.uex' path='docs/doc[@for="HtmlControlAdapter.RenderPostBackEventAsAnchor"]/*' />
|
|
protected void RenderPostBackEventAsAnchor(
|
|
HtmlMobileTextWriter writer,
|
|
String argument,
|
|
String linkText)
|
|
{
|
|
writer.EnterStyle(Style);
|
|
writer.WriteBeginTag("a");
|
|
RenderPostBackEventAsAttribute(writer, "href", argument);
|
|
writer.Write(">");
|
|
writer.WriteText(linkText, true);
|
|
writer.WriteEndTag("a");
|
|
writer.ExitStyle(Style);
|
|
}
|
|
|
|
/// <include file='doc\HtmlControlAdapter.uex' path='docs/doc[@for="HtmlControlAdapter.RenderBeginLink"]/*' />
|
|
protected void RenderBeginLink(HtmlMobileTextWriter writer, String target)
|
|
{
|
|
bool queryStringWritten = false;
|
|
bool appendCookieless = (PageAdapter.PersistCookielessData) &&
|
|
(!( (target.StartsWith("http:", StringComparison.Ordinal)) || (target.StartsWith("https:", StringComparison.Ordinal)) ));
|
|
writer.WriteBeginTag("a");
|
|
writer.Write(" href=\"");
|
|
|
|
String targetUrl = null;
|
|
String prefix = Constants.FormIDPrefix;
|
|
if (target.StartsWith(prefix, StringComparison.Ordinal))
|
|
{
|
|
String name = target.Substring(prefix.Length);
|
|
Form form = Control.ResolveFormReference(name);
|
|
|
|
if (writer.SupportsMultiPart)
|
|
{
|
|
if (form != null && PageAdapter.IsFormRendered(form))
|
|
{
|
|
targetUrl = PageAdapter.GetFormUrl(form);
|
|
}
|
|
}
|
|
|
|
if (targetUrl == null)
|
|
{
|
|
RenderPostBackEventReference(writer, form.UniqueID);
|
|
appendCookieless = false;
|
|
}
|
|
else
|
|
{
|
|
writer.Write(targetUrl);
|
|
queryStringWritten = targetUrl.IndexOf('?') != -1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
MobileControl control = Control;
|
|
|
|
// There is some adapter that Control is not set. And we
|
|
// don't do any url resolution then. E.g. a page adapter
|
|
if (control != null)
|
|
{
|
|
// AUI 3652
|
|
target = control.ResolveUrl(target);
|
|
}
|
|
|
|
writer.Write(target);
|
|
queryStringWritten = target.IndexOf('?') != -1;
|
|
}
|
|
|
|
IDictionary dictionary = PageAdapter.CookielessDataDictionary;
|
|
if((dictionary != null) && (appendCookieless))
|
|
{
|
|
foreach(String name in dictionary.Keys)
|
|
{
|
|
if(queryStringWritten)
|
|
{
|
|
writer.Write('&');
|
|
}
|
|
else
|
|
{
|
|
writer.Write('?');
|
|
queryStringWritten = true;
|
|
}
|
|
writer.Write(name);
|
|
writer.Write('=');
|
|
writer.Write(dictionary[name]);
|
|
}
|
|
}
|
|
|
|
writer.Write("\"");
|
|
AddAttributes(writer);
|
|
writer.Write(">");
|
|
}
|
|
|
|
/// <include file='doc\HtmlControlAdapter.uex' path='docs/doc[@for="HtmlControlAdapter.RenderEndLink"]/*' />
|
|
protected void RenderEndLink(HtmlMobileTextWriter writer)
|
|
{
|
|
writer.WriteEndTag("a");
|
|
}
|
|
|
|
// Can be used by adapter that allow its subclass to add more
|
|
// specific attributes
|
|
/// <include file='doc\HtmlControlAdapter.uex' path='docs/doc[@for="HtmlControlAdapter.AddAttributes"]/*' />
|
|
protected virtual void AddAttributes(HtmlMobileTextWriter writer)
|
|
{
|
|
}
|
|
|
|
// Can be used by adapter that adds the custom attribute "accesskey"
|
|
/// <include file='doc\HtmlControlAdapter.uex' path='docs/doc[@for="HtmlControlAdapter.AddAccesskeyAttribute"]/*' />
|
|
protected virtual void AddAccesskeyAttribute(HtmlMobileTextWriter writer)
|
|
{
|
|
if (Device.SupportsAccesskeyAttribute)
|
|
{
|
|
AddCustomAttribute(writer, "accesskey");
|
|
}
|
|
}
|
|
|
|
// Can be used by adapter that adds custom attributes for
|
|
// multi-media functionalities
|
|
|
|
private readonly static String [] _multiMediaAttributes =
|
|
{ "src",
|
|
"soundstart",
|
|
"loop",
|
|
"volume",
|
|
"vibration",
|
|
"viblength" };
|
|
|
|
/// <include file='doc\HtmlControlAdapter.uex' path='docs/doc[@for="HtmlControlAdapter.AddJPhoneMultiMediaAttributes"]/*' />
|
|
protected virtual void AddJPhoneMultiMediaAttributes(
|
|
HtmlMobileTextWriter writer)
|
|
{
|
|
if (Device.SupportsJPhoneMultiMediaAttributes)
|
|
{
|
|
for (int i = 0; i < _multiMediaAttributes.Length; i++)
|
|
{
|
|
AddCustomAttribute(writer, _multiMediaAttributes[i]);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void AddCustomAttribute(HtmlMobileTextWriter writer,
|
|
String attributeName)
|
|
{
|
|
String attributeValue = ((IAttributeAccessor)Control).GetAttribute(attributeName);
|
|
if (!String.IsNullOrEmpty(attributeValue))
|
|
{
|
|
writer.WriteAttribute(attributeName, attributeValue);
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\HtmlControlAdapter.uex' path='docs/doc[@for="HtmlControlAdapter.RenderAsHiddenInputField"]/*' />
|
|
protected virtual void RenderAsHiddenInputField(HtmlMobileTextWriter writer)
|
|
{
|
|
}
|
|
|
|
// Renders hidden variables for IPostBackDataHandlers which are
|
|
// not displayed due to pagination or secondary UI.
|
|
internal void RenderOffPageVariables(HtmlMobileTextWriter writer, Control ctl, int page)
|
|
{
|
|
if (ctl.HasControls())
|
|
{
|
|
foreach (Control child in ctl.Controls)
|
|
{
|
|
// Note: Control.Form != null.
|
|
if (!child.Visible || child == Control.Form.Header || child == Control.Form.Footer)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
MobileControl mobileCtl = child as MobileControl;
|
|
|
|
if (mobileCtl != null)
|
|
{
|
|
if (mobileCtl.IsVisibleOnPage(page)
|
|
&& (mobileCtl == ((HtmlFormAdapter)mobileCtl.Form.Adapter).SecondaryUIControl ||
|
|
null == ((HtmlFormAdapter)mobileCtl.Form.Adapter).SecondaryUIControl))
|
|
{
|
|
if (mobileCtl.FirstPage == mobileCtl.LastPage)
|
|
{
|
|
// Entire control is visible on this page, so no need to look
|
|
// into children.
|
|
continue;
|
|
}
|
|
|
|
// Control takes up more than one page, so it may be possible that
|
|
// its children are on a different page, so we'll continue to
|
|
// fall through into children.
|
|
}
|
|
else if (mobileCtl is IPostBackDataHandler)
|
|
{
|
|
HtmlControlAdapter adapter = mobileCtl.Adapter as HtmlControlAdapter;
|
|
if (adapter != null)
|
|
{
|
|
adapter.RenderAsHiddenInputField(writer);
|
|
}
|
|
}
|
|
}
|
|
|
|
RenderOffPageVariables(writer, child, page);
|
|
}
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
// SECONDARY UI SUPPORT
|
|
/////////////////////////////////////////////////////////////////////
|
|
|
|
internal const int NotSecondaryUIInit = -1; // For initialization of private consts in derived classes.
|
|
/// <include file='doc\HtmlControlAdapter.uex' path='docs/doc[@for="HtmlControlAdapter.NotSecondaryUI"]/*' />
|
|
protected static readonly int NotSecondaryUI = NotSecondaryUIInit;
|
|
|
|
/// <include file='doc\HtmlControlAdapter.uex' path='docs/doc[@for="HtmlControlAdapter.SecondaryUIMode"]/*' />
|
|
protected int SecondaryUIMode
|
|
{
|
|
get
|
|
{
|
|
if (Control == null || Control.Form == null)
|
|
{
|
|
return NotSecondaryUI;
|
|
}
|
|
else
|
|
{
|
|
return ((HtmlFormAdapter)Control.Form.Adapter).GetSecondaryUIMode(Control);
|
|
}
|
|
}
|
|
set
|
|
{
|
|
((HtmlFormAdapter)Control.Form.Adapter).SetSecondaryUIMode(Control, value);
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\HtmlControlAdapter.uex' path='docs/doc[@for="HtmlControlAdapter.ExitSecondaryUIMode"]/*' />
|
|
protected void ExitSecondaryUIMode()
|
|
{
|
|
SecondaryUIMode = NotSecondaryUI;
|
|
}
|
|
|
|
/// <include file='doc\HtmlControlAdapter.uex' path='docs/doc[@for="HtmlControlAdapter.LoadAdapterState"]/*' />
|
|
public override void LoadAdapterState(Object state)
|
|
{
|
|
if (state != null)
|
|
{
|
|
SecondaryUIMode = (int)state;
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\HtmlControlAdapter.uex' path='docs/doc[@for="HtmlControlAdapter.SaveAdapterState"]/*' />
|
|
public override Object SaveAdapterState()
|
|
{
|
|
int mode = SecondaryUIMode;
|
|
if (mode != NotSecondaryUI)
|
|
{
|
|
return mode;
|
|
}
|
|
else
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|