Exemplo n.º 1
0
        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;
            }
        }
        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;
            }
        }