e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
388 lines
13 KiB
C#
388 lines
13 KiB
C#
//------------------------------------------------------------------------------
|
|
// <copyright file="DeviceSpecific.cs" company="Microsoft">
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
//------------------------------------------------------------------------------
|
|
|
|
using System;
|
|
using System.Collections;
|
|
using System.ComponentModel;
|
|
using System.ComponentModel.Design;
|
|
using System.Diagnostics;
|
|
using System.Globalization;
|
|
using System.Web;
|
|
using System.Web.UI;
|
|
using System.Web.UI.Design.WebControls;
|
|
using System.Web.Mobile;
|
|
using System.Security.Permissions;
|
|
|
|
namespace System.Web.UI.MobileControls
|
|
{
|
|
|
|
/*
|
|
* DeviceSpecific object.
|
|
*
|
|
* Copyright (c) 2000 Microsoft Corporation
|
|
*/
|
|
|
|
/// <include file='doc\DeviceSpecific.uex' path='docs/doc[@for="DeviceSpecific"]/*' />
|
|
[
|
|
ControlBuilderAttribute(typeof(DeviceSpecificControlBuilder)),
|
|
Designer(typeof(System.Web.UI.Design.MobileControls.DeviceSpecificDesigner)),
|
|
ParseChildren(false),
|
|
PersistChildren(false),
|
|
PersistName("DeviceSpecific"),
|
|
ToolboxData("<{0}:DeviceSpecific runat=\"server\"></{0}:DeviceSpecific>"),
|
|
ToolboxItemFilter("System.Web.UI"),
|
|
ToolboxItemFilter("System.Web.UI.MobileControls", ToolboxItemFilterType.Require),
|
|
]
|
|
[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 DeviceSpecific : Control
|
|
{
|
|
private DeviceSpecificChoiceCollection _choices;
|
|
private DeviceSpecificChoice _selectedChoice;
|
|
private bool _haveSelectedChoice;
|
|
private Object _owner;
|
|
|
|
/// <include file='doc\DeviceSpecific.uex' path='docs/doc[@for="DeviceSpecific.Owner"]/*' />
|
|
[
|
|
Browsable(false),
|
|
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
|
|
]
|
|
public Object Owner
|
|
{
|
|
get
|
|
{
|
|
Debug.Assert(_owner != null, "Owner is null");
|
|
return _owner;
|
|
}
|
|
}
|
|
|
|
internal void SetOwner(Object owner)
|
|
{
|
|
Debug.Assert((_owner == null || MobilePage == null || MobilePage.DesignMode), "Owner has already been set");
|
|
_owner = owner;
|
|
}
|
|
|
|
/// <include file='doc\DeviceSpecific.uex' path='docs/doc[@for="DeviceSpecific.Choices"]/*' />
|
|
[
|
|
Browsable(false),
|
|
PersistenceMode(PersistenceMode.InnerDefaultProperty)
|
|
]
|
|
public DeviceSpecificChoiceCollection Choices
|
|
{
|
|
get
|
|
{
|
|
if (_choices == null)
|
|
{
|
|
_choices = new DeviceSpecificChoiceCollection(this);
|
|
}
|
|
return _choices;
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\DeviceSpecific.uex' path='docs/doc[@for="DeviceSpecific.HasTemplates"]/*' />
|
|
[
|
|
Browsable(false),
|
|
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
|
|
]
|
|
public bool HasTemplates
|
|
{
|
|
get
|
|
{
|
|
return (SelectedChoice != null) ?
|
|
_selectedChoice.HasTemplates :
|
|
false;
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\DeviceSpecific.uex' path='docs/doc[@for="DeviceSpecific.GetTemplate"]/*' />
|
|
public ITemplate GetTemplate(String templateName)
|
|
{
|
|
return (SelectedChoice != null) ?
|
|
_selectedChoice.Templates[templateName] as ITemplate :
|
|
null;
|
|
}
|
|
|
|
/// <include file='doc\DeviceSpecific.uex' path='docs/doc[@for="DeviceSpecific.SelectedChoice"]/*' />
|
|
[
|
|
Browsable(false),
|
|
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
|
|
]
|
|
public DeviceSpecificChoice SelectedChoice
|
|
{
|
|
get
|
|
{
|
|
if (!_haveSelectedChoice)
|
|
{
|
|
_haveSelectedChoice = true;
|
|
|
|
HttpContext context = HttpContext.Current;
|
|
if (context == null)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
MobileCapabilities caps = (MobileCapabilities)context.Request.Browser;
|
|
if (_choices != null)
|
|
{
|
|
foreach (DeviceSpecificChoice choice in _choices)
|
|
{
|
|
if (choice.Evaluate(caps))
|
|
{
|
|
_selectedChoice = choice;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return _selectedChoice;
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\DeviceSpecific.uex' path='docs/doc[@for="DeviceSpecific.MobilePage"]/*' />
|
|
[
|
|
Browsable(false),
|
|
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
|
|
]
|
|
public MobilePage MobilePage
|
|
{
|
|
get
|
|
{
|
|
if (Owner is Style)
|
|
{
|
|
return ((Style)Owner).Control.MobilePage;
|
|
}
|
|
else
|
|
{
|
|
Debug.Assert(Owner is MobileControl);
|
|
return ((MobileControl)Owner).MobilePage;
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\DeviceSpecific.uex' path='docs/doc[@for="DeviceSpecific.AddParsedSubObject"]/*' />
|
|
protected override void AddParsedSubObject(Object obj)
|
|
{
|
|
DeviceSpecificChoice choice = obj as DeviceSpecificChoice;
|
|
if (choice != null)
|
|
{
|
|
Choices.Add(choice);
|
|
}
|
|
}
|
|
|
|
internal void ApplyProperties()
|
|
{
|
|
if (SelectedChoice != null)
|
|
{
|
|
_selectedChoice.ApplyProperties();
|
|
}
|
|
}
|
|
|
|
// Walk up the control parent hierarchy until we find either a
|
|
// MobilePage or a UserControl.
|
|
private TemplateControl _closestTemplateControl = null;
|
|
internal TemplateControl ClosestTemplateControl
|
|
{
|
|
get
|
|
{
|
|
if (_closestTemplateControl == null)
|
|
{
|
|
Style asStyle = Owner as Style;
|
|
MobileControl control =
|
|
(asStyle != null) ? asStyle.Control : (MobileControl)Owner;
|
|
|
|
_closestTemplateControl =
|
|
control.FindContainingTemplateControl();
|
|
Debug.Assert(_closestTemplateControl != null);
|
|
}
|
|
return _closestTemplateControl;
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// BEGIN DESIGNER SUPPORT
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
|
/// <include file='doc\DeviceSpecific.uex' path='docs/doc[@for="DeviceSpecific.Init"]/*' />
|
|
[
|
|
Browsable(false),
|
|
]
|
|
public new event EventHandler Init
|
|
{
|
|
add
|
|
{
|
|
base.Init += value;
|
|
}
|
|
remove
|
|
{
|
|
base.Init -= value;
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\DeviceSpecific.uex' path='docs/doc[@for="DeviceSpecific.Load"]/*' />
|
|
[
|
|
Browsable(false),
|
|
]
|
|
public new event EventHandler Load
|
|
{
|
|
add
|
|
{
|
|
base.Load += value;
|
|
}
|
|
remove
|
|
{
|
|
base.Load -= value;
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\DeviceSpecific.uex' path='docs/doc[@for="DeviceSpecific.Unload"]/*' />
|
|
[
|
|
Browsable(false),
|
|
]
|
|
public new event EventHandler Unload
|
|
{
|
|
add
|
|
{
|
|
base.Unload += value;
|
|
}
|
|
remove
|
|
{
|
|
base.Unload -= value;
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\DeviceSpecific.uex' path='docs/doc[@for="DeviceSpecific.PreRender"]/*' />
|
|
[
|
|
Browsable(false),
|
|
]
|
|
public new event EventHandler PreRender
|
|
{
|
|
add
|
|
{
|
|
base.PreRender += value;
|
|
}
|
|
remove
|
|
{
|
|
base.PreRender -= value;
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\DeviceSpecific.uex' path='docs/doc[@for="DeviceSpecific.Disposed"]/*' />
|
|
[
|
|
Browsable(false),
|
|
]
|
|
public new event EventHandler Disposed
|
|
{
|
|
add
|
|
{
|
|
base.Disposed += value;
|
|
}
|
|
remove
|
|
{
|
|
base.Disposed -= value;
|
|
}
|
|
}
|
|
|
|
/// <include file='doc\DeviceSpecific.uex' path='docs/doc[@for="DeviceSpecific.DataBinding"]/*' />
|
|
[
|
|
Browsable(false),
|
|
]
|
|
public new event EventHandler DataBinding
|
|
{
|
|
add
|
|
{
|
|
base.DataBinding += value;
|
|
}
|
|
remove
|
|
{
|
|
base.DataBinding -= value;
|
|
}
|
|
}
|
|
|
|
internal void SetDesignerChoice(DeviceSpecificChoice choice)
|
|
{
|
|
// This will enforce SelectedChoice to return current choice.
|
|
_haveSelectedChoice = true;
|
|
_selectedChoice = choice;
|
|
}
|
|
|
|
// Do not expose the Visible property in the Designer
|
|
/// <include file='doc\DeviceSpecific.uex' path='docs/doc[@for="DeviceSpecific.Visible"]/*' />
|
|
[
|
|
Browsable(false),
|
|
Bindable(false),
|
|
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
|
|
]
|
|
public override bool Visible
|
|
{
|
|
get
|
|
{
|
|
return base.Visible;
|
|
}
|
|
set
|
|
{
|
|
base.Visible = value;
|
|
}
|
|
}
|
|
|
|
// Do not expose the EnableViewState property in the Designer
|
|
/// <include file='doc\DeviceSpecific.uex' path='docs/doc[@for="DeviceSpecific.EnableViewState"]/*' />
|
|
[
|
|
Browsable(false),
|
|
Bindable(false),
|
|
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
|
|
]
|
|
public override bool EnableViewState
|
|
{
|
|
get
|
|
{
|
|
return base.EnableViewState;
|
|
}
|
|
set
|
|
{
|
|
base.EnableViewState = value;
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// END DESIGNER SUPPORT
|
|
/////////////////////////////////////////////////////////////////////////
|
|
}
|
|
|
|
/*
|
|
* DeviceSpecific control builder.
|
|
*
|
|
* Copyright (c) 2000 Microsoft Corporation
|
|
*/
|
|
|
|
/// <include file='doc\DeviceSpecific.uex' path='docs/doc[@for="DeviceSpecificControlBuilder"]/*' />
|
|
[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 DeviceSpecificControlBuilder : ControlBuilder
|
|
{
|
|
/// <include file='doc\DeviceSpecific.uex' path='docs/doc[@for="DeviceSpecificControlBuilder.AppendLiteralString"]/*' />
|
|
public override void AppendLiteralString(String text)
|
|
{
|
|
// Ignore.
|
|
}
|
|
|
|
/// <include file='doc\DeviceSpecific.uex' path='docs/doc[@for="DeviceSpecificControlBuilder.GetChildControlType"]/*' />
|
|
public override Type GetChildControlType(String tagName, IDictionary attributes)
|
|
{
|
|
if (String.Compare(tagName, "Choice", StringComparison.OrdinalIgnoreCase) == 0)
|
|
{
|
|
return typeof(DeviceSpecificChoice);
|
|
}
|
|
else
|
|
{
|
|
throw new Exception(SR.GetString(SR.DeviceSpecific_OnlyChoiceElementsAllowed));
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|