File: UI\MobileControls\CompileLiteralTextParser.cs
Project: ndp\fx\src\mit\System\Web\System.Web.Mobile.csproj (System.Web.Mobile)
//------------------------------------------------------------------------------
// <copyright file="CompileLiteralTextParser.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>                                                                
//------------------------------------------------------------------------------
 
using System;
using System.Collections;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Web.UI;
 
namespace System.Web.UI.MobileControls
{
    /*
     * CompileLiteralTextParser class.
     *
     * This is a specialized version of the LiteralTextParser class.
     * It creates a set of control builders from the parsed literal text.
     *
     * Copyright (c) 2000 Microsoft Corporation
     */
 
    [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 CompileLiteralTextParser : LiteralTextParser
    {
        TemplateParser _parser;
        ControlBuilder _parentBuilder;
        String _fileName;
        int _lineNumber;
        IList _tagInnerTextElements = null;
 
        internal CompileLiteralTextParser(TemplateParser parser, 
                                        ControlBuilder parentBuilder, 
                                        String fileName, 
                                        int lineNumber)
        {
            _parser = parser;
            _parentBuilder = parentBuilder;
            _fileName = fileName;
            _lineNumber = lineNumber;
        }
 
        protected override void ProcessElement(LiteralElement element)
        {
            ControlBuilder subBuilder;
 
            switch (element.Type)
            {
                case LiteralElementType.Text:
                    Debug.Assert(_tagInnerTextElements == null);
                    subBuilder = ControlBuilder.CreateBuilderFromType(
                                        _parser, _parentBuilder,
                                        typeof(LiteralText), typeof(LiteralText).Name,
                                        null, 
                                        GetPropertyDictionary(element.Format, element.BreakAfter, null),
                                        _lineNumber, _fileName);
                    break;
 
                case LiteralElementType.Anchor:
                {
                    String linkUrl = (String)element.GetAttribute("href");
                    subBuilder = ControlBuilder.CreateBuilderFromType(
                                        _parser, _parentBuilder,
                                        typeof(LiteralLink), typeof(LiteralLink).Name,
                                        null, 
                                        GetPropertyDictionary(element.Format, element.BreakAfter, linkUrl),
                                        _lineNumber, _fileName);
                    AddTagInnerTextElements(subBuilder);
                    break;
                }
 
                default:
                    return;
            }
 
            _parentBuilder.AppendSubBuilder(subBuilder);
 
            if (element.Text == null || element.Text.Length != 0)
            {
                subBuilder.AppendLiteralString(element.Text);
            }
        }
 
        private IList TagInnerTextElements
        {
            get
            {
                if (_tagInnerTextElements == null)
                {
                    _tagInnerTextElements = new ArrayList();
                }
                return _tagInnerTextElements;
            }
        }
 
        private void AddTagInnerTextElements(ControlBuilder builder)
        {
            if (_tagInnerTextElements != null)
            {
                foreach(Object o in _tagInnerTextElements)
                {
                    if (o is String)
                    {
                        builder.AppendLiteralString((String)o);
                    }
                    else
                    {
                        builder.AppendSubBuilder((ControlBuilder)o);
                    }
                }
                _tagInnerTextElements = null;
            }
        }
 
        protected override void ProcessTagInnerText(String text)
        {
            // Called to add an inner text segment of a multi-segment tag, e.g.
            //      <a ...>some text <%# a databinding %> some more text</a>
 
            TagInnerTextElements.Add(text);
        }
 
        internal /*public*/ void AddDataBinding(ControlBuilder builder)
        {
            if (IsInTag)
            {
                TagInnerTextElements.Add(builder);
            }
            else
            {
                ControlBuilder newBuilder = ControlBuilder.CreateBuilderFromType(
                                              _parser, _parentBuilder,
                                              typeof(LiteralText), typeof(LiteralText).Name,
                                            null, 
                                            GetPropertyDictionary(CurrentFormat, false, null),
                                            _lineNumber, _fileName);
                _parentBuilder.AppendSubBuilder(newBuilder);
                newBuilder.AppendSubBuilder(builder);
                OnAfterDataBoundLiteral();
            }
        }
 
        // Convert formatting and other options into a set of properties, just as if they had been
        // specified in persistence format.
 
        private ListDictionary GetPropertyDictionary(LiteralFormat format, bool breakAfter, String linkUrl)
        {
            ListDictionary dictionary = null;
            if (format != LiteralFormat.None || !breakAfter || linkUrl != null)
            {
                dictionary = new ListDictionary();
                if ((format & LiteralFormat.Bold) == LiteralFormat.Bold)
                {
                    dictionary.Add("Font-Bold", "True");
                }
                if ((format & LiteralFormat.Italic) == LiteralFormat.Italic)
                {
                    dictionary.Add("Font-Italic", "True");
                }
                if(!breakAfter)
                {
                    dictionary.Add("BreakAfter", "False");
                }
                if (linkUrl != null)
                {
                    dictionary.Add("NavigateUrl", linkUrl);
                }
            }
 
            return dictionary;
        }
    }
 
}