179 lines
6.4 KiB
C#
179 lines
6.4 KiB
C#
|
//------------------------------------------------------------------------------
|
||
|
// <copyright file="DesignerTextBoxAdapter.cs" company="Microsoft">
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
// </copyright>
|
||
|
//------------------------------------------------------------------------------
|
||
|
|
||
|
using System.Globalization;
|
||
|
using System.IO;
|
||
|
using System.Web.Mobile;
|
||
|
using System.Web.UI.MobileControls;
|
||
|
using System.Web.UI.MobileControls.Adapters;
|
||
|
|
||
|
namespace System.Web.UI.Design.MobileControls.Adapters
|
||
|
{
|
||
|
[
|
||
|
System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand,
|
||
|
Flags=System.Security.Permissions.SecurityPermissionFlag.UnmanagedCode)
|
||
|
]
|
||
|
[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 DesignerTextBoxAdapter : HtmlTextBoxAdapter
|
||
|
{
|
||
|
// required width may differ a little bit from actual exact pixel value
|
||
|
private const int SAFETY_MARGIN = 12;
|
||
|
// size after which we simply assume the control is too large to fit
|
||
|
// into its container.
|
||
|
private const int LARGESIZE_THRESHOLD = 100;
|
||
|
|
||
|
public override MobileCapabilities Device
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return DesignerCapabilities.Instance;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public override void Render(HtmlMobileTextWriter writer)
|
||
|
{
|
||
|
// Invalid text writers are not supported in this Adapter.
|
||
|
if (!(writer is DesignerTextWriter))
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
byte templateStatus;
|
||
|
bool pwd = Control.Password;
|
||
|
int size = Control.Size;
|
||
|
int fittingSize;
|
||
|
|
||
|
int maxWidth = DesignerAdapterUtil.GetMaxWidthToFit(Control, out templateStatus);
|
||
|
|
||
|
if (maxWidth == 0)
|
||
|
{
|
||
|
if (templateStatus == DesignerAdapterUtil.CONTROL_IN_TEMPLATE_NONEDIT)
|
||
|
{
|
||
|
maxWidth = DesignerAdapterUtil.CONTROL_MAX_WIDTH_IN_TEMPLATE;
|
||
|
}
|
||
|
else if (DesignerAdapterUtil.InMobileUserControl(Control))
|
||
|
{
|
||
|
maxWidth = Constants.ControlMaxsizeAtToplevel;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (maxWidth == 0)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
bool restoreEmptyFontName = false;
|
||
|
if (String.IsNullOrEmpty((String) Style[Style.FontNameKey, true]))
|
||
|
{
|
||
|
// MSHTMLHostUtil is using another font by default.
|
||
|
// Setting the font name to the one that is actually
|
||
|
// used by default for the desig-time rendering
|
||
|
// assures that the requiredWidth returned by
|
||
|
// MSHTMLHostUtil.GetHtmlFragmentWidth is accurate.
|
||
|
Style[Style.FontNameKey] = "Arial";
|
||
|
restoreEmptyFontName = true;
|
||
|
}
|
||
|
|
||
|
int requiredWidth = 0;
|
||
|
DesignerTextWriter tw;
|
||
|
tw = new DesignerTextWriter(false);
|
||
|
tw.EnterLayout(Style);
|
||
|
String enterLayout = tw.ToString();
|
||
|
|
||
|
tw = new DesignerTextWriter(false);
|
||
|
tw.ExitLayout(Style);
|
||
|
String exitLayout = tw.ToString();
|
||
|
|
||
|
tw = new DesignerTextWriter(false);
|
||
|
tw.WriteBeginTag("input");
|
||
|
tw.WriteStyleAttribute(Style, null);
|
||
|
if (size > 0)
|
||
|
{
|
||
|
tw.WriteAttribute("size", "{0}");
|
||
|
}
|
||
|
tw.Write("/>");
|
||
|
String htmlFragment = tw.ToString();
|
||
|
|
||
|
MSHTMLHostUtil.ApplyStyle(enterLayout, exitLayout, null);
|
||
|
|
||
|
if (size < LARGESIZE_THRESHOLD)
|
||
|
{
|
||
|
requiredWidth = MSHTMLHostUtil.GetHtmlFragmentWidth(size > 0 ? String.Format(CultureInfo.InvariantCulture, htmlFragment, size) : htmlFragment);
|
||
|
}
|
||
|
|
||
|
if (requiredWidth + SAFETY_MARGIN > maxWidth || size >= LARGESIZE_THRESHOLD)
|
||
|
{
|
||
|
if (size == 0)
|
||
|
{
|
||
|
tw = new DesignerTextWriter(false);
|
||
|
tw.WriteBeginTag("input");
|
||
|
tw.WriteStyleAttribute(Style, null);
|
||
|
tw.WriteAttribute("size", "{0}");
|
||
|
tw.Write("/>");
|
||
|
htmlFragment = tw.ToString();
|
||
|
}
|
||
|
fittingSize = 0;
|
||
|
do
|
||
|
{
|
||
|
fittingSize++;
|
||
|
requiredWidth = MSHTMLHostUtil.GetHtmlFragmentWidth(String.Format(CultureInfo.InvariantCulture, htmlFragment, fittingSize));
|
||
|
}
|
||
|
while (requiredWidth + SAFETY_MARGIN <= maxWidth);
|
||
|
|
||
|
if (fittingSize > 1)
|
||
|
{
|
||
|
fittingSize--;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
fittingSize = size;
|
||
|
}
|
||
|
|
||
|
if (restoreEmptyFontName)
|
||
|
{
|
||
|
Style[Style.FontNameKey] = String.Empty;
|
||
|
}
|
||
|
|
||
|
Alignment alignment = (Alignment) Style[Style.AlignmentKey, true];
|
||
|
String width = DesignerAdapterUtil.GetWidth(Control);
|
||
|
|
||
|
writer.Write("<div style='width:" + width);
|
||
|
if (alignment != Alignment.NotSet)
|
||
|
{
|
||
|
writer.Write(";text-align:" + Enum.GetName(typeof(Alignment), alignment));
|
||
|
}
|
||
|
writer.Write("'>");
|
||
|
|
||
|
((DesignerTextWriter)writer).EnterZeroFontSizeTag();
|
||
|
writer.EnterLayout(Style);
|
||
|
|
||
|
writer.WriteBeginTag("input");
|
||
|
((DesignerTextWriter)writer).WriteStyleAttribute(Style, null);
|
||
|
if (!String.IsNullOrEmpty(Control.Text))
|
||
|
{
|
||
|
writer.Write(" value=\"");
|
||
|
writer.WriteText(Control.Text, true);
|
||
|
writer.Write("\" ");
|
||
|
}
|
||
|
if (fittingSize > 0)
|
||
|
{
|
||
|
writer.WriteAttribute("size", fittingSize.ToString(CultureInfo.InvariantCulture));
|
||
|
}
|
||
|
if (pwd)
|
||
|
{
|
||
|
writer.WriteAttribute("type", "password");
|
||
|
}
|
||
|
writer.Write("/>");
|
||
|
|
||
|
writer.ExitLayout(Style);
|
||
|
((DesignerTextWriter)writer).ExitZeroFontSizeTag();
|
||
|
writer.Write("</div>");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|