308 lines
12 KiB
C#
308 lines
12 KiB
C#
|
//------------------------------------------------------------------------------
|
||
|
// <copyright file="ControlAdapter.cs" company="Microsoft">
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
// </copyright>
|
||
|
//------------------------------------------------------------------------------
|
||
|
|
||
|
using System;
|
||
|
using System.Globalization;
|
||
|
using System.IO;
|
||
|
using System.Web;
|
||
|
using System.Web.UI;
|
||
|
using System.Web.UI.HtmlControls;
|
||
|
using System.Web.Mobile;
|
||
|
using RootMobile = System.Web.Mobile;
|
||
|
using System.Web.UI.MobileControls;
|
||
|
using System.Collections;
|
||
|
using System.Collections.Specialized;
|
||
|
using System.Text;
|
||
|
using System.Security.Permissions;
|
||
|
|
||
|
// We don't recompile this base class in the shipped source samples, as it
|
||
|
// accesses some internal functionality and is a core utility (rather than an
|
||
|
// extension itself).
|
||
|
#if !COMPILING_FOR_SHIPPED_SOURCE
|
||
|
|
||
|
namespace System.Web.UI.MobileControls.Adapters
|
||
|
{
|
||
|
|
||
|
/*
|
||
|
* ControlAdapter base class.
|
||
|
*
|
||
|
* Copyright (c) 2000 Microsoft Corporation
|
||
|
*/
|
||
|
/// <include file='doc\ControlAdapter.uex' path='docs/doc[@for="ControlAdapter"]/*' />
|
||
|
[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 abstract class ControlAdapter : IControlAdapter
|
||
|
{
|
||
|
private static readonly String[] LabelIDs = new String[] {
|
||
|
RootMobile.SR.ControlAdapter_BackLabel,
|
||
|
RootMobile.SR.ControlAdapter_GoLabel,
|
||
|
RootMobile.SR.ControlAdapter_OKLabel,
|
||
|
RootMobile.SR.ControlAdapter_MoreLabel,
|
||
|
RootMobile.SR.ControlAdapter_OptionsLabel,
|
||
|
RootMobile.SR.ControlAdapter_NextLabel,
|
||
|
RootMobile.SR.ControlAdapter_PreviousLabel,
|
||
|
RootMobile.SR.ControlAdapter_LinkLabel,
|
||
|
RootMobile.SR.ControlAdapter_PhoneCallLabel
|
||
|
};
|
||
|
|
||
|
/// <include file='doc\ControlAdapter.uex' path='docs/doc[@for="ControlAdapter.BackLabel"]/*' />
|
||
|
protected static readonly int BackLabel = 0;
|
||
|
/// <include file='doc\ControlAdapter.uex' path='docs/doc[@for="ControlAdapter.GoLabel"]/*' />
|
||
|
protected static readonly int GoLabel = 1;
|
||
|
/// <include file='doc\ControlAdapter.uex' path='docs/doc[@for="ControlAdapter.OKLabel"]/*' />
|
||
|
protected static readonly int OKLabel = 2;
|
||
|
/// <include file='doc\ControlAdapter.uex' path='docs/doc[@for="ControlAdapter.MoreLabel"]/*' />
|
||
|
protected static readonly int MoreLabel = 3;
|
||
|
/// <include file='doc\ControlAdapter.uex' path='docs/doc[@for="ControlAdapter.OptionsLabel"]/*' />
|
||
|
protected static readonly int OptionsLabel = 4;
|
||
|
/// <include file='doc\ControlAdapter.uex' path='docs/doc[@for="ControlAdapter.NextLabel"]/*' />
|
||
|
protected static readonly int NextLabel = 5;
|
||
|
/// <include file='doc\ControlAdapter.uex' path='docs/doc[@for="ControlAdapter.PreviousLabel"]/*' />
|
||
|
protected static readonly int PreviousLabel = 6;
|
||
|
/// <include file='doc\ControlAdapter.uex' path='docs/doc[@for="ControlAdapter.LinkLabel"]/*' />
|
||
|
protected static readonly int LinkLabel = 7;
|
||
|
/// <include file='doc\ControlAdapter.uex' path='docs/doc[@for="ControlAdapter.CallLabel"]/*' />
|
||
|
protected static readonly int CallLabel = 8;
|
||
|
|
||
|
private MobileControl _control;
|
||
|
|
||
|
/// <include file='doc\ControlAdapter.uex' path='docs/doc[@for="ControlAdapter.Control"]/*' />
|
||
|
public MobileControl Control
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return _control;
|
||
|
}
|
||
|
set
|
||
|
{
|
||
|
_control = value;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <include file='doc\ControlAdapter.uex' path='docs/doc[@for="ControlAdapter.Page"]/*' />
|
||
|
public virtual MobilePage Page
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return Control.MobilePage;
|
||
|
}
|
||
|
set
|
||
|
{
|
||
|
// Do not expect to be called directly. Subclasses should
|
||
|
// override this when needed.
|
||
|
throw new Exception(
|
||
|
SR.GetString(
|
||
|
SR.ControlAdapterBasePagePropertyShouldNotBeSet));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <include file='doc\ControlAdapter.uex' path='docs/doc[@for="ControlAdapter.Device"]/*' />
|
||
|
public virtual MobileCapabilities Device
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return (MobileCapabilities)Page.Request.Browser;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <include file='doc\ControlAdapter.uex' path='docs/doc[@for="ControlAdapter.OnInit"]/*' />
|
||
|
public virtual void OnInit(EventArgs e){}
|
||
|
/// <include file='doc\ControlAdapter.uex' path='docs/doc[@for="ControlAdapter.OnLoad"]/*' />
|
||
|
public virtual void OnLoad(EventArgs e){}
|
||
|
/// <include file='doc\ControlAdapter.uex' path='docs/doc[@for="ControlAdapter.OnPreRender"]/*' />
|
||
|
public virtual void OnPreRender(EventArgs e){}
|
||
|
|
||
|
/// <include file='doc\ControlAdapter.uex' path='docs/doc[@for="ControlAdapter.Render"]/*' />
|
||
|
public virtual void Render(HtmlTextWriter writer)
|
||
|
{
|
||
|
RenderChildren(writer);
|
||
|
}
|
||
|
|
||
|
/// <include file='doc\ControlAdapter.uex' path='docs/doc[@for="ControlAdapter.OnUnload"]/*' />
|
||
|
public virtual void OnUnload(EventArgs e){}
|
||
|
|
||
|
/// <include file='doc\ControlAdapter.uex' path='docs/doc[@for="ControlAdapter.HandlePostBackEvent"]/*' />
|
||
|
public virtual bool HandlePostBackEvent(String eventArgument)
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
// By default, always return false, so the control itself will handle
|
||
|
// it.
|
||
|
/// <include file='doc\ControlAdapter.uex' path='docs/doc[@for="ControlAdapter.LoadPostData"]/*' />
|
||
|
public virtual bool LoadPostData(String key,
|
||
|
NameValueCollection data,
|
||
|
Object controlPrivateData,
|
||
|
out bool dataChanged)
|
||
|
{
|
||
|
dataChanged = false;
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/// <include file='doc\ControlAdapter.uex' path='docs/doc[@for="ControlAdapter.LoadAdapterState"]/*' />
|
||
|
public virtual void LoadAdapterState(Object state)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
/// <include file='doc\ControlAdapter.uex' path='docs/doc[@for="ControlAdapter.SaveAdapterState"]/*' />
|
||
|
public virtual Object SaveAdapterState()
|
||
|
{
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
/// <include file='doc\ControlAdapter.uex' path='docs/doc[@for="ControlAdapter.CreateTemplatedUI"]/*' />
|
||
|
public virtual void CreateTemplatedUI(bool doDataBind)
|
||
|
{
|
||
|
// No device specific templated UI to create.
|
||
|
|
||
|
Control.CreateDefaultTemplatedUI(doDataBind);
|
||
|
}
|
||
|
|
||
|
// convenience methods here
|
||
|
/// <include file='doc\ControlAdapter.uex' path='docs/doc[@for="ControlAdapter.Style"]/*' />
|
||
|
public Style Style
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return Control.Style;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <include file='doc\ControlAdapter.uex' path='docs/doc[@for="ControlAdapter.RenderChildren"]/*' />
|
||
|
protected void RenderChildren(HtmlTextWriter writer)
|
||
|
{
|
||
|
if (Control.HasControls())
|
||
|
{
|
||
|
foreach (Control child in Control.Controls)
|
||
|
{
|
||
|
child.RenderControl(writer);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <include file='doc\ControlAdapter.uex' path='docs/doc[@for="ControlAdapter.VisibleWeight"]/*' />
|
||
|
public virtual int VisibleWeight
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return ControlPager.UseDefaultWeight;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <include file='doc\ControlAdapter.uex' path='docs/doc[@for="ControlAdapter.ItemWeight"]/*' />
|
||
|
public virtual int ItemWeight
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return ControlPager.UseDefaultWeight;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// The following method is used by PageAdapter subclasses of
|
||
|
// ControlAdapter for determining the optimum page weight for
|
||
|
// a given device. Algorithm is as follows:
|
||
|
// 1) First look for the "optimumPageWeight" parameter set
|
||
|
// for the device. If it exists, and can be converted
|
||
|
// to an integer, use it.
|
||
|
// 2) Otherwise, look for the "screenCharactersHeight" parameter.
|
||
|
// If it exists, and can be converted to an integer, multiply
|
||
|
// it by 100 and use the result.
|
||
|
// 3) As a last resort, use the default provided by the calling
|
||
|
// PageAdapter.
|
||
|
/// <include file='doc\ControlAdapter.uex' path='docs/doc[@for="ControlAdapter.CalculateOptimumPageWeight"]/*' />
|
||
|
protected virtual int CalculateOptimumPageWeight(int defaultPageWeight)
|
||
|
{
|
||
|
int optimumPageWeight = 0;
|
||
|
|
||
|
// Pull OptimumPageWeight from the web.config parameter of the same
|
||
|
// name, when present.
|
||
|
String pageWeight = Device[Constants.OptimumPageWeightParameter];
|
||
|
|
||
|
if (pageWeight != null)
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
optimumPageWeight = Convert.ToInt32(pageWeight, CultureInfo.InvariantCulture);
|
||
|
}
|
||
|
catch
|
||
|
{
|
||
|
optimumPageWeight = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (optimumPageWeight <= 0)
|
||
|
{
|
||
|
// If OptimumPageWeight isn't established explicitly, attempt to
|
||
|
// construct it as 100 * number of lines of characters.
|
||
|
String numLinesStr = Device[Constants.ScreenCharactersHeightParameter];
|
||
|
if (numLinesStr != null)
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
int numLines = Convert.ToInt32(numLinesStr, CultureInfo.InvariantCulture);
|
||
|
optimumPageWeight = 100 * numLines;
|
||
|
}
|
||
|
catch
|
||
|
{
|
||
|
optimumPageWeight = 0;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (optimumPageWeight <= 0)
|
||
|
{
|
||
|
optimumPageWeight = defaultPageWeight;
|
||
|
}
|
||
|
|
||
|
return optimumPageWeight;
|
||
|
}
|
||
|
|
||
|
private String[] _defaultLabels = null;
|
||
|
|
||
|
/// <include file='doc\ControlAdapter.uex' path='docs/doc[@for="ControlAdapter.GetDefaultLabel"]/*' />
|
||
|
protected String GetDefaultLabel(int labelID)
|
||
|
{
|
||
|
if ((labelID < 0) || (labelID >= LabelIDs.Length))
|
||
|
{
|
||
|
throw new ArgumentException(System.Web.Mobile.SR.GetString(
|
||
|
System.Web.Mobile.SR.ControlAdapter_InvalidDefaultLabel));
|
||
|
}
|
||
|
|
||
|
MobilePage page = Page;
|
||
|
if (page != null)
|
||
|
{
|
||
|
ControlAdapter pageAdapter = (ControlAdapter)page.Adapter;
|
||
|
if (pageAdapter._defaultLabels == null)
|
||
|
{
|
||
|
pageAdapter._defaultLabels = new String[LabelIDs.Length];
|
||
|
}
|
||
|
|
||
|
String labelValue = pageAdapter._defaultLabels[labelID];
|
||
|
if (labelValue == null)
|
||
|
{
|
||
|
labelValue = System.Web.Mobile.SR.GetString(LabelIDs[labelID]);
|
||
|
pageAdapter._defaultLabels[labelID] = labelValue;
|
||
|
}
|
||
|
|
||
|
return labelValue;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return System.Web.Mobile.SR.GetString(LabelIDs[labelID]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
[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.")]
|
||
|
internal class EmptyControlAdapter : ControlAdapter {
|
||
|
internal EmptyControlAdapter() {}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
#endif
|