HtmlMobileTextWriter.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / MIT / System / Web / UI / MobileControls / Adapters / HtmlMobileTextWriter.cs / 1305376 / HtmlMobileTextWriter.cs

                            //------------------------------------------------------------------------------ 
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//----------------------------------------------------------------------------- 

using System; 
using System.Drawing; 
using System.Globalization;
using System.IO; 
using System.Web;
using System.Web.Mobile;
using System.Web.UI;
using System.Web.UI.MobileControls; 
using System.Collections;
using System.Diagnostics; 
using System.Security.Permissions; 

#if COMPILING_FOR_SHIPPED_SOURCE 
namespace System.Web.UI.MobileControls.ShippedAdapterSource
#else
namespace System.Web.UI.MobileControls.Adapters
#endif 

{ 
 
    /*
     * HtmlMobileTextWriter class. 
     */
    /// 
    [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 HtmlMobileTextWriter : MobileTextWriter 
    { 
        private bool _shouldEnsureStyle = true;
 
        //  mobile device type constants (should be defined somewhere else eventually)
        internal WriterState _currentState;

        ///  
        public HtmlMobileTextWriter(TextWriter writer, MobileCapabilities device)
            : base(writer, device) 
        { 
            RenderBold = device.SupportsBold;
            RenderItalic = device.SupportsItalic; 
            RenderFontSize = device.SupportsFontSize;
            RenderFontName = device.SupportsFontName;
            RenderFontColor = device.SupportsFontColor;
            RenderBodyColor = device.SupportsBodyColor; 
            RenderDivAlign = device.SupportsDivAlign;
            RenderDivNoWrap = device.SupportsDivNoWrap; 
            RequiresNoBreakInFormatting = device.RequiresNoBreakInFormatting; 
            _currentState = new WriterState(this);
        } 

        /*
         * the following TextWriter methods are overridden to
         * first call EnsureStyle before delegating to the base 
         * class implementation
         */ 
        ///  
        public override void WriteBeginTag(String tag)
        { 
            EnsureStyle();
            base.WriteBeginTag(tag);
        }
        ///  
        public override void WriteFullBeginTag(String tag)
        { 
            EnsureStyle(); 
            base.WriteFullBeginTag(tag);
        } 
        /// 
        public override void Write(char c)
        {
            EnsureStyle(); 
            base.Write(c);
        } 
        ///  
        public override void Write(String text)
        { 
            EnsureStyle();
            base.Write(text);
        }
        ///  
        public override void WriteEncodedText(String text)
        { 
            EnsureStyle(); 
            if(Device["supportsCharacterEntityEncoding"] != "false") {
                base.WriteEncodedText(text); 
                return;
            }
            if (null == text || text.Length == 0) {
                return; 
            }
 
            int length = text.Length; 
            int start = -1;
            for(int pos = 0; pos < length; pos++) { 
                int ch = text[pos];
                if(ch > 160 && ch < 256) {
                    if(start != -1) {
                        base.WriteEncodedText(text.Substring(start, pos - start)); 
                        start = -1;
                    } 
                    base.Write(text[pos]); 
                }
                else { 
                    if(start == -1) {
                        start = pos;
                    }
                } 
            }
            if(start != -1) { 
                if(start == 0) { 
                    base.WriteEncodedText(text);
                } 
                else {
                    base.WriteEncodedText(text.Substring(start, length - start));
                }
            } 
        }
        ///  
        public override void WriteLine(String text) 
        {
            EnsureStyle(); 
            base.WriteLine(text);
        }

        ///  
        public new void WriteBreak()
        { 
            //Do not EnsureStyle for the break 
            base.WriteLine("
"); } /// public override void EnterLayout(Style style) { WriterStyle writerStyle = new WriterStyle(style); writerStyle.Format = false; EnterStyle(writerStyle); } /// public override void ExitLayout(Style style, bool breakAfter) { ExitStyle(style, breakAfter); } /// public override void ExitLayout(Style style) { ExitStyle(style, false); } /// protected internal void MarkStyleContext() { _shouldEnsureStyle = true; _currentState.MarkStyleContext(); } /// protected internal void UnMarkStyleContext() { _shouldEnsureStyle = true; _currentState.UnMarkStyleContext(); } /// public override void EnterFormat(Style style) { WriterStyle writerStyle = new WriterStyle(style); writerStyle.Layout = false; EnterStyle(writerStyle); } /// public override void ExitFormat(Style style) { ExitStyle(style); } /// public override void ExitFormat(Style style, bool breakAfter) { ExitStyle(style, breakAfter); } /// public void BeginStyleContext() { if(_currentState.BreakPending) { WriteBreak(); _currentState.BreakPending = false; } _currentState.PushState(); EnterStyle(new WriterStyle()); } /// public void EndStyleContext() { if(_currentState.BreakPending) { WriteBreak(); _currentState.BreakPending = false; } _currentState.PopState(); _currentState.Pop(); _currentState.Transition(new WriterStyle()); } /* all calls to Enter... converge to this */ private void EnterStyle(WriterStyle style) { _currentState.Push(style); } /// public new void EnterStyle(Style style) { EnterStyle(new WriterStyle(style)); } /// public new void ExitStyle(Style style) { ExitStyle(style, false); } internal bool ShouldEnsureStyle { get { return _shouldEnsureStyle; } set { _shouldEnsureStyle = value; } } /* all calls to Exit... converge to this */ /// public void ExitStyle(Style style, bool breakAfter) { _currentState.Pop(); if((_currentState.BreakPending) && (_currentState.Count > 0)) { EnsureStyle(); } _currentState.BreakPending = breakAfter; if((_currentState.Count == 0) || (RequiresNoBreakInFormatting)) { _currentState.Transition(new WriterStyle()); } InputWritten = false; } internal bool _inputWritten = false; internal bool InputWritten { get { return _inputWritten; } set { _inputWritten = value; } } internal void EnsureStyle() { if (_shouldEnsureStyle) { if(_currentState.Count > 0) { _currentState.Transition(_currentState.Peek()); } _shouldEnsureStyle = false; } if(BeforeFirstControlWritten) { BeforeFirstControlWritten = false; } } /// public void WriteText(String text, bool encodeText) { if(text != null && text.Length == 0) { return; } EnsureStyle(); if (encodeText) { WriteEncodedText(text); } else { Write(text); } } /// public void WriteUrlParameter(String name, String value) { WriteEncodedUrlParameter(name); Write("="); WriteEncodedUrlParameter(value); } /// public void WriteHiddenField(String name, String value) { WriteBeginTag("input"); WriteAttribute("type", "hidden"); WriteAttribute("name", name); WriteAttribute("value", value, true); Write(">\r\n"); } // AUI 2285 private bool _beforeFirstControlWritten = true; internal bool BeforeFirstControlWritten { get { return _beforeFirstControlWritten; } set { _beforeFirstControlWritten = value; } } private bool _maintainState = true; internal bool MaintainState { get { return _maintainState; } set { _maintainState = value; } } /// protected internal bool RenderBold { get { return _renderBold; } set { _renderBold = value; } } /// protected internal bool RenderItalic { get { return _renderItalic; } set { _renderItalic = value; } } /// protected internal bool RenderFontSize { get { return _renderFontSize; } set { _renderFontSize = value; } } /// protected internal bool RenderFontName { get { return _renderFontName; } set { _renderFontName = value; } } /// protected internal bool RenderFontColor { get { return _renderFontColor; } set { _renderFontColor = value; } } /// protected internal bool RenderBodyColor { get { return _renderBodyColor; } set { _renderBodyColor = value; } } /// protected internal bool RenderDivAlign { get { return _renderDivAlign; } set { _renderDivAlign = value; } } /// protected internal bool RenderDivNoWrap { get { return _renderDivNoWrap; } set { _renderDivNoWrap = value; } } /// protected internal bool RequiresNoBreakInFormatting { get { return _requiresNoBreakInFormatting; } set { _requiresNoBreakInFormatting = value; } } private bool _renderBold = true; private bool _renderItalic = true; private bool _renderFontSize = true; private bool _renderFontName = true; private bool _renderFontColor = true; private bool _renderBodyColor = true; private bool _renderDivAlign = true; private bool _renderDivNoWrap = false; private bool _requiresNoBreakInFormatting = false; } /* * the WriterStyle class is used to store and * control state for rendering format and layout */ [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 WriterStyle { private Wrapping _wrapping; private Alignment _alignment; private String _fontName; private Color _fontColor; private FontSize _fontSize; private bool _bold; private bool _italic; private bool _format; private bool _layout; internal WriterStyle() { _wrapping = Wrapping.Wrap; _alignment = Alignment.Left; _fontName = String.Empty; _fontColor = Color.Empty; _fontSize = FontSize.Normal; _bold = false; _italic = false; _format = true; _layout = true; } internal WriterStyle(Style style) { Debug.Assert(style != null, "writer style is null"); _alignment = (Alignment) style[Style.AlignmentKey, true]; if(_alignment == Alignment.NotSet) { _alignment = Alignment.Left; } _wrapping = (Wrapping) style[Style.WrappingKey, true]; if(_wrapping == Wrapping.NotSet) { _wrapping = Wrapping.Wrap; } _fontSize = (FontSize) style[Style.FontSizeKey , true]; if(_fontSize == FontSize.NotSet) { _fontSize = FontSize.Normal; } _fontName = (String) style[Style.FontNameKey , true]; _fontColor = (Color) style[Style.ForeColorKey, true]; _bold = ((BooleanOption) style[Style.BoldKey, true] == BooleanOption.True); _italic = ((BooleanOption) style[Style.ItalicKey, true] == BooleanOption.True); _format = true; _layout = true; } internal bool Format { get { return _format; } set { _format = value; } } internal bool Layout { get { return _layout; } set { _layout = value; } } internal Wrapping Wrapping { get { return _wrapping; } set { _wrapping = value; } } internal Alignment Alignment { get { return _alignment; } set { _alignment = value; } } internal String FontName { get { return _fontName; } set { _fontName = value; } } internal Color FontColor { get { return _fontColor; } set { _fontColor = value; } } internal FontSize FontSize { get { return _fontSize; } set { _fontSize = value; } } internal bool Bold { get { return _bold; } set { _bold = value; } } internal bool Italic { get { return _italic; } set { _italic = value; } } } /* * The StyleTag class is extended for specific tags */ [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 abstract class StyleTag { private int _level = -1; #if UNUSED_CODE internal StyleTag() { } #endif internal StyleTag(int level) { _level = level; } internal virtual int Level { get { return _level; } set { _level = value; } } internal abstract void CloseTag(WriterState state); } [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 BoldStyleTag : StyleTag { internal BoldStyleTag(int level) : base(level) { } internal override void CloseTag(WriterState state) { state.Writer.WriteEndTag("b"); state.Current.Bold = false; } } [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 ItalicStyleTag : StyleTag { internal ItalicStyleTag(int level) : base(level) { } internal override void CloseTag(WriterState state) { state.Writer.WriteEndTag("i"); state.Current.Italic = false; } } [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 FontStyleTag : StyleTag { private String _name; private Color _color; private FontSize _size; internal FontStyleTag(int level) : base(level) { _name = String.Empty; _color = Color.Empty; _size = FontSize.Normal; } #if UNUSED_CODE internal FontStyleTag(int level, String name, Color color, FontSize size) : base(level) { Name = _name; Color = color; FontSize = size; } #endif internal String Name { get { return _name; } set { _name = value; } } internal Color Color { get { return _color; } set { _color = value; } } internal FontSize FontSize { get { return _size; } set { _size = value; } } internal override void CloseTag(WriterState state) { state.Writer.WriteEndTag("font"); //reset FontLevel and rebuild state info state.FontLevel = -1; state.Current.FontColor = Color.Empty; state.Current.FontName = String.Empty; state.Current.FontSize = FontSize.Normal; //reset the FontLevel Stack tmpStack = new Stack(); while(state.TagsWritten.Count > 0) { Object o = state.TagsWritten.Pop(); tmpStack.Push(o); if(o is FontStyleTag) { state.FontLevel = ((FontStyleTag)o).Level; break; } } while(tmpStack.Count > 0) { state.TagsWritten.Push(tmpStack.Pop()); } //there is a font tag in the stack if(state.FontLevel > -1) { if(Color != Color.Empty) { //reset font color to something further down the stack Stack tempStack = new Stack(); while(state.TagsWritten.Count > 0) { Object o = state.TagsWritten.Pop(); tempStack.Push(o); if(o is FontStyleTag) { if(((FontStyleTag)o).Color != Color.Empty) { state.Current.FontColor = ((FontStyleTag)o).Color; break; } } } while(tempStack.Count > 0) { state.TagsWritten.Push(tempStack.Pop()); } } if(Name == null || Name.Length > 0) { //reset font name to something futher down the stack Stack tempStack = new Stack(); while(state.TagsWritten.Count > 0) { Object o = state.TagsWritten.Pop(); tempStack.Push(o); if(o is FontStyleTag) { String name = ((FontStyleTag)o).Name; if(name == null || name.Length > 0) { state.Current.FontName = name; break; } } } while(tempStack.Count > 0) { state.TagsWritten.Push(tempStack.Pop()); } } //reset font size to something further down the stack while(state.TagsWritten.Count > 0) { Object o = state.TagsWritten.Pop(); tmpStack.Push(o); if (o is FontStyleTag) { if(((FontStyleTag)o).FontSize != FontSize.Normal) { state.Current.FontSize = ((FontStyleTag)o).FontSize; break; } } } while(tmpStack.Count > 0) { state.TagsWritten.Push(tmpStack.Pop()); } } } } [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 DivStyleTag : StyleTag { private Wrapping _wrapping; private Alignment _alignment; private bool _alignWritten; internal DivStyleTag(int level) : base(level) { _wrapping = Wrapping.Wrap; _alignment = Alignment.Left; _alignWritten = false; } internal Wrapping Wrapping { get { return _wrapping; } set { _wrapping = value; } } internal Alignment Alignment { get { return _alignment; } set { _alignment = value; } } internal bool AlignmentWritten { get { return _alignWritten; } set { _alignWritten = value; } } internal override void CloseTag(WriterState state) { state.Writer.WriteEndTag("div"); state.BreakPending = false; //reset current div info and rebuild state.DivLevel = -1; state.Current.Alignment = Alignment.Left; state.Current.Wrapping = Wrapping.Wrap; Stack tempStack = new Stack(); //reset alignment : ideally these resets could be combined //in practice, the number of items on the stack is small //so it may be comparable //reset wrapping while(state.TagsWritten.Count > 0) { Object o = state.TagsWritten.Pop(); tempStack.Push(o); if(o is DivStyleTag) { if(((DivStyleTag)o).Wrapping == Wrapping.NoWrap) { state.Current.Wrapping = Wrapping.NoWrap; break; } } } while(tempStack.Count > 0) { state.TagsWritten.Push(tempStack.Pop()); } //reset alignment while(state.TagsWritten.Count > 0) { Object o = state.TagsWritten.Pop(); tempStack.Push(o); if(o is DivStyleTag) { if(((DivStyleTag)o).Alignment != Alignment.NotSet) { state.Current.Alignment = ((DivStyleTag)o).Alignment; break; } } } while(tempStack.Count > 0) { state.TagsWritten.Push(tempStack.Pop()); } //reset divLevel while(state.TagsWritten.Count > 0) { Object o = state.TagsWritten.Pop(); tempStack.Push(o); if(o is DivStyleTag) { state.DivLevel = ((DivStyleTag)o).Level; break; } } while(tempStack.Count > 0) { state.TagsWritten.Push(tempStack.Pop()); } } } /* * the StyleStack class maintains WriterStyle objects * pushed on the stack from Enter[Style/Format/Layout] * and removed using Exit[Style/Format/Layout] */ [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 StyleStack { private HtmlMobileTextWriter _writer; private Stack _stack; protected StyleStack(HtmlMobileTextWriter writer) { _writer = writer; _stack = new Stack(); } internal void Push(WriterStyle style) { _stack.Push(style); _writer.ShouldEnsureStyle = true; } internal WriterStyle Pop() { _writer.ShouldEnsureStyle = true; return (WriterStyle)_stack.Pop(); } internal WriterStyle Peek() { if(_stack.Count == 0) { return new WriterStyle(); //retrieves default values } return (WriterStyle)_stack.Peek(); } internal int Count { get { return _stack.Count; } } } /* the WriterState tracks what styles have been entered, what tags have been written and controls transitions from the current state to a desired state */ [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 WriterState : StyleStack { private bool _inTransition = false; //prevent recursion private Stack _stack; //stack of WriterStyle objects private Stack _tagsWritten; //stack of StyleTag objects for written tags private bool _breakPending = false; //track if we owe a
private WriterStyle _current; //the current style private HtmlMobileTextWriter _writer; //the output stream private int _fontLevel = -1; private int _divLevel = -1; private int _mark = 0; internal WriterState(HtmlMobileTextWriter writer) : base(writer) { _writer = writer; _stack = new Stack(); _current = new WriterStyle(); _tagsWritten = new Stack(); } internal WriterStyle Current { get { return _current; } } /* Pushes the current WriterStyle and tagsWritten stack for later use, starts using a new default WriterStyle */ internal void PushState() { _writer.ShouldEnsureStyle = true; _stack.Push(_current); _current = new WriterStyle(); _stack.Push(_tagsWritten); _tagsWritten = new Stack(); _stack.Push(BreakPending); BreakPending = false; } internal int FontLevel { get { return _fontLevel; } set { _fontLevel = value; } } internal int DivLevel { get { return _divLevel; } set { _divLevel = value; } } /* Pops the last WriterStyle pushed and makes it current and restores the tagsWritten stack */ internal WriterStyle PopState() { _writer.ShouldEnsureStyle = true; BreakPending = (bool)_stack.Pop(); //close all open tags while(_tagsWritten.Count > 0) { CloseTag(); } _tagsWritten = (Stack)_stack.Pop(); _current = (WriterStyle)_stack.Pop(); return _current; } /* BreakPending property accessor */ internal bool BreakPending { get { return _breakPending; } set { _breakPending = value; } } internal HtmlTextWriter Writer { get { return _writer; } } internal Stack TagsWritten { get { return _tagsWritten; } } /* pop a tag from the stack of StyleTags, adjust state accordingly */ internal void CloseTag() { StyleTag tag = (StyleTag)_tagsWritten.Pop(); tag.CloseTag(this); } internal void MarkStyleContext() { _mark = _tagsWritten.Count; } internal void UnMarkStyleContext() { while(_tagsWritten.Count > _mark) { CloseTag(); } } private bool FontChange(WriterStyle newStyle) { return ( (( _current.FontColor != newStyle.FontColor ) && (_writer.RenderFontColor)) || (( _current.FontSize != newStyle.FontSize ) && (_writer.RenderFontSize)) || (( _current.FontName != newStyle.FontName ) && (_writer.RenderFontName)) ); } private bool DivChange(WriterStyle newStyle) { return ( (newStyle.Layout) && (((newStyle.Wrapping != _current.Wrapping) && (_writer.RenderDivNoWrap)) || ((newStyle.Alignment != _current.Alignment) && (_writer.RenderDivAlign)) ) ); } internal void Transition(WriterStyle newStyle) { Transition(newStyle, true); } private const String _pocketPC = "Pocket IE"; internal void Transition(WriterStyle newStyle, bool captureOutput) { HtmlMobileTextWriter tempWriter = _writer; try { if(!captureOutput) { tempWriter = _writer; _writer = new HtmlMobileTextWriter( new HtmlTextWriter(new StringWriter(CultureInfo.InvariantCulture)), tempWriter.Device); } if(_inTransition) { return; } else { _inTransition = true; } if(Count == 0) { while(_tagsWritten.Count > 0) { CloseTag(); } _inTransition= false; return; } //close italic if target format !italic if(( _current.Italic && !newStyle.Italic ) && (_writer.RenderItalic)) { while(_current.Italic) { CloseTag(); } } //close bold if target format !bold if(( _current.Bold && !newStyle.Bold ) && (_writer.RenderBold)) { while(_current.Bold) { CloseTag(); } } //if the target FontColor is Color.Empty, then we need to //close all open color tags if( (newStyle.FontColor == Color.Empty) && (_current.FontColor != Color.Empty) && (_writer.RenderFontColor) ) { while(_current.FontColor != Color.Empty) { CloseTag(); } } //if the target FontName is String.Empty, then we need to //close all open name tags if( (newStyle.FontName != null && newStyle.FontName.Length == 0) && (_current.FontName == null || _current.FontName.Length > 0) && (_writer.RenderFontName) ) { while(_current.FontName == null || _current.FontName.Length > 0) { CloseTag(); } } //close the font if it is of the same or a later generation //and differs bool newFont = FontChange(newStyle); if(newFont) { while( FontLevel >= Count ) { CloseTag(); } } //if the new wrapping is Wrap, and the current is NoWrap //the outer NoWrap must be removed if( (newStyle.Wrapping == Wrapping.Wrap) && (_current.Wrapping == Wrapping.NoWrap) && (_writer.RenderDivNoWrap) ) { while(_current.Wrapping != Wrapping.Wrap) { CloseTag(); } } //if the alignment differs for the same generation, close any divs at this level if(( newStyle.Alignment != _current.Alignment ) && ( _writer.RenderDivAlign)) { while( DivLevel >= Count ) { CloseTag(); } } //determine if we will be opening a div before writing any break bool newDiv = DivChange(newStyle); //an opening div will function as a logical break if((BreakPending) && (!(newDiv))) { ((HtmlMobileTextWriter)_writer).WriteBreak(); BreakPending = false; } if(newDiv) { while(_current.Bold || _current.Italic || (FontLevel == Count)) { CloseTag(); } } newFont = FontChange(newStyle); newDiv = DivChange(newStyle); //open div if(newDiv && newStyle.Layout) { DivStyleTag div = new DivStyleTag(Count); BreakPending = false; if( ((_writer.BeforeFirstControlWritten) || (_writer.InputWritten)) && (_writer.Device.Type == _pocketPC) && (_writer.Device.MinorVersion == 0) && (_writer.Device.MajorVersion == 4) && (newStyle.Alignment != _current.Alignment) ) { _writer.WriteBreak(); _writer.InputWritten = false; } _writer.WriteBeginTag("div"); DivLevel = Count; if(newStyle.Wrapping == Wrapping.NoWrap) { if(_writer.RenderDivNoWrap) { _writer.Write(" nowrap"); } div.Wrapping = Wrapping.NoWrap; _current.Wrapping = Wrapping.NoWrap; } else { div.Wrapping = Wrapping.Wrap; _current.Wrapping = Wrapping.Wrap; } if(newStyle.Alignment != _current.Alignment) { if(_writer.RenderDivAlign) { _writer.WriteAttribute( "align", Enum.GetName(typeof(Alignment), newStyle.Alignment)); } _current.Alignment = newStyle.Alignment; div.Alignment = newStyle.Alignment; div.AlignmentWritten = true; } _tagsWritten.Push(div); _writer.Write(">"); } //open font if(newFont && newStyle.Format) { FontStyleTag fontTag = new FontStyleTag(Count); _writer.WriteBeginTag("font"); if(_current.FontSize != newStyle.FontSize) { String relativeSize; if(newStyle.FontSize == FontSize.Large) { relativeSize = ( ((HtmlMobileTextWriter)_writer).Device.Type == _pocketPC) ? "+2" : "+1"; _current.FontSize = FontSize.Large; fontTag.FontSize = FontSize.Large; } else if(newStyle.FontSize == FontSize.Small) { relativeSize = "-1"; _current.FontSize = FontSize.Small; fontTag.FontSize = FontSize.Small; } else //(newStyle.FontSize == FontSize.Normal) { relativeSize = "+0"; _current.FontSize = FontSize.Normal; fontTag.FontSize = FontSize.Normal; } if(_writer.RenderFontSize) { _writer.WriteAttribute("size", relativeSize); } } if(_current.FontColor != newStyle.FontColor) { if(_writer.RenderFontColor) { _writer.WriteAttribute( "color", ColorTranslator.ToHtml(newStyle.FontColor)); } _current.FontColor = newStyle.FontColor; fontTag.Color = newStyle.FontColor; } if(_current.FontName != newStyle.FontName) { if(_writer.RenderFontName) { _writer.WriteAttribute("face", newStyle.FontName); } _current.FontName = newStyle.FontName; fontTag.Name = newStyle.FontName; } _writer.Write(">"); _tagsWritten.Push(fontTag); FontLevel = Count; } //open bold if(newStyle.Format) { if( newStyle.Bold && !_current.Bold && _writer.RenderBold ) { _writer.WriteFullBeginTag("b"); _current.Bold = true; _tagsWritten.Push(new BoldStyleTag(Count)); } //open italic if( newStyle.Italic && !_current.Italic && _writer.RenderItalic ) { _writer.WriteFullBeginTag("i"); _current.Italic = true; _tagsWritten.Push(new ItalicStyleTag(Count)); } } _inTransition = false; } finally { _writer = tempWriter; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ // // Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- using System; using System.Drawing; using System.Globalization; using System.IO; using System.Web; using System.Web.Mobile; using System.Web.UI; using System.Web.UI.MobileControls; using System.Collections; using System.Diagnostics; using System.Security.Permissions; #if COMPILING_FOR_SHIPPED_SOURCE namespace System.Web.UI.MobileControls.ShippedAdapterSource #else namespace System.Web.UI.MobileControls.Adapters #endif { /* * HtmlMobileTextWriter class. */ /// [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 HtmlMobileTextWriter : MobileTextWriter { private bool _shouldEnsureStyle = true; // mobile device type constants (should be defined somewhere else eventually) internal WriterState _currentState; /// public HtmlMobileTextWriter(TextWriter writer, MobileCapabilities device) : base(writer, device) { RenderBold = device.SupportsBold; RenderItalic = device.SupportsItalic; RenderFontSize = device.SupportsFontSize; RenderFontName = device.SupportsFontName; RenderFontColor = device.SupportsFontColor; RenderBodyColor = device.SupportsBodyColor; RenderDivAlign = device.SupportsDivAlign; RenderDivNoWrap = device.SupportsDivNoWrap; RequiresNoBreakInFormatting = device.RequiresNoBreakInFormatting; _currentState = new WriterState(this); } /* * the following TextWriter methods are overridden to * first call EnsureStyle before delegating to the base * class implementation */ /// public override void WriteBeginTag(String tag) { EnsureStyle(); base.WriteBeginTag(tag); } /// public override void WriteFullBeginTag(String tag) { EnsureStyle(); base.WriteFullBeginTag(tag); } /// public override void Write(char c) { EnsureStyle(); base.Write(c); } /// public override void Write(String text) { EnsureStyle(); base.Write(text); } /// public override void WriteEncodedText(String text) { EnsureStyle(); if(Device["supportsCharacterEntityEncoding"] != "false") { base.WriteEncodedText(text); return; } if (null == text || text.Length == 0) { return; } int length = text.Length; int start = -1; for(int pos = 0; pos < length; pos++) { int ch = text[pos]; if(ch > 160 && ch < 256) { if(start != -1) { base.WriteEncodedText(text.Substring(start, pos - start)); start = -1; } base.Write(text[pos]); } else { if(start == -1) { start = pos; } } } if(start != -1) { if(start == 0) { base.WriteEncodedText(text); } else { base.WriteEncodedText(text.Substring(start, length - start)); } } } /// public override void WriteLine(String text) { EnsureStyle(); base.WriteLine(text); } /// public new void WriteBreak() { //Do not EnsureStyle for the break base.WriteLine("
"); } /// public override void EnterLayout(Style style) { WriterStyle writerStyle = new WriterStyle(style); writerStyle.Format = false; EnterStyle(writerStyle); } /// public override void ExitLayout(Style style, bool breakAfter) { ExitStyle(style, breakAfter); } /// public override void ExitLayout(Style style) { ExitStyle(style, false); } /// protected internal void MarkStyleContext() { _shouldEnsureStyle = true; _currentState.MarkStyleContext(); } /// protected internal void UnMarkStyleContext() { _shouldEnsureStyle = true; _currentState.UnMarkStyleContext(); } /// public override void EnterFormat(Style style) { WriterStyle writerStyle = new WriterStyle(style); writerStyle.Layout = false; EnterStyle(writerStyle); } /// public override void ExitFormat(Style style) { ExitStyle(style); } /// public override void ExitFormat(Style style, bool breakAfter) { ExitStyle(style, breakAfter); } /// public void BeginStyleContext() { if(_currentState.BreakPending) { WriteBreak(); _currentState.BreakPending = false; } _currentState.PushState(); EnterStyle(new WriterStyle()); } /// public void EndStyleContext() { if(_currentState.BreakPending) { WriteBreak(); _currentState.BreakPending = false; } _currentState.PopState(); _currentState.Pop(); _currentState.Transition(new WriterStyle()); } /* all calls to Enter... converge to this */ private void EnterStyle(WriterStyle style) { _currentState.Push(style); } /// public new void EnterStyle(Style style) { EnterStyle(new WriterStyle(style)); } /// public new void ExitStyle(Style style) { ExitStyle(style, false); } internal bool ShouldEnsureStyle { get { return _shouldEnsureStyle; } set { _shouldEnsureStyle = value; } } /* all calls to Exit... converge to this */ /// public void ExitStyle(Style style, bool breakAfter) { _currentState.Pop(); if((_currentState.BreakPending) && (_currentState.Count > 0)) { EnsureStyle(); } _currentState.BreakPending = breakAfter; if((_currentState.Count == 0) || (RequiresNoBreakInFormatting)) { _currentState.Transition(new WriterStyle()); } InputWritten = false; } internal bool _inputWritten = false; internal bool InputWritten { get { return _inputWritten; } set { _inputWritten = value; } } internal void EnsureStyle() { if (_shouldEnsureStyle) { if(_currentState.Count > 0) { _currentState.Transition(_currentState.Peek()); } _shouldEnsureStyle = false; } if(BeforeFirstControlWritten) { BeforeFirstControlWritten = false; } } /// public void WriteText(String text, bool encodeText) { if(text != null && text.Length == 0) { return; } EnsureStyle(); if (encodeText) { WriteEncodedText(text); } else { Write(text); } } /// public void WriteUrlParameter(String name, String value) { WriteEncodedUrlParameter(name); Write("="); WriteEncodedUrlParameter(value); } /// public void WriteHiddenField(String name, String value) { WriteBeginTag("input"); WriteAttribute("type", "hidden"); WriteAttribute("name", name); WriteAttribute("value", value, true); Write(">\r\n"); } // AUI 2285 private bool _beforeFirstControlWritten = true; internal bool BeforeFirstControlWritten { get { return _beforeFirstControlWritten; } set { _beforeFirstControlWritten = value; } } private bool _maintainState = true; internal bool MaintainState { get { return _maintainState; } set { _maintainState = value; } } /// protected internal bool RenderBold { get { return _renderBold; } set { _renderBold = value; } } /// protected internal bool RenderItalic { get { return _renderItalic; } set { _renderItalic = value; } } /// protected internal bool RenderFontSize { get { return _renderFontSize; } set { _renderFontSize = value; } } /// protected internal bool RenderFontName { get { return _renderFontName; } set { _renderFontName = value; } } /// protected internal bool RenderFontColor { get { return _renderFontColor; } set { _renderFontColor = value; } } /// protected internal bool RenderBodyColor { get { return _renderBodyColor; } set { _renderBodyColor = value; } } /// protected internal bool RenderDivAlign { get { return _renderDivAlign; } set { _renderDivAlign = value; } } /// protected internal bool RenderDivNoWrap { get { return _renderDivNoWrap; } set { _renderDivNoWrap = value; } } /// protected internal bool RequiresNoBreakInFormatting { get { return _requiresNoBreakInFormatting; } set { _requiresNoBreakInFormatting = value; } } private bool _renderBold = true; private bool _renderItalic = true; private bool _renderFontSize = true; private bool _renderFontName = true; private bool _renderFontColor = true; private bool _renderBodyColor = true; private bool _renderDivAlign = true; private bool _renderDivNoWrap = false; private bool _requiresNoBreakInFormatting = false; } /* * the WriterStyle class is used to store and * control state for rendering format and layout */ [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 WriterStyle { private Wrapping _wrapping; private Alignment _alignment; private String _fontName; private Color _fontColor; private FontSize _fontSize; private bool _bold; private bool _italic; private bool _format; private bool _layout; internal WriterStyle() { _wrapping = Wrapping.Wrap; _alignment = Alignment.Left; _fontName = String.Empty; _fontColor = Color.Empty; _fontSize = FontSize.Normal; _bold = false; _italic = false; _format = true; _layout = true; } internal WriterStyle(Style style) { Debug.Assert(style != null, "writer style is null"); _alignment = (Alignment) style[Style.AlignmentKey, true]; if(_alignment == Alignment.NotSet) { _alignment = Alignment.Left; } _wrapping = (Wrapping) style[Style.WrappingKey, true]; if(_wrapping == Wrapping.NotSet) { _wrapping = Wrapping.Wrap; } _fontSize = (FontSize) style[Style.FontSizeKey , true]; if(_fontSize == FontSize.NotSet) { _fontSize = FontSize.Normal; } _fontName = (String) style[Style.FontNameKey , true]; _fontColor = (Color) style[Style.ForeColorKey, true]; _bold = ((BooleanOption) style[Style.BoldKey, true] == BooleanOption.True); _italic = ((BooleanOption) style[Style.ItalicKey, true] == BooleanOption.True); _format = true; _layout = true; } internal bool Format { get { return _format; } set { _format = value; } } internal bool Layout { get { return _layout; } set { _layout = value; } } internal Wrapping Wrapping { get { return _wrapping; } set { _wrapping = value; } } internal Alignment Alignment { get { return _alignment; } set { _alignment = value; } } internal String FontName { get { return _fontName; } set { _fontName = value; } } internal Color FontColor { get { return _fontColor; } set { _fontColor = value; } } internal FontSize FontSize { get { return _fontSize; } set { _fontSize = value; } } internal bool Bold { get { return _bold; } set { _bold = value; } } internal bool Italic { get { return _italic; } set { _italic = value; } } } /* * The StyleTag class is extended for specific tags */ [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 abstract class StyleTag { private int _level = -1; #if UNUSED_CODE internal StyleTag() { } #endif internal StyleTag(int level) { _level = level; } internal virtual int Level { get { return _level; } set { _level = value; } } internal abstract void CloseTag(WriterState state); } [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 BoldStyleTag : StyleTag { internal BoldStyleTag(int level) : base(level) { } internal override void CloseTag(WriterState state) { state.Writer.WriteEndTag("b"); state.Current.Bold = false; } } [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 ItalicStyleTag : StyleTag { internal ItalicStyleTag(int level) : base(level) { } internal override void CloseTag(WriterState state) { state.Writer.WriteEndTag("i"); state.Current.Italic = false; } } [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 FontStyleTag : StyleTag { private String _name; private Color _color; private FontSize _size; internal FontStyleTag(int level) : base(level) { _name = String.Empty; _color = Color.Empty; _size = FontSize.Normal; } #if UNUSED_CODE internal FontStyleTag(int level, String name, Color color, FontSize size) : base(level) { Name = _name; Color = color; FontSize = size; } #endif internal String Name { get { return _name; } set { _name = value; } } internal Color Color { get { return _color; } set { _color = value; } } internal FontSize FontSize { get { return _size; } set { _size = value; } } internal override void CloseTag(WriterState state) { state.Writer.WriteEndTag("font"); //reset FontLevel and rebuild state info state.FontLevel = -1; state.Current.FontColor = Color.Empty; state.Current.FontName = String.Empty; state.Current.FontSize = FontSize.Normal; //reset the FontLevel Stack tmpStack = new Stack(); while(state.TagsWritten.Count > 0) { Object o = state.TagsWritten.Pop(); tmpStack.Push(o); if(o is FontStyleTag) { state.FontLevel = ((FontStyleTag)o).Level; break; } } while(tmpStack.Count > 0) { state.TagsWritten.Push(tmpStack.Pop()); } //there is a font tag in the stack if(state.FontLevel > -1) { if(Color != Color.Empty) { //reset font color to something further down the stack Stack tempStack = new Stack(); while(state.TagsWritten.Count > 0) { Object o = state.TagsWritten.Pop(); tempStack.Push(o); if(o is FontStyleTag) { if(((FontStyleTag)o).Color != Color.Empty) { state.Current.FontColor = ((FontStyleTag)o).Color; break; } } } while(tempStack.Count > 0) { state.TagsWritten.Push(tempStack.Pop()); } } if(Name == null || Name.Length > 0) { //reset font name to something futher down the stack Stack tempStack = new Stack(); while(state.TagsWritten.Count > 0) { Object o = state.TagsWritten.Pop(); tempStack.Push(o); if(o is FontStyleTag) { String name = ((FontStyleTag)o).Name; if(name == null || name.Length > 0) { state.Current.FontName = name; break; } } } while(tempStack.Count > 0) { state.TagsWritten.Push(tempStack.Pop()); } } //reset font size to something further down the stack while(state.TagsWritten.Count > 0) { Object o = state.TagsWritten.Pop(); tmpStack.Push(o); if (o is FontStyleTag) { if(((FontStyleTag)o).FontSize != FontSize.Normal) { state.Current.FontSize = ((FontStyleTag)o).FontSize; break; } } } while(tmpStack.Count > 0) { state.TagsWritten.Push(tmpStack.Pop()); } } } } [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 DivStyleTag : StyleTag { private Wrapping _wrapping; private Alignment _alignment; private bool _alignWritten; internal DivStyleTag(int level) : base(level) { _wrapping = Wrapping.Wrap; _alignment = Alignment.Left; _alignWritten = false; } internal Wrapping Wrapping { get { return _wrapping; } set { _wrapping = value; } } internal Alignment Alignment { get { return _alignment; } set { _alignment = value; } } internal bool AlignmentWritten { get { return _alignWritten; } set { _alignWritten = value; } } internal override void CloseTag(WriterState state) { state.Writer.WriteEndTag("div"); state.BreakPending = false; //reset current div info and rebuild state.DivLevel = -1; state.Current.Alignment = Alignment.Left; state.Current.Wrapping = Wrapping.Wrap; Stack tempStack = new Stack(); //reset alignment : ideally these resets could be combined //in practice, the number of items on the stack is small //so it may be comparable //reset wrapping while(state.TagsWritten.Count > 0) { Object o = state.TagsWritten.Pop(); tempStack.Push(o); if(o is DivStyleTag) { if(((DivStyleTag)o).Wrapping == Wrapping.NoWrap) { state.Current.Wrapping = Wrapping.NoWrap; break; } } } while(tempStack.Count > 0) { state.TagsWritten.Push(tempStack.Pop()); } //reset alignment while(state.TagsWritten.Count > 0) { Object o = state.TagsWritten.Pop(); tempStack.Push(o); if(o is DivStyleTag) { if(((DivStyleTag)o).Alignment != Alignment.NotSet) { state.Current.Alignment = ((DivStyleTag)o).Alignment; break; } } } while(tempStack.Count > 0) { state.TagsWritten.Push(tempStack.Pop()); } //reset divLevel while(state.TagsWritten.Count > 0) { Object o = state.TagsWritten.Pop(); tempStack.Push(o); if(o is DivStyleTag) { state.DivLevel = ((DivStyleTag)o).Level; break; } } while(tempStack.Count > 0) { state.TagsWritten.Push(tempStack.Pop()); } } } /* * the StyleStack class maintains WriterStyle objects * pushed on the stack from Enter[Style/Format/Layout] * and removed using Exit[Style/Format/Layout] */ [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 StyleStack { private HtmlMobileTextWriter _writer; private Stack _stack; protected StyleStack(HtmlMobileTextWriter writer) { _writer = writer; _stack = new Stack(); } internal void Push(WriterStyle style) { _stack.Push(style); _writer.ShouldEnsureStyle = true; } internal WriterStyle Pop() { _writer.ShouldEnsureStyle = true; return (WriterStyle)_stack.Pop(); } internal WriterStyle Peek() { if(_stack.Count == 0) { return new WriterStyle(); //retrieves default values } return (WriterStyle)_stack.Peek(); } internal int Count { get { return _stack.Count; } } } /* the WriterState tracks what styles have been entered, what tags have been written and controls transitions from the current state to a desired state */ [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 WriterState : StyleStack { private bool _inTransition = false; //prevent recursion private Stack _stack; //stack of WriterStyle objects private Stack _tagsWritten; //stack of StyleTag objects for written tags private bool _breakPending = false; //track if we owe a
private WriterStyle _current; //the current style private HtmlMobileTextWriter _writer; //the output stream private int _fontLevel = -1; private int _divLevel = -1; private int _mark = 0; internal WriterState(HtmlMobileTextWriter writer) : base(writer) { _writer = writer; _stack = new Stack(); _current = new WriterStyle(); _tagsWritten = new Stack(); } internal WriterStyle Current { get { return _current; } } /* Pushes the current WriterStyle and tagsWritten stack for later use, starts using a new default WriterStyle */ internal void PushState() { _writer.ShouldEnsureStyle = true; _stack.Push(_current); _current = new WriterStyle(); _stack.Push(_tagsWritten); _tagsWritten = new Stack(); _stack.Push(BreakPending); BreakPending = false; } internal int FontLevel { get { return _fontLevel; } set { _fontLevel = value; } } internal int DivLevel { get { return _divLevel; } set { _divLevel = value; } } /* Pops the last WriterStyle pushed and makes it current and restores the tagsWritten stack */ internal WriterStyle PopState() { _writer.ShouldEnsureStyle = true; BreakPending = (bool)_stack.Pop(); //close all open tags while(_tagsWritten.Count > 0) { CloseTag(); } _tagsWritten = (Stack)_stack.Pop(); _current = (WriterStyle)_stack.Pop(); return _current; } /* BreakPending property accessor */ internal bool BreakPending { get { return _breakPending; } set { _breakPending = value; } } internal HtmlTextWriter Writer { get { return _writer; } } internal Stack TagsWritten { get { return _tagsWritten; } } /* pop a tag from the stack of StyleTags, adjust state accordingly */ internal void CloseTag() { StyleTag tag = (StyleTag)_tagsWritten.Pop(); tag.CloseTag(this); } internal void MarkStyleContext() { _mark = _tagsWritten.Count; } internal void UnMarkStyleContext() { while(_tagsWritten.Count > _mark) { CloseTag(); } } private bool FontChange(WriterStyle newStyle) { return ( (( _current.FontColor != newStyle.FontColor ) && (_writer.RenderFontColor)) || (( _current.FontSize != newStyle.FontSize ) && (_writer.RenderFontSize)) || (( _current.FontName != newStyle.FontName ) && (_writer.RenderFontName)) ); } private bool DivChange(WriterStyle newStyle) { return ( (newStyle.Layout) && (((newStyle.Wrapping != _current.Wrapping) && (_writer.RenderDivNoWrap)) || ((newStyle.Alignment != _current.Alignment) && (_writer.RenderDivAlign)) ) ); } internal void Transition(WriterStyle newStyle) { Transition(newStyle, true); } private const String _pocketPC = "Pocket IE"; internal void Transition(WriterStyle newStyle, bool captureOutput) { HtmlMobileTextWriter tempWriter = _writer; try { if(!captureOutput) { tempWriter = _writer; _writer = new HtmlMobileTextWriter( new HtmlTextWriter(new StringWriter(CultureInfo.InvariantCulture)), tempWriter.Device); } if(_inTransition) { return; } else { _inTransition = true; } if(Count == 0) { while(_tagsWritten.Count > 0) { CloseTag(); } _inTransition= false; return; } //close italic if target format !italic if(( _current.Italic && !newStyle.Italic ) && (_writer.RenderItalic)) { while(_current.Italic) { CloseTag(); } } //close bold if target format !bold if(( _current.Bold && !newStyle.Bold ) && (_writer.RenderBold)) { while(_current.Bold) { CloseTag(); } } //if the target FontColor is Color.Empty, then we need to //close all open color tags if( (newStyle.FontColor == Color.Empty) && (_current.FontColor != Color.Empty) && (_writer.RenderFontColor) ) { while(_current.FontColor != Color.Empty) { CloseTag(); } } //if the target FontName is String.Empty, then we need to //close all open name tags if( (newStyle.FontName != null && newStyle.FontName.Length == 0) && (_current.FontName == null || _current.FontName.Length > 0) && (_writer.RenderFontName) ) { while(_current.FontName == null || _current.FontName.Length > 0) { CloseTag(); } } //close the font if it is of the same or a later generation //and differs bool newFont = FontChange(newStyle); if(newFont) { while( FontLevel >= Count ) { CloseTag(); } } //if the new wrapping is Wrap, and the current is NoWrap //the outer NoWrap must be removed if( (newStyle.Wrapping == Wrapping.Wrap) && (_current.Wrapping == Wrapping.NoWrap) && (_writer.RenderDivNoWrap) ) { while(_current.Wrapping != Wrapping.Wrap) { CloseTag(); } } //if the alignment differs for the same generation, close any divs at this level if(( newStyle.Alignment != _current.Alignment ) && ( _writer.RenderDivAlign)) { while( DivLevel >= Count ) { CloseTag(); } } //determine if we will be opening a div before writing any break bool newDiv = DivChange(newStyle); //an opening div will function as a logical break if((BreakPending) && (!(newDiv))) { ((HtmlMobileTextWriter)_writer).WriteBreak(); BreakPending = false; } if(newDiv) { while(_current.Bold || _current.Italic || (FontLevel == Count)) { CloseTag(); } } newFont = FontChange(newStyle); newDiv = DivChange(newStyle); //open div if(newDiv && newStyle.Layout) { DivStyleTag div = new DivStyleTag(Count); BreakPending = false; if( ((_writer.BeforeFirstControlWritten) || (_writer.InputWritten)) && (_writer.Device.Type == _pocketPC) && (_writer.Device.MinorVersion == 0) && (_writer.Device.MajorVersion == 4) && (newStyle.Alignment != _current.Alignment) ) { _writer.WriteBreak(); _writer.InputWritten = false; } _writer.WriteBeginTag("div"); DivLevel = Count; if(newStyle.Wrapping == Wrapping.NoWrap) { if(_writer.RenderDivNoWrap) { _writer.Write(" nowrap"); } div.Wrapping = Wrapping.NoWrap; _current.Wrapping = Wrapping.NoWrap; } else { div.Wrapping = Wrapping.Wrap; _current.Wrapping = Wrapping.Wrap; } if(newStyle.Alignment != _current.Alignment) { if(_writer.RenderDivAlign) { _writer.WriteAttribute( "align", Enum.GetName(typeof(Alignment), newStyle.Alignment)); } _current.Alignment = newStyle.Alignment; div.Alignment = newStyle.Alignment; div.AlignmentWritten = true; } _tagsWritten.Push(div); _writer.Write(">"); } //open font if(newFont && newStyle.Format) { FontStyleTag fontTag = new FontStyleTag(Count); _writer.WriteBeginTag("font"); if(_current.FontSize != newStyle.FontSize) { String relativeSize; if(newStyle.FontSize == FontSize.Large) { relativeSize = ( ((HtmlMobileTextWriter)_writer).Device.Type == _pocketPC) ? "+2" : "+1"; _current.FontSize = FontSize.Large; fontTag.FontSize = FontSize.Large; } else if(newStyle.FontSize == FontSize.Small) { relativeSize = "-1"; _current.FontSize = FontSize.Small; fontTag.FontSize = FontSize.Small; } else //(newStyle.FontSize == FontSize.Normal) { relativeSize = "+0"; _current.FontSize = FontSize.Normal; fontTag.FontSize = FontSize.Normal; } if(_writer.RenderFontSize) { _writer.WriteAttribute("size", relativeSize); } } if(_current.FontColor != newStyle.FontColor) { if(_writer.RenderFontColor) { _writer.WriteAttribute( "color", ColorTranslator.ToHtml(newStyle.FontColor)); } _current.FontColor = newStyle.FontColor; fontTag.Color = newStyle.FontColor; } if(_current.FontName != newStyle.FontName) { if(_writer.RenderFontName) { _writer.WriteAttribute("face", newStyle.FontName); } _current.FontName = newStyle.FontName; fontTag.Name = newStyle.FontName; } _writer.Write(">"); _tagsWritten.Push(fontTag); FontLevel = Count; } //open bold if(newStyle.Format) { if( newStyle.Bold && !_current.Bold && _writer.RenderBold ) { _writer.WriteFullBeginTag("b"); _current.Bold = true; _tagsWritten.Push(new BoldStyleTag(Count)); } //open italic if( newStyle.Italic && !_current.Italic && _writer.RenderItalic ) { _writer.WriteFullBeginTag("i"); _current.Italic = true; _tagsWritten.Push(new ItalicStyleTag(Count)); } } _inTransition = false; } finally { _writer = tempWriter; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK