e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
322 lines
13 KiB
C#
322 lines
13 KiB
C#
//------------------------------------------------------------------------------
|
|
// <copyright file="DesignerTextViewAdapter.cs" company="Microsoft">
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
//------------------------------------------------------------------------------
|
|
|
|
using System.Globalization;
|
|
using System.Text;
|
|
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 DesignerTextViewAdapter : System.Web.UI.MobileControls.Adapters.HtmlControlAdapter
|
|
{
|
|
protected new TextView Control
|
|
{
|
|
get
|
|
{
|
|
return (TextView)base.Control;
|
|
}
|
|
}
|
|
|
|
public override MobileCapabilities Device
|
|
{
|
|
get
|
|
{
|
|
return DesignerCapabilities.Instance;
|
|
}
|
|
}
|
|
|
|
public override void Render(HtmlMobileTextWriter writer)
|
|
{
|
|
Alignment alignment = (Alignment) Style[Style.AlignmentKey, true];
|
|
Wrapping wrapping = (Wrapping) Style[Style.WrappingKey, true];
|
|
bool wrap = (wrapping == Wrapping.Wrap || wrapping == Wrapping.NotSet);
|
|
String width = DesignerAdapterUtil.GetWidth(Control);
|
|
|
|
((DesignerTextWriter)writer).EnterZeroFontSizeTag();
|
|
writer.WriteBeginTag("div");
|
|
if (!wrap)
|
|
{
|
|
byte templateStatus;
|
|
int maxWidth = DesignerAdapterUtil.GetMaxWidthToFit(Control, out templateStatus);
|
|
if (templateStatus == DesignerAdapterUtil.CONTROL_IN_TEMPLATE_EDIT)
|
|
{
|
|
width = maxWidth.ToString(CultureInfo.InvariantCulture) + "px";
|
|
}
|
|
writer.WriteAttribute("style", "overflow-x:hidden;width:" + width);
|
|
}
|
|
else
|
|
{
|
|
writer.WriteAttribute("style", "word-wrap:break-word;width:" + width);
|
|
}
|
|
|
|
if (alignment != Alignment.NotSet)
|
|
{
|
|
writer.WriteAttribute("align", Enum.GetName(typeof(Alignment), alignment));
|
|
}
|
|
writer.Write(">");
|
|
|
|
MSHTMLHostUtil.ApplyStyle(null, null, null);
|
|
String filteredText = FilterTags(Control.Text.Trim());
|
|
int uniqueLineHeight = MSHTMLHostUtil.GetHtmlFragmentHeight("a");
|
|
int requiredHeight = MSHTMLHostUtil.GetHtmlFragmentHeight(filteredText);
|
|
int requiredWidth = MSHTMLHostUtil.GetHtmlFragmentWidth(filteredText);
|
|
|
|
((DesignerTextWriter)writer).WriteCssStyleText(Style, null, (requiredHeight > uniqueLineHeight || requiredWidth > 1) ? filteredText : " ", false);
|
|
writer.WriteEndTag("div");
|
|
((DesignerTextWriter)writer).ExitZeroFontSizeTag();
|
|
}
|
|
|
|
private enum CursorStatus
|
|
{
|
|
OutsideTag,
|
|
InsideTagName,
|
|
InsideAttributeName,
|
|
InsideAttributeValue,
|
|
ExpectingAttributeValue
|
|
}
|
|
|
|
private String FilterTags(String text)
|
|
{
|
|
StringBuilder filteredText = new StringBuilder();
|
|
// StringBuilder hrefValue = null;
|
|
int len = text.Length, i;
|
|
int tagBegin = 0; //, attribBegin = 0;
|
|
bool doubleQuotedAttributeValue = false;
|
|
// bool cacheHRefValue = false;
|
|
CursorStatus cs = CursorStatus.OutsideTag;
|
|
String tagName = String.Empty;
|
|
|
|
for (i = 0; i < len; i++)
|
|
{
|
|
switch (text[i])
|
|
{
|
|
case '<':
|
|
{
|
|
switch (cs)
|
|
{
|
|
case CursorStatus.OutsideTag:
|
|
{
|
|
cs = CursorStatus.InsideTagName;
|
|
tagBegin = i;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case '=':
|
|
{
|
|
switch (cs)
|
|
{
|
|
case CursorStatus.InsideAttributeName:
|
|
{
|
|
// cacheHRefValue = text.Substring(attribBegin, i-attribBegin).Trim().ToUpper() == "HREF";
|
|
// hrefValue = null;
|
|
cs = CursorStatus.ExpectingAttributeValue;
|
|
break;
|
|
}
|
|
case CursorStatus.OutsideTag:
|
|
{
|
|
filteredText.Append(text[i]);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case '"':
|
|
{
|
|
switch (cs)
|
|
{
|
|
case CursorStatus.ExpectingAttributeValue:
|
|
{
|
|
cs = CursorStatus.InsideAttributeValue;
|
|
doubleQuotedAttributeValue = true;
|
|
//if (cacheHRefValue)
|
|
//{
|
|
// hrefValue = new StringBuilder("\"");
|
|
//}
|
|
break;
|
|
}
|
|
case CursorStatus.InsideAttributeValue:
|
|
{
|
|
//if (cacheHRefValue)
|
|
//{
|
|
// hrefValue.Append('"');
|
|
//}
|
|
if (text[i-1] != '\\' && doubleQuotedAttributeValue)
|
|
{
|
|
// leaving attribute value
|
|
cs = CursorStatus.InsideAttributeName;
|
|
// attribBegin = i;
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
case CursorStatus.OutsideTag:
|
|
{
|
|
filteredText.Append(text[i]);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case '\'':
|
|
{
|
|
switch (cs)
|
|
{
|
|
case CursorStatus.ExpectingAttributeValue:
|
|
{
|
|
cs = CursorStatus.InsideAttributeValue;
|
|
//if (cacheHRefValue)
|
|
//{
|
|
// hrefValue = new StringBuilder("'");
|
|
//}
|
|
doubleQuotedAttributeValue = false;
|
|
break;
|
|
}
|
|
case CursorStatus.InsideAttributeValue:
|
|
{
|
|
//if (cacheHRefValue)
|
|
//{
|
|
// hrefValue.Append('\'');
|
|
//}
|
|
if (text[i-1] != '\\' && !doubleQuotedAttributeValue)
|
|
{
|
|
// leaving attribute value
|
|
cs = CursorStatus.InsideAttributeName;
|
|
// attribBegin = i;
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
case CursorStatus.OutsideTag:
|
|
{
|
|
filteredText.Append(text[i]);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case '/':
|
|
{
|
|
switch (cs)
|
|
{
|
|
case CursorStatus.InsideTagName:
|
|
{
|
|
tagName = text.Substring(tagBegin+1, i-tagBegin-1).Trim().ToUpper(CultureInfo.InvariantCulture);
|
|
|
|
if (tagName.Trim().Length > 0)
|
|
{
|
|
cs = CursorStatus.InsideAttributeName;
|
|
// attribBegin = i;
|
|
}
|
|
break;
|
|
}
|
|
case CursorStatus.OutsideTag:
|
|
{
|
|
filteredText.Append(text[i]);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case '>':
|
|
{
|
|
switch (cs)
|
|
{
|
|
case CursorStatus.InsideTagName:
|
|
case CursorStatus.InsideAttributeName:
|
|
case CursorStatus.ExpectingAttributeValue:
|
|
{
|
|
// leaving tag
|
|
if (cs == CursorStatus.InsideTagName)
|
|
{
|
|
tagName = text.Substring(tagBegin+1, i-tagBegin-1).Trim().ToUpper(CultureInfo.InvariantCulture);
|
|
}
|
|
cs = CursorStatus.OutsideTag;
|
|
switch (tagName)
|
|
{
|
|
case "A":
|
|
{
|
|
//filteredText.Append(String.Format("<A HREF={0}>",
|
|
// hrefValue == null ? String.Empty : hrefValue.ToString()));
|
|
filteredText.Append("<A HREF=\"\">");
|
|
break;
|
|
}
|
|
|
|
case "/A":
|
|
case "B":
|
|
case "/B":
|
|
case "BR":
|
|
case "/BR":
|
|
case "I":
|
|
case "/I":
|
|
case "P":
|
|
case "/P":
|
|
{
|
|
filteredText.Append("<" + tagName + ">");
|
|
break;
|
|
}
|
|
}
|
|
tagName = String.Empty;
|
|
break;
|
|
}
|
|
case CursorStatus.OutsideTag:
|
|
{
|
|
filteredText.Append(text[i]);
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
if (Char.IsWhiteSpace(text[i]))
|
|
{
|
|
switch (cs)
|
|
{
|
|
case CursorStatus.OutsideTag:
|
|
{
|
|
filteredText.Append(text[i]);
|
|
break;
|
|
}
|
|
case CursorStatus.InsideTagName:
|
|
{
|
|
cs = CursorStatus.InsideAttributeName;
|
|
// attribBegin = i;
|
|
tagName = text.Substring(tagBegin+1, i-tagBegin-1).Trim().ToUpper(CultureInfo.InvariantCulture);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
switch (cs)
|
|
{
|
|
case CursorStatus.OutsideTag:
|
|
{
|
|
filteredText.Append(text[i]);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return filteredText.ToString();
|
|
}
|
|
}
|
|
}
|
|
|