Пример #1
0
 /// <include file='doc\XhtmlBasicValidatorAdapter.uex' path='docs/doc[@for="XhtmlValidatorAdapter.Render"]/*' />
 public override void Render(XhtmlMobileTextWriter writer)
 {
     if (!Control.IsValid && Control.Display != WebControls.ValidatorDisplay.None)
     {
         ConditionalEnterStyle(writer, Style);
         ConditionalRenderOpeningSpanElement(writer);
         writer.WritePendingBreak();
         String controlText         = Control.Text;
         String controlErrorMessage = Control.ErrorMessage;
         if (controlText != null & controlText.Length > 0)
         {
             // ConditionalClearCachedEndTag() is for a device special case.
             ConditionalClearCachedEndTag(writer, Control.Text);
             writer.WriteEncodedText(Control.Text);
         }
         else if (controlErrorMessage != null && controlErrorMessage.Length > 0)
         {
             ConditionalClearCachedEndTag(writer, Control.ErrorMessage);
             writer.WriteEncodedText(Control.ErrorMessage);
         }
         // ConditionalSetPendingBreak should always be called *before* ConditionalExitStyle.
         // ConditionalExitStyle may render a block element and clear the pending break.
         ConditionalSetPendingBreak(writer);
         ConditionalRenderClosingSpanElement(writer);
         ConditionalExitStyle(writer, Style);
     }
 }
Пример #2
0
        private void RenderListItem(XhtmlMobileTextWriter writer, MobileListItem item)
        {
            String accessKey = GetCustomAttributeValue(item, XhtmlConstants.AccessKeyCustomAttribute);
            String cssClass  = GetCustomAttributeValue(item, XhtmlConstants.CssClassCustomAttribute);

            if (Control.ItemsAsLinks)
            {
                RenderBeginLink(writer, item.Value, accessKey, Style, cssClass);
                writer.WriteEncodedText(item.Text);
                RenderEndLink(writer);
            }
            else if (Control.HasItemCommandHandler)
            {
                RenderPostBackEventAsAnchor(writer,
                                            item.Index.ToString(CultureInfo.InvariantCulture) /*event argument*/,
                                            item.Text /*link text*/,
                                            accessKey,
                                            Style,
                                            cssClass);
            }
            else
            {
                writer.WriteEncodedText(item.Text);
            }
        }
        private void RenderListViewTableHeader(XhtmlMobileTextWriter writer, int fieldCount, int[] fieldIndices, bool itemRequiresMoreButton)
        {
            String cssClass   = GetCustomAttributeValue(XhtmlConstants.CssClassCustomAttribute);
            String labelClass = GetCustomAttributeValue(XhtmlConstants.CssLabelClassCustomAttribute);

            if (labelClass == null || labelClass.Length == 0)
            {
                labelClass = cssClass;
            }
            writer.WriteLine("<tr>");
            for (int field = 0; field < fieldCount; field++)
            {
                writer.WriteBeginTag("td");
                if (CssLocation == StyleSheetLocation.PhysicalFile && labelClass != null && labelClass.Length > 0)
                {
                    writer.WriteAttribute("class", labelClass, true);
                }
                writer.Write(">");
                Style labelStyle = Control.LabelStyle;
                ConditionalEnterStyle(writer, labelStyle);
                writer.WriteEncodedText(Control.AllFields[fieldIndices[field]].Title);
                ConditionalExitStyle(writer, labelStyle);
                writer.Write("</td>");
            }
            if (itemRequiresMoreButton)
            {
                writer.WriteLine("<td/>");
            }
            writer.WriteLine();
            writer.WriteLine("</tr>");
        }
 // For Style/CssClass args, see ASURT 144034
 /// <include file='doc\XhtmlBasicControlAdapter.uex' path='docs/doc[@for="XhtmlControlAdapter.RenderPostBackEventAsAnchor2"]/*' />
 protected virtual void RenderPostBackEventAsAnchor(
     XhtmlMobileTextWriter writer,
     String argument,
     String linkText,
     String accessKey,
     Style style,
     String cssClass)
 {
     writer.WriteBeginTag("a");
     writer.Write(" href=\"");
     PageAdapter.RenderUrlPostBackEvent(writer, Control.UniqueID /* target */, argument);
     writer.Write("\" ");
     if (accessKey != null && accessKey.Length > 0)
     {
         writer.WriteAttribute("accesskey", accessKey);
     }
     if ((String)Device[XhtmlConstants.RequiresXhtmlCssSuppression] != "true")
     {
         if (CssLocation != StyleSheetLocation.PhysicalFile)
         {
             String className = writer.GetCssFormatClassName(style);
             if (className != null)
             {
                 writer.WriteAttribute("class", className);
             }
         }
         else if (cssClass != null && cssClass.Length > 0)
         {
             writer.WriteAttribute("class", cssClass, true /* encode */);
         }
     }
     writer.Write(">");
     writer.WriteEncodedText(linkText);
     writer.WriteEndTag("a");
 }
        /// <include file='doc\XhtmlBasicTextViewAdapter.uex' path='docs/doc[@for="XhtmlTextViewAdapter.RenderElement"]/*' />
        public void RenderElement(XhtmlMobileTextWriter writer, int index, int beginSubstring, int endSubstring)
        {
            TextViewElement element = Control.GetElement(index);

            writer.WritePendingBreak();
            if (endSubstring == -1)
            {
                endSubstring = element.Text.Length;
            }
            String text = element.Text;

            if (beginSubstring > 0 || endSubstring < text.Length)
            {
                text = text.Substring(beginSubstring, endSubstring - beginSubstring);
            }
            BooleanOption prevBold   = Style.Font.Bold;
            BooleanOption prevItalic = Style.Font.Italic;

            if (element.IsBold)
            {
                Style.Font.Bold = BooleanOption.True;
            }
            if (element.IsItalic)
            {
                Style.Font.Italic = BooleanOption.True;
            }
            ConditionalEnterStyle(writer, Style);
            if (element.Url != null)
            {
                RenderBeginLink(writer, element.Url);
                writer.WriteEncodedText(text);
                RenderEndLink(writer);
            }
            else
            {
                writer.WriteEncodedText(text);
            }
            if (element.BreakAfter)
            {
                writer.SetPendingBreak();
            }
            ConditionalExitStyle(writer, Style);
            Style.Font.Bold   = prevBold;
            Style.Font.Italic = prevItalic;
        }
        // Writes the href value for RenderBeginLink, depending on whether the target is a new form on the
        // current page or a standard url (e.g., a new page).
        private void RenderHrefValue(XhtmlMobileTextWriter writer, String target)
        {
            bool appendCookielessDataDictionary = PageAdapter.PersistCookielessData &&
                                                  !target.StartsWith("http:", StringComparison.Ordinal) &&
                                                  !target.StartsWith("https:", StringComparison.Ordinal);
            bool queryStringWritten = false;

            // ASURT 144021
            if (target == null || target.Length == 0)
            {
                target = Page.Response.ApplyAppPathModifier(Control.TemplateSourceDirectory);
            }



            if (target.StartsWith(Constants.FormIDPrefix, StringComparison.Ordinal))
            {
                RenderFormNavigationHrefValue(writer, target);
                appendCookielessDataDictionary = false;
            }
            else
            {
                // For page adapter Control = null.
                if (Control != null)
                {
                    target = Control.ResolveUrl(target);
                }

                // ASURT 147179
                if ((String)Device["requiresAbsolutePostbackUrl"] == "true" &&
                    IsRelativeUrl(target))
                {
                    String templateSourceDirectory = Page.TemplateSourceDirectory;
                    String prefix = writer.EncodeUrlInternal(Page.Response.ApplyAppPathModifier(Page.TemplateSourceDirectory));
                    if (prefix[prefix.Length - 1] != '/')
                    {
                        prefix = prefix + '/';
                    }
                    target = prefix + target;
                }

                if ((String)Device[XhtmlConstants.SupportsUrlAttributeEncoding] != "false")
                {
                    writer.WriteEncodedText(target);
                }
                else
                {
                    writer.Write(target);
                }
                queryStringWritten = target.IndexOf('?') != -1;
            }

            if (appendCookielessDataDictionary)
            {
                RenderCookielessDataDictionaryInQueryString(writer, queryStringWritten);
            }
        }
        /// <include file='doc\XhtmlBasicValidationSummaryAdapter.uex' path='docs/doc[@for="XhtmlValidationSummaryAdapter.Render"]/*' />
        public override void Render(XhtmlMobileTextWriter writer)
        {
            String[] errorMessages = null;

            if (Control.Visible)
            {
                errorMessages = Control.GetErrorMessages();
            }

            if (errorMessages != null)
            {
                ConditionalEnterStyle(writer, Style, "div");
                ConditionalRenderOpeningDivElement(writer);
                if (Control.HeaderText.Length > 0)
                {
                    // ConditionalClearCachedEndTag() is for a device special case.
                    ConditionalClearCachedEndTag(writer, Control.HeaderText);
                    writer.WriteEncodedText(Control.HeaderText);
                }

                ArrayList arr = new ArrayList();
                foreach (String errorMessage in errorMessages)
                {
                    Debug.Assert(errorMessage != null && errorMessage.Length > 0, "Bad Error Messages");
                    arr.Add(errorMessage);
                }

                _list.Decoration = ListDecoration.Bulleted;
                _list.DataSource = arr;
                _list.DataBind();

                if (String.Compare(Control.FormToValidate, Control.Form.UniqueID, true, CultureInfo.CurrentCulture) != 0)
                {
                    _link.NavigateUrl = Constants.FormIDPrefix + Control.FormToValidate;
                    String controlBackLabel = Control.BackLabel;
                    _link.Text = controlBackLabel == null || controlBackLabel.Length == 0 ? GetDefaultLabel(BackLabel) : controlBackLabel;
                    // Summary writes its own break so last control should write one.
                    _link.BreakAfter = false;
                    ((IAttributeAccessor)_link).SetAttribute(XhtmlConstants.AccessKeyCustomAttribute, GetCustomAttributeValue(XhtmlConstants.AccessKeyCustomAttribute));
                }
                else
                {
                    _link.Visible = false;
                    // Summary writes its own break so last control should write one.
                    _list.BreakAfter = false;
                }

                // Render the child controls to display error message list and a
                // link for going back to the Form that is having error
                RenderChildren(writer);
                // ConditionalSetPendingBreak should always be called *before* ConditionalExitStyle.
                // ConditionalExitStyle may render a block element and clear the pending break.
                ConditionalSetPendingBreak(writer);
                ConditionalRenderClosingDivElement(writer);
                ConditionalExitStyle(writer, Style);
            }
        }
Пример #8
0
        /// <include file='doc\XhtmlBasicTextBoxAdapter.uex' path='docs/doc[@for="XhtmlTextBoxAdapter.Render"]/*' />
        public override void Render(XhtmlMobileTextWriter writer)
        {
            ConditionalClearPendingBreak(writer);
            ConditionalEnterStyle(writer, Style);
            ConditionalRenderOpeningSpanElement(writer);

            if ((String)Device[XhtmlConstants.RequiresOnEnterForward] == "true")
            {
                writer.AddOnEnterForwardSetVar(Control.UniqueID, Control.Text);
            }

            writer.WriteBeginTag("input");

            writer.WriteAttribute("name", Control.UniqueID);

            ConditionalRenderCustomAttribute(writer, XhtmlConstants.AccessKeyCustomAttribute);
            String controlText = Control.Text;

            if (controlText != null && controlText.Length > 0 && !Control.Password)
            {
                writer.Write(" value=\"");
                writer.WriteEncodedText(controlText);
                writer.Write("\"");
            }

            if (Control.Size > 0)
            {
                writer.WriteAttribute("size", Control.Size.ToString(CultureInfo.InvariantCulture));
            }

            if (Control.MaxLength > 0)
            {
                writer.WriteAttribute("maxlength", Control.MaxLength.ToString(CultureInfo.InvariantCulture));
            }

            String requiresType = Device["requiresInputTypeAttribute"];

            if (Control.Password)
            {
                writer.WriteAttribute("type", "password");
            }
            // InvariantCulture not needed, but included for best practices.
            else if (requiresType != null && String.Equals(requiresType, "true", StringComparison.OrdinalIgnoreCase))
            {
                writer.WriteAttribute("type", "text");
            }


            writer.Write("/>");
            // ConditionalSetPendingBreak should always be called *before* ConditionalExitStyle.
            // ConditionalExitStyle may render a block element and clear the pending break.
            ConditionalSetPendingBreakAfterInline(writer);
            ConditionalRenderClosingSpanElement(writer);
            ConditionalExitStyle(writer, Style);
        }
        // Called from RenderItemDetails.  (Extracted for intelligibility.)
        private void RenderItemFieldsInDetailsView(XhtmlMobileTextWriter writer, ObjectListItem item)
        {
            Style style = Style;
            IObjectListFieldCollection fields = Control.AllFields;

            foreach (ObjectListField field in fields)
            {
                if (field.Visible)
                {
                    writer.Write("<tr><td>");
                    ConditionalEnterStyle(writer, Style);
                    writer.WriteEncodedText(field.Title);
                    ConditionalExitStyle(writer, Style);
                    writer.Write("</td><td>");
                    ConditionalEnterStyle(writer, style);
                    writer.WriteEncodedText(item [fields.IndexOf(field)]);
                    ConditionalExitStyle(writer, style);
                    writer.WriteLine("</td></tr>");
                }
            }
        }
 /// <include file='doc\XhtmlBasicValidatorAdapter.uex' path='docs/doc[@for="XhtmlValidatorAdapter.Render"]/*' />
 public override void Render(XhtmlMobileTextWriter writer) {
     if (!Control.IsValid && Control.Display != WebControls.ValidatorDisplay.None) {
         ConditionalEnterStyle(writer, Style);
         ConditionalRenderOpeningSpanElement(writer);
         writer.WritePendingBreak();
         String controlText = Control.Text;
         String controlErrorMessage = Control.ErrorMessage;
         if (controlText != null & controlText.Length > 0) {
             // ConditionalClearCachedEndTag() is for a device special case.
             ConditionalClearCachedEndTag(writer, Control.Text);
             writer.WriteEncodedText (Control.Text);
         }
         else if (controlErrorMessage != null && controlErrorMessage.Length > 0) {
             ConditionalClearCachedEndTag(writer, Control.ErrorMessage);
             writer.WriteEncodedText (Control.ErrorMessage);
         }
         // ConditionalSetPendingBreak should always be called *before* ConditionalExitStyle.
         // ConditionalExitStyle may render a block element and clear the pending break.
         ConditionalSetPendingBreak(writer);            
         ConditionalRenderClosingSpanElement(writer);
         ConditionalExitStyle(writer, Style);
     }
 }
        /// <include file='doc\XhtmlBasicImageAdapter.uex' path='docs/doc[@for="XhtmlImageAdapter.Render"]/*' />
        public override void Render(XhtmlMobileTextWriter writer)
        {
            string target = Control.NavigateUrl;

            ConditionalClearPendingBreak(writer);
            Style       style  = Style;
            StyleFilter filter = writer.CurrentStyleClass.GetFilter(style);

            if ((filter & XhtmlConstants.Layout) != 0)
            {
                ConditionalEnterLayout(writer, style);
            }

            if (target != null && target.Length > 0)
            {
                String cssClass  = GetCustomAttributeValue(XhtmlConstants.CssClassCustomAttribute);
                String accessKey = GetCustomAttributeValue(XhtmlConstants.AccessKeyCustomAttribute);
                String title     = GetCustomAttributeValue(XhtmlConstants.TitleCustomAttribute);
                RenderBeginLink(writer, target, accessKey, style, cssClass, title);
            }
            else
            {
                ConditionalEnterFormat(writer, style);
                ConditionalRenderOpeningSpanElement(writer);
            }
            String controlIU = Control.ImageUrl;

            if (controlIU == null || controlIU.Length == 0)
            {
                writer.WriteEncodedText(Control.AlternateText);
            }
            else
            {
                RenderImage(writer);
            }
            ConditionalSetPendingBreakAfterInline(writer);
            if (target != null && target.Length > 0)
            {
                RenderEndLink(writer);
            }
            else
            {
                ConditionalRenderClosingSpanElement(writer);
                ConditionalExitFormat(writer, style);
            }
            if ((filter & XhtmlConstants.Layout) != 0)
            {
                ConditionalExitLayout(writer, style);
            }
        }
 /// <include file='doc\XhtmlBasicLiteralTextAdapter.uex' path='docs/doc[@for="XhtmlLiteralTextAdapter.Render"]/*' />
 public override void Render(XhtmlMobileTextWriter writer) {
     // ConditionalClearCachedEndTag() is for a device special case.
     ConditionalClearCachedEndTag(writer, Control.Text);
     String text = Control.PagedText;
     ConditionalEnterStyle(writer, Style);
     ConditionalRenderOpeningSpanElement(writer);
     writer.WritePendingBreak();
     writer.WriteEncodedText(text);
     // ConditionalSetPendingBreak should always be called *before* ConditionalExitStyle.
     // ConditionalExitStyle may render a block element and clear the pending break.
     ConditionalSetPendingBreak(writer);            
     ConditionalRenderClosingSpanElement(writer);
     ConditionalExitStyle(writer, Style);
 }
 /// <include file='doc\XhtmlBasicLinkAdapter.uex' path='docs/doc[@for="XhtmlLinkAdapter.Render"]/*' />
 public override void Render(XhtmlMobileTextWriter writer) {
     ConditionalClearPendingBreak(writer);
     ConditionalEnterStyle(writer, Style);
     String cssClass = GetCustomAttributeValue(XhtmlConstants.CssClassCustomAttribute);
     String accessKey = GetCustomAttributeValue(XhtmlConstants.AccessKeyCustomAttribute);
     RenderBeginLink(writer, Control.NavigateUrl, accessKey, Style, cssClass);
     String controlText = Control.Text;
     writer.WriteEncodedText(controlText == null || controlText.Length == 0 ? Control.NavigateUrl : controlText);
     RenderEndLink(writer);
     // ConditionalSetPendingBreak should always be called *before* ConditionalExitStyle.
     // ConditionalExitStyle may render a block element and clear the pending break.
     ConditionalSetPendingBreakAfterInline(writer);  
     ConditionalExitStyle(writer, Style);
 }
        /// <include file='doc\XhtmlBasicValidationSummaryAdapter.uex' path='docs/doc[@for="XhtmlValidationSummaryAdapter.Render"]/*' />
        public override void Render(XhtmlMobileTextWriter writer) {
            String[] errorMessages = null;

            if (Control.Visible) {
                errorMessages = Control.GetErrorMessages();
            }

            if (errorMessages != null) {
                ConditionalEnterStyle(writer, Style, "div");
                ConditionalRenderOpeningDivElement(writer);
                if (Control.HeaderText.Length > 0) {
                    // ConditionalClearCachedEndTag() is for a device special case.
                    ConditionalClearCachedEndTag(writer, Control.HeaderText);
                    writer.WriteEncodedText (Control.HeaderText);
                }

                ArrayList arr = new ArrayList();
                foreach (String errorMessage in errorMessages) {
                    Debug.Assert(errorMessage != null && errorMessage.Length > 0, "Bad Error Messages");
                    arr.Add(errorMessage);
                }

                _list.Decoration = ListDecoration.Bulleted;
                _list.DataSource = arr;
                _list.DataBind();

                if (String.Compare(Control.FormToValidate, Control.Form.UniqueID, true, CultureInfo.CurrentCulture) != 0) {
                    _link.NavigateUrl = Constants.FormIDPrefix + Control.FormToValidate;
                    String controlBackLabel = Control.BackLabel;
                    _link.Text = controlBackLabel == null || controlBackLabel.Length == 0 ? GetDefaultLabel(BackLabel) : controlBackLabel;
                    // Summary writes its own break so last control should write one.
                    _link.BreakAfter = false;
                    ((IAttributeAccessor)_link).SetAttribute(XhtmlConstants.AccessKeyCustomAttribute, GetCustomAttributeValue(XhtmlConstants.AccessKeyCustomAttribute));
                }
                else {
                    _link.Visible = false;
                    // Summary writes its own break so last control should write one.
                    _list.BreakAfter = false;
                }

                // Render the child controls to display error message list and a
                // link for going back to the Form that is having error
                RenderChildren(writer);
                // ConditionalSetPendingBreak should always be called *before* ConditionalExitStyle.
                // ConditionalExitStyle may render a block element and clear the pending break.
                ConditionalSetPendingBreak(writer);            
                ConditionalRenderClosingDivElement(writer);
                ConditionalExitStyle(writer, Style);
            }
        }
Пример #15
0
 /// <include file='doc\XhtmlBasicLabelAdapter.uex' path='docs/doc[@for="XhtmlLabelAdapter.Render"]/*' />
 public override void Render(XhtmlMobileTextWriter writer)
 {
     // ConditionalClearCachedEndTag() is for a device special case.
     ConditionalClearCachedEndTag(writer, Control.Text);
     ConditionalEnterStyle(writer, Style);
     ConditionalRenderOpeningSpanElement(writer);
     writer.WritePendingBreak();
     writer.WriteEncodedText(Control.Text);
     writer.WriteLine();
     // ConditionalSetPendingBreak should always be called *before* ConditionalExitStyle.
     // ConditionalExitStyle may render a block element and clear the pending break.
     ConditionalSetPendingBreak(writer);
     ConditionalRenderClosingSpanElement(writer);
     ConditionalExitStyle(writer, Style);
 }
        /////////////////////////////////////////////////////////////////////////
        //  PAGINATION SUPPORT
        /////////////////////////////////////////////////////////////////////////
        /// <include file='doc\XhtmlBasicFormAdapter.uex' path='docs/doc[@for="XhtmlFormAdapter.RenderPager"]/*' />
        protected virtual void RenderPager(XhtmlMobileTextWriter writer)
        {
            PagerStyle pagerStyle = Control.PagerStyle;

            int pageCount = Control.PageCount;

            if (pageCount <= 1)
            {
                return;
            }
            int    page = Control.CurrentPage;
            String text = pagerStyle.GetPageLabelText(page, pageCount);

            if ((page > 1) || (text.Length > 0) || (page < pageCount))
            {
                writer.WritePendingBreak();
                ConditionalEnterStyle(writer, pagerStyle);
                ConditionalEnterPagerSpan(writer);
            }

            if (page > 1)
            {
                RenderPagerTag(writer, page - 1,
                               pagerStyle.GetPreviousPageText(page),
                               XhtmlConstants.PagerPreviousAccessKeyCustomAttribute);
                writer.Write(" ");
            }

            if (text.Length > 0)
            {
                writer.WriteEncodedText(text);
                writer.Write(" ");
            }

            if (page < pageCount)
            {
                RenderPagerTag(writer, page + 1,
                               pagerStyle.GetNextPageText(page),
                               XhtmlConstants.PagerNextAccessKeyCustomAttribute);
            }

            if ((page > 1) || (text.Length > 0) || (page < pageCount))
            {
                ConditionalExitPagerSpan(writer);
                ConditionalExitStyle(writer, pagerStyle);
                writer.SetPendingBreak();
            }
        }
        // Render a single ObjectListItem in list view.
        private void RenderListViewItem(XhtmlMobileTextWriter writer, ObjectListItem item, int fieldCount, int[] fieldIndices, bool itemRequiresMoreButton, bool itemRequiresHyperlink)
        {
            Style  style           = Style;
            Style  subCommandStyle = Control.CommandStyle;
            String accessKey       = GetCustomAttributeValue(item, XhtmlConstants.AccessKeyCustomAttribute);
            String cssClass        = GetCustomAttributeValue(item, XhtmlConstants.CssClassCustomAttribute);
            String subCommandClass = GetCustomAttributeValue(XhtmlConstants.CssCommandClassCustomAttribute);

            if (subCommandClass == null || subCommandClass.Length == 0)
            {
                subCommandClass = cssClass;
            }

            writer.WriteLine("<tr>");

            // Render fields.
            for (int field = 0; field < fieldCount; field++)
            {
                writer.Write("<td>");
                if (field == 0 && itemRequiresHyperlink)
                {
                    String eventArgument = HasDefaultCommand() ? item.Index.ToString(CultureInfo.InvariantCulture) : String.Format(CultureInfo.InvariantCulture, ShowMoreFormat, item.Index.ToString(CultureInfo.InvariantCulture));
                    RenderPostBackEventAsAnchor(writer, eventArgument, item[fieldIndices[0]], accessKey, Style, cssClass);
                }
                else
                {
                    writer.WriteEncodedText(item[fieldIndices[field]]);
                }
                writer.WriteLine("</td>");
            }

            if (itemRequiresMoreButton)
            {
                writer.Write("<td>");
                String controlMT = Control.MoreText;
                String moreText  = (controlMT == null || controlMT.Length == 0) ? GetDefaultLabel(MoreLabel) : controlMT;
                RenderPostBackEventAsAnchor(writer,
                                            String.Format(CultureInfo.InvariantCulture, ShowMoreFormat, item.Index),
                                            moreText,
                                            null /*accessKey*/,
                                            subCommandStyle,
                                            subCommandClass);
                writer.WriteLine("</td>");
            }
            writer.WriteLine("</tr>");
        }
        /// <include file='doc\XhtmlBasicTextBoxAdapter.uex' path='docs/doc[@for="XhtmlTextBoxAdapter.Render"]/*' />
        public override void Render(XhtmlMobileTextWriter writer) {
            ConditionalClearPendingBreak(writer);
            ConditionalEnterStyle(writer, Style);
            ConditionalRenderOpeningSpanElement(writer);

            if ((String) Device[XhtmlConstants.RequiresOnEnterForward] == "true") {
                writer.AddOnEnterForwardSetVar(Control.UniqueID, Control.Text);
            }
            
            writer.WriteBeginTag("input");

            writer.WriteAttribute("name", Control.UniqueID);

            ConditionalRenderCustomAttribute(writer, XhtmlConstants.AccessKeyCustomAttribute);
            String controlText = Control.Text;
            if (controlText != null && controlText.Length > 0 && !Control.Password) {
                writer.Write(" value=\"");
                writer.WriteEncodedText(controlText);
                writer.Write("\"");
            }

            if (Control.Size > 0) {
                writer.WriteAttribute("size", Control.Size.ToString(CultureInfo.InvariantCulture));
            }

            if (Control.MaxLength > 0) {
                writer.WriteAttribute("maxlength", Control.MaxLength.ToString(CultureInfo.InvariantCulture));
            }

            String requiresType = Device["requiresInputTypeAttribute"];
            if (Control.Password) {
                writer.WriteAttribute("type", "password");
            }
            // InvariantCulture not needed, but included for best practices.
            else if (requiresType != null && String.Equals(requiresType, "true", StringComparison.OrdinalIgnoreCase)) {
                writer.WriteAttribute("type", "text");
            }


            writer.Write("/>");
            // ConditionalSetPendingBreak should always be called *before* ConditionalExitStyle.
            // ConditionalExitStyle may render a block element and clear the pending break.
            ConditionalSetPendingBreakAfterInline(writer);            
            ConditionalRenderClosingSpanElement(writer);
            ConditionalExitStyle(writer, Style);
        }
        void RenderSelectElement(XhtmlMobileTextWriter writer)
        {
            if ((String)Device["supportsSelectFollowingTable"] == "false" && writer.CachedEndTag == "table")
            {
                writer.Write("&nbsp;");
            }

            ConditionalEnterStyle(writer, Style);
            writer.WriteBeginTag("select");

            if (Control.SelectType == ListSelectType.MultiSelectListBox)
            {
                writer.WriteAttribute("multiple", "multiple");
            }

            if (Control.SelectType == ListSelectType.ListBox || Control.SelectType == ListSelectType.MultiSelectListBox)
            {
                writer.WriteAttribute("size", Control.Rows.ToString(CultureInfo.InvariantCulture));
            }

            writer.WriteAttribute("name", Control.UniqueID);
            ConditionalRenderClassAttribute(writer);
            writer.Write(">");

            for (int itemIndex = 0; itemIndex < Control.Items.Count; itemIndex++)
            {
                MobileListItem item = Control.Items[itemIndex];
                writer.WriteBeginTag("option");
                WriteItemValueAttribute(writer, itemIndex, item.Value);
                if (item.Selected && (Control.IsMultiSelect || itemIndex == Control.SelectedIndex))
                {
                    writer.Write(" selected=\"selected\">");
                }
                else
                {
                    writer.Write(">");
                }
                writer.WriteEncodedText(item.Text);
                writer.WriteLine("</option>");
            }
            ConditionalSetPendingBreak(writer);
            writer.WriteEndTag("select");
            writer.WriteLine();
            ConditionalPopPhysicalCssClass(writer);
            ConditionalExitStyle(writer, Style);
        }
        /// <include file='doc\XhtmlBasicLinkAdapter.uex' path='docs/doc[@for="XhtmlLinkAdapter.Render"]/*' />
        public override void Render(XhtmlMobileTextWriter writer)
        {
            ConditionalClearPendingBreak(writer);
            ConditionalEnterStyle(writer, Style);
            String cssClass  = GetCustomAttributeValue(XhtmlConstants.CssClassCustomAttribute);
            String accessKey = GetCustomAttributeValue(XhtmlConstants.AccessKeyCustomAttribute);

            RenderBeginLink(writer, Control.NavigateUrl, accessKey, Style, cssClass);
            String controlText = Control.Text;

            writer.WriteEncodedText(controlText == null || controlText.Length == 0 ? Control.NavigateUrl : controlText);
            RenderEndLink(writer);
            // ConditionalSetPendingBreak should always be called *before* ConditionalExitStyle.
            // ConditionalExitStyle may render a block element and clear the pending break.
            ConditionalSetPendingBreakAfterInline(writer);
            ConditionalExitStyle(writer, Style);
        }
        /// <include file='doc\XhtmlBasicImageAdapter.uex' path='docs/doc[@for="XhtmlImageAdapter.Render"]/*' />
        public override void Render(XhtmlMobileTextWriter writer) {
            string target = Control.NavigateUrl;
            ConditionalClearPendingBreak(writer);
            Style style = Style;
            StyleFilter filter = writer.CurrentStyleClass.GetFilter(style);
            if ((filter & XhtmlConstants.Layout) != 0) {
                ConditionalEnterLayout(writer, style);
            }

            if(target != null && target.Length > 0) {
                String cssClass = GetCustomAttributeValue(XhtmlConstants.CssClassCustomAttribute);
                String accessKey = GetCustomAttributeValue(XhtmlConstants.AccessKeyCustomAttribute);
                String title = GetCustomAttributeValue(XhtmlConstants.TitleCustomAttribute);
                RenderBeginLink(writer, target, accessKey, style, cssClass, title);
            }
            else{
                ConditionalEnterFormat(writer, style);
                ConditionalRenderOpeningSpanElement(writer);
            }
            String controlIU = Control.ImageUrl;
            if(controlIU == null || controlIU.Length == 0) {            
                writer.WriteEncodedText(Control.AlternateText);
            }
            else {
                RenderImage(writer);
            }
            ConditionalSetPendingBreakAfterInline(writer);
            if(target != null && target.Length > 0) {
                RenderEndLink(writer);
            }
            else {
                ConditionalRenderClosingSpanElement(writer);
                ConditionalExitFormat(writer, style);
            }
            if ((filter & XhtmlConstants.Layout) != 0) {
                ConditionalExitLayout(writer, style);
            }
        }
        /// <include file='doc\XhtmlBasicFormAdapter.uex' path='docs/doc[@for="XhtmlFormAdapter.Render"]/*' />
        public override void Render (XhtmlMobileTextWriter writer) {
            // Note: <head>, <body> rendered by page adapter, as in HTML case.
            String formsAuthCookieName = FormsAuthentication.FormsCookieName;
            if(!Device.SupportsRedirectWithCookie)
            {
                if(formsAuthCookieName != null && formsAuthCookieName.Length > 0)
                {
                    HttpContext.Current.Response.Cookies.Remove(formsAuthCookieName);
                }
            }
            writer.WriteBeginTag ("form");
            writer.WriteAttribute ("id", Control.ClientID);
            writer.WriteAttribute ("method", Control.Method.ToString().ToLower(CultureInfo.CurrentCulture));
            writer.Write (" action=\"");
            RenderPostbackUrl(writer);
            if(Control.Action.Length > 0) {
                if(Control.Action.IndexOf("?", StringComparison.Ordinal) != -1) {
                    writer.Write("&");
                }
                else {
                    writer.Write("?");
                }
            }
            else {
                writer.Write("?");
            }
            writer.Write(Page.UniqueFilePathSuffix);

            if (Control.Method != FormMethod.Get &&
                Control.Action.Length == 0) {   // VSWhidbey 411176: We don't include QueryStringText if Action is explicitly set

                String queryStringText = PreprocessQueryString(Page.QueryStringText);
                if (queryStringText != null && queryStringText.Length > 0) {
                    String amp = (String)Device[XhtmlConstants.SupportsUrlAttributeEncoding] != "false"  ? "&amp;" : "&";
                    writer.Write(amp);
                    if((String)Device[XhtmlConstants.SupportsUrlAttributeEncoding] != "false") {
                        writer.WriteEncodedText(queryStringText);
                    }
                    else {
                        writer.Write(queryStringText);
                    }
                }
            }
            writer.WriteLine ("\">");
            bool needDivStyle = (String)Device[XhtmlConstants.RequiresXhtmlCssSuppression] != "true" &&
                (String)Device["supportsBodyClassAttribute"] == "false";
            if (!needDivStyle) {
                if((String)Device["usePOverDiv"] == "true")
                    writer.WriteFullBeginTag("p");
                else
                    writer.WriteFullBeginTag ("div");
            }
            else {
                if((String)Device["usePOverDiv"] == "true")
                    writer.EnterStyle(Style, "p");
                else
                    writer.EnterStyle (Style, "div");
            }
            RenderPostBackHeader (writer);
            // Renders hidden variables for IPostBackDataHandlers which are
            // not displayed due to pagination or secondary UI.
            RenderOffPageVariables(writer, Control, Control.CurrentPage);
            
            RenderChildren (writer);
            if (!needDivStyle) {
                if((String)Device["usePOverDiv"] == "true")
                    writer.WriteEndTag("p");
                else
                    writer.WriteEndTag ("div");
            }
            else {
                if((String)Device["usePOverDiv"] == "true")
                    writer.ExitStyle(Style);
                else
                    writer.ExitStyle (Style);
            }
            writer.WriteEndTag ("form");
        }
        /////////////////////////////////////////////////////////////////////////
        //  PAGINATION SUPPORT
        /////////////////////////////////////////////////////////////////////////
        /// <include file='doc\XhtmlBasicFormAdapter.uex' path='docs/doc[@for="XhtmlFormAdapter.RenderPager"]/*' />
        protected virtual void RenderPager (XhtmlMobileTextWriter writer) {
            PagerStyle pagerStyle = Control.PagerStyle;

            int pageCount = Control.PageCount;
            if (pageCount <= 1) {
                return;
            }
            int page = Control.CurrentPage;
            String text = pagerStyle.GetPageLabelText(page, pageCount);

            if((page > 1) || (text.Length > 0) || (page < pageCount)) {
                writer.WritePendingBreak();
                ConditionalEnterStyle(writer, pagerStyle);
                ConditionalEnterPagerSpan(writer);
            }

            if (page > 1) {
                RenderPagerTag(writer, page - 1,
                    pagerStyle.GetPreviousPageText(page),
                    XhtmlConstants.PagerPreviousAccessKeyCustomAttribute);
                writer.Write(" ");
            }

            if (text.Length > 0) {
                writer.WriteEncodedText(text);
                writer.Write(" ");
            }

            if (page < pageCount) {
                RenderPagerTag(writer, page + 1,
                    pagerStyle.GetNextPageText(page),
                    XhtmlConstants.PagerNextAccessKeyCustomAttribute);
            }

            if((page > 1) || (text.Length > 0) || (page < pageCount)) {
                ConditionalExitPagerSpan(writer);
                ConditionalExitStyle(writer, pagerStyle);
                writer.SetPendingBreak();
            }
        }
        /// <include file='doc\XhtmlBasicPageAdapter.uex' path='docs/doc[@for="XhtmlPageAdapter.Render"]/*' />
        public override void Render (XhtmlMobileTextWriter writer) {
            writer.BeginResponse ();
            if (Page.Request.Browser["requiresPragmaNoCacheHeader"] == "true") {
                Page.Response.AppendHeader("Pragma", "no-cache");
            }
            InitWriterState(writer);          
            writer.BeginCachedRendering ();
            // For consistency with HTML, we render the form style with body tag.
            RenderOpeningBodyElement(writer);
            // Certain WML 2.0 devices require that we write an onevent onenterforward setvar snippet.
            // We cannot know the relevant variables until after the form is rendered, so we mark this
            // position.  The setvar elements will be inserted into the cached rendering here.
            writer.MarkWmlOnEventLocation ();
            Page.ActiveForm.RenderControl(writer);
            RenderClosingBodyElement(writer);
            writer.ClearPendingBreak ();
            writer.EndCachedRendering ();

            // Note: first and third arguments are not used.
            writer.BeginFile (Page.Request.Url.ToString (), Page.Device.PreferredRenderingMime, Page.Response.Charset);
            String supportsXmlDeclaration = Device["supportsXmlDeclaration"];
            // Invariant culture not needed, included for best practices compliance.
            if (supportsXmlDeclaration == null ||
                !String.Equals(supportsXmlDeclaration, "false", StringComparison.OrdinalIgnoreCase)) {
                writer.WriteXmlDeclaration ();
            }
            writer.WriteDoctypeDeclaration(DocumentType);
            // Review: Hard coded xmlns.
            writer.WriteFullBeginTag ("html xmlns=\"http://www.w3.org/1999/xhtml\"");
            writer.WriteLine ();
            writer.WriteFullBeginTag ("head");
            writer.WriteLine ();
            writer.WriteFullBeginTag ("title");
            if (Page.ActiveForm.Title != null) {
                writer.WriteEncodedText(Page.ActiveForm.Title);
            }
            writer.WriteEndTag ("title");
            ConditionalRenderLinkElement (writer);
            ConditionalRenderStyleElement (writer);
            writer.WriteEndTag ("head");
            writer.WriteLine ();
            writer.WriteCachedMarkup (); // includes body tag.
            writer.WriteLine ();
            writer.WriteEndTag ("html");
            writer.EndFile ();
            if (!DoesDeviceRequireCssSuppression()) {
                if (CssLocation == StyleSheetLocation.ApplicationCache && !writer.IsStyleSheetEmpty()) {
                    // Recall that Page.Cache has application scope
                    Page.Cache.Insert(writer.CacheKey, writer.GetStyles (), null, DateTime.MaxValue, _cacheExpirationTime);
                }
                else if (CssLocation == StyleSheetLocation.SessionState && !writer.IsStyleSheetEmpty()) {
                    Page.Session[writer.SessionKey] = writer.GetStyles();
                }
            }

            writer.EndResponse ();
        }
        // Render the details view
        /// <include file='doc\XhtmlBasicObjectListAdapter.uex' path='docs/doc[@for="XhtmlObjectListAdapter.RenderItemDetails"]/*' />
        protected virtual void RenderItemDetails(XhtmlMobileTextWriter writer, ObjectListItem item)
        {
            if (Control.AllFields.Count == 0)
            {
                return;
            }
            if (!Device.Tables)
            {
                RenderItemDetailsWithoutTableTags(writer, item);
                return;
            }


            Style labelStyle              = Control.LabelStyle;
            Style subCommandStyle         = Control.CommandStyle;
            Style subCommandStyleNoItalic = (Style)subCommandStyle.Clone();

            subCommandStyleNoItalic.Font.Italic = BooleanOption.False;

            writer.ClearPendingBreak(); // we are writing a block level element in all cases.
            ConditionalEnterLayout(writer, Style);
            writer.WriteBeginTag("table");
            ConditionalRenderClassAttribute(writer);
            writer.Write(">");
            writer.Write("<tr><td colspan=\"2\">");
            ConditionalEnterStyle(writer, labelStyle);
            writer.WriteEncodedText(item[Control.LabelFieldIndex]);
            ConditionalExitStyle(writer, labelStyle);
            writer.WriteLine("</td></tr>");
            Color foreColor = (Color)Style[Style.ForeColorKey, true];

            RenderRule(writer, foreColor, 2);
            RenderItemFieldsInDetailsView(writer, item);
            RenderRule(writer, foreColor, 2);
            ConditionalPopPhysicalCssClass(writer);
            writer.WriteEndTag("table");
            ConditionalExitLayout(writer, Style);

            ConditionalEnterStyle(writer, subCommandStyleNoItalic);
            writer.Write("[&nbsp;");

            ObjectListCommandCollection commands = Control.Commands;
            String cssClass        = GetCustomAttributeValue(XhtmlConstants.CssClassCustomAttribute);
            String subCommandClass = GetCustomAttributeValue(XhtmlConstants.CssCommandClassCustomAttribute);

            if (subCommandClass == null || subCommandClass.Length == 0)
            {
                subCommandClass = cssClass;
            }

            foreach (ObjectListCommand command in commands)
            {
                RenderPostBackEventAsAnchor(writer, command.Name, command.Text, null /* accessKey */, subCommandStyle, subCommandClass);
                writer.Write("&nbsp;|&nbsp;");
            }
            String controlBCT      = Control.BackCommandText;
            String backCommandText = (controlBCT == null || controlBCT.Length == 0) ?
                                     GetDefaultLabel(BackLabel) :
                                     controlBCT;

            RenderPostBackEventAsAnchor(writer, BackToList, backCommandText, null /* accessKey */, subCommandStyle, subCommandClass);
            writer.Write("&nbsp;]");
            ConditionalExitStyle(writer, subCommandStyleNoItalic);
        }
        // Render a single ObjectListItem in list view.
        private void RenderListViewItem (XhtmlMobileTextWriter writer, ObjectListItem item, int fieldCount, int[] fieldIndices, bool itemRequiresMoreButton, bool itemRequiresHyperlink) {
            Style style = Style;
            Style subCommandStyle = Control.CommandStyle;
            String accessKey = GetCustomAttributeValue(item, XhtmlConstants.AccessKeyCustomAttribute);
            String cssClass = GetCustomAttributeValue(item, XhtmlConstants.CssClassCustomAttribute);
            String subCommandClass = GetCustomAttributeValue(XhtmlConstants.CssCommandClassCustomAttribute);
            if (subCommandClass == null || subCommandClass.Length == 0) {
                subCommandClass = cssClass;
            }

            writer.WriteLine("<tr>");

            // Render fields.
            for (int field = 0; field < fieldCount; field++) {
                writer.Write("<td>");
                if (field == 0 && itemRequiresHyperlink) {
                    String eventArgument = HasDefaultCommand() ? item.Index.ToString(CultureInfo.InvariantCulture) : String.Format(CultureInfo.InvariantCulture, ShowMoreFormat, item.Index.ToString(CultureInfo.InvariantCulture));
                    RenderPostBackEventAsAnchor(writer, eventArgument, item[fieldIndices[0]], accessKey, Style, cssClass);
                }
                else {
                    writer.WriteEncodedText (item[fieldIndices[field]]);
                }
                writer.WriteLine("</td>");
            }

            if (itemRequiresMoreButton) {
                writer.Write("<td>");
                String controlMT = Control.MoreText;
                String moreText = (controlMT == null || controlMT.Length == 0) ? GetDefaultLabel(MoreLabel) : controlMT;
                RenderPostBackEventAsAnchor(writer,
                    String.Format(CultureInfo.InvariantCulture, ShowMoreFormat, item.Index), 
                    moreText, 
                    null /*accessKey*/,
                    subCommandStyle,
                    subCommandClass);
                writer.WriteLine("</td>");
            }
            writer.WriteLine("</tr>");
        }
        // Render the details view
        /// <include file='doc\XhtmlBasicObjectListAdapter.uex' path='docs/doc[@for="XhtmlObjectListAdapter.RenderItemDetails"]/*' />
        protected virtual void RenderItemDetails(XhtmlMobileTextWriter writer, ObjectListItem item) {
            if (Control.AllFields.Count == 0) {
                return;
            }
            if (!Device.Tables) {
                RenderItemDetailsWithoutTableTags(writer, item);
                return;
            }


            Style labelStyle = Control.LabelStyle;
            Style subCommandStyle = Control.CommandStyle;
            Style subCommandStyleNoItalic = (Style)subCommandStyle.Clone();
            subCommandStyleNoItalic.Font.Italic = BooleanOption.False;

            writer.ClearPendingBreak(); // we are writing a block level element in all cases.
            ConditionalEnterLayout(writer, Style);
            writer.WriteBeginTag ("table");
            ConditionalRenderClassAttribute(writer);
            writer.Write(">");
            writer.Write("<tr><td colspan=\"2\">");
            ConditionalEnterStyle(writer, labelStyle);
            writer.WriteEncodedText (item[Control.LabelFieldIndex]);
            ConditionalExitStyle(writer, labelStyle);
            writer.WriteLine("</td></tr>");
            Color foreColor = (Color)Style[Style.ForeColorKey, true];
            RenderRule (writer, foreColor, 2);
            RenderItemFieldsInDetailsView (writer, item);
            RenderRule (writer, foreColor, 2);
            ConditionalPopPhysicalCssClass(writer);
            writer.WriteEndTag("table");
            ConditionalExitLayout(writer, Style);

            ConditionalEnterStyle(writer, subCommandStyleNoItalic);
            writer.Write("[&nbsp;");

            ObjectListCommandCollection commands = Control.Commands;
            String cssClass = GetCustomAttributeValue(XhtmlConstants.CssClassCustomAttribute);
            String subCommandClass = GetCustomAttributeValue(XhtmlConstants.CssCommandClassCustomAttribute);
            if (subCommandClass == null || subCommandClass.Length == 0) {
                subCommandClass = cssClass;
            }

            foreach (ObjectListCommand command in commands) {
                RenderPostBackEventAsAnchor(writer, command.Name, command.Text, null /* accessKey */, subCommandStyle, subCommandClass);
                writer.Write("&nbsp;|&nbsp;");
            }
            String controlBCT = Control.BackCommandText;
            String backCommandText = (controlBCT == null || controlBCT.Length == 0) ?
                GetDefaultLabel(BackLabel) :
                controlBCT;

            RenderPostBackEventAsAnchor(writer, BackToList, backCommandText, null /* accessKey */, subCommandStyle, subCommandClass);
            writer.Write("&nbsp;]");
            ConditionalExitStyle(writer, subCommandStyleNoItalic);
        }
        // Writes the href value for RenderBeginLink, depending on whether the target is a new form on the 
        // current page or a standard url (e.g., a new page).
        private void RenderHrefValue (XhtmlMobileTextWriter writer, String target) {
            bool appendCookielessDataDictionary = PageAdapter.PersistCookielessData  && 
                !target.StartsWith("http:", StringComparison.Ordinal) && 
                !target.StartsWith("https:", StringComparison.Ordinal);
            bool queryStringWritten = false;

            // ASURT 144021
            if (target == null || target.Length == 0) {
                target = Page.Response.ApplyAppPathModifier(Control.TemplateSourceDirectory);
            }



            if (target.StartsWith(Constants.FormIDPrefix, StringComparison.Ordinal)) {
                RenderFormNavigationHrefValue (writer, target);
                appendCookielessDataDictionary = false;
            }
            else {
                // For page adapter Control = null.
                if (Control != null) {
                    target = Control.ResolveUrl(target);
                }
                
                // ASURT 147179
                if ((String)Device["requiresAbsolutePostbackUrl"] == "true"
                    && IsRelativeUrl(target)) {
                    String templateSourceDirectory = Page.TemplateSourceDirectory;
                    String prefix = writer.EncodeUrlInternal(Page.Response.ApplyAppPathModifier(Page.TemplateSourceDirectory));
                    if (prefix[prefix.Length - 1] != '/') {
                        prefix = prefix + '/';
                    }
                    target = prefix + target;
                }

                if ((String)Device[XhtmlConstants.SupportsUrlAttributeEncoding] != "false") {
                    writer.WriteEncodedText (target);
                }
                else {
                    writer.Write (target);                
                }
                queryStringWritten = target.IndexOf ('?') != -1;
            }

            if (appendCookielessDataDictionary) {
                RenderCookielessDataDictionaryInQueryString (writer, queryStringWritten);
            }
        }
        void RenderInputElementSet (XhtmlMobileTextWriter writer) {
            string wrappingTag = Device.Tables ? "table" : 
                (((string)Device["usePOverDiv"]  == "true") ? "p" : "div");
            ListSelectType selectType = Control.SelectType;
            MobileListItemCollection items = Control.Items;
            // Review: We always render a table.  Should we optimize away the table tags when the alignment is left?
            String selectTypeString =
                (selectType == ListSelectType.Radio) ?
                "radio" :
                "checkbox";

            ClearPendingBreakIfDeviceBreaksOnBlockLevel(writer); // Since we are writing a block-level element in all cases.
            ConditionalEnterLayout(writer, Style);
            RenderOpeningListTag(writer, wrappingTag);
            for(int itemIndex = 0; itemIndex < items.Count; itemIndex++) {
                MobileListItem item = items[itemIndex];
                if (Device.Tables) {
                    writer.WriteFullBeginTag("tr");
                    writer.WriteFullBeginTag("td");
                }

                writer.WriteBeginTag("input");
                writer.WriteAttribute("type", selectTypeString);
                writer.WriteAttribute("name", Control.UniqueID);
                WriteItemValueAttribute(writer, itemIndex, item.Value);
                String accessKey = GetCustomAttributeValue(item, XhtmlConstants.AccessKeyCustomAttribute);
                if (accessKey != null && accessKey.Length > 0) {
                    writer.WriteAttribute("accesskey", accessKey, true);
                }
                // Assumption: Device.SupportsUncheck is always true for Xhtml devices.
                if (item.Selected && 
                    (Control.IsMultiSelect || itemIndex == Control.SelectedIndex)) {
                    writer.Write(" checked=\"checked\"/>");
                }
                else {
                    writer.Write("/>");
                }

                writer.WriteEncodedText(item.Text);
                if (Device.Tables) {
                    writer.WriteEndTag("td");
                }
                if((string)Device["usePOverDiv"]  == "true" || !Device.Tables) {
                    writer.Write("<br/>");
                }
                if (Device.Tables) {
                    writer.WriteEndTag("tr");
                }
            }
            RenderClosingListTag(writer, wrappingTag);
            ConditionalExitLayout(writer, Style);
        }
        /// <include file='doc\XhtmlBasicPhoneCallAdapter.uex' path='docs/doc[@for="XhtmlPhoneCallAdapter.Render"]/*' />
        public override void Render(XhtmlMobileTextWriter writer)
        {
            ConditionalClearPendingBreak(writer);
            Style style = Style;
            StyleFilter filter = writer.CurrentStyleClass.GetFilter(style);
            if ((filter & XhtmlConstants.Layout) != 0) {
                ConditionalEnterLayout(writer, style);
            }
            if (Device.CanInitiateVoiceCall) {
                String text = Control.Text;
                String phoneNumber = Control.PhoneNumber;

                if (text == null || text.Length == 0) {
                    text = phoneNumber;
                }

                writer.WriteBeginTag("a");

                if ((String)Device["supportsWtai"] == "true") {
                    writer.Write(" href=\"wtai://wp/mc;");
                }
                else {
                    writer.Write(" href=\"tel:");
                }

                foreach (char ch in phoneNumber) {
                    if (ch >= '0' && ch <= '9' || ch == '#' || ch == '+') {
                        writer.Write(ch);
                    }
                }
                writer.Write("\"");
                ConditionalRenderCustomAttribute(writer, XhtmlConstants.AccessKeyCustomAttribute);
                String cssClass = GetCustomAttributeValue(XhtmlConstants.CssClassCustomAttribute);
                if (CssLocation != StyleSheetLocation.PhysicalFile) {
                    String className = writer.GetCssFormatClassName(style);
                    if (className != null) {
                        writer.WriteAttribute ("class", className);
                    }
                }
                else if (cssClass != null && cssClass.Length > 0) {
                    writer.WriteAttribute ("class", cssClass, true /* encode */);
                }
                writer.Write(">");
                writer.WriteEncodedText(text);
                writer.WriteEndTag("a");
                ConditionalSetPendingBreakAfterInline(writer);
            }
            else {
                // Format the text string based on properties
                String text = String.Format(
                    CultureInfo.CurrentCulture,
                    Control.AlternateFormat,
                    Control.Text,
                    Control.PhoneNumber);
                String url = Control.AlternateUrl;

                // If URI specified, create a link.  Otherwise, only text is displayed.
                if (url != null && url.Length > 0) {
                    String cssClass = GetCustomAttributeValue(XhtmlConstants.CssClassCustomAttribute);
                    String accessKey = GetCustomAttributeValue(XhtmlConstants.AccessKeyCustomAttribute);
                    RenderBeginLink(writer, url, accessKey, style, cssClass);
                    writer.WriteEncodedText(text);
                    RenderEndLink(writer);
                    ConditionalSetPendingBreakAfterInline(writer);
                }
                else {
                    writer.WritePendingBreak();
                    ConditionalEnterFormat(writer, style);
                    ConditionalRenderOpeningSpanElement(writer);
                    writer.WriteEncodedText(text);
                    ConditionalRenderClosingSpanElement(writer);
                    ConditionalExitFormat(writer, style);
                    ConditionalSetPendingBreak(writer);
                }
            }
            if ((filter & XhtmlConstants.Layout) != 0) {
                ConditionalExitLayout(writer, style);
            }
        }
        void RenderSelectElement (XhtmlMobileTextWriter writer) {
            
            if ((String)Device["supportsSelectFollowingTable"] == "false" && writer.CachedEndTag == "table") {
                writer.Write("&nbsp;");
            }

            ConditionalEnterStyle(writer, Style);
            writer.WriteBeginTag ("select");

            if (Control.SelectType == ListSelectType.MultiSelectListBox) {
                writer.WriteAttribute ("multiple", "multiple");
            }

            if (Control.SelectType == ListSelectType.ListBox || Control.SelectType == ListSelectType.MultiSelectListBox) {
                writer.WriteAttribute ("size", Control.Rows.ToString(CultureInfo.InvariantCulture));
            }

            writer.WriteAttribute ("name", Control.UniqueID);
            ConditionalRenderClassAttribute(writer);
            writer.Write (">");

            for (int itemIndex = 0; itemIndex < Control.Items.Count; itemIndex++) {
                MobileListItem item = Control.Items[itemIndex];
                writer.WriteBeginTag ("option");
                WriteItemValueAttribute (writer, itemIndex, item.Value);
                if (item.Selected && (Control.IsMultiSelect || itemIndex == Control.SelectedIndex)) {
                    writer.Write (" selected=\"selected\">");
                }
                else {
                    writer.Write (">");
                }
                writer.WriteEncodedText (item.Text);
                writer.WriteLine ("</option>");
            }
            ConditionalSetPendingBreak(writer);
            writer.WriteEndTag ("select");            
            writer.WriteLine ();      
            ConditionalPopPhysicalCssClass(writer);
            ConditionalExitStyle(writer, Style);
        }
Пример #32
0
        /// <include file='doc\XhtmlBasicPhoneCallAdapter.uex' path='docs/doc[@for="XhtmlPhoneCallAdapter.Render"]/*' />
        public override void Render(XhtmlMobileTextWriter writer)
        {
            ConditionalClearPendingBreak(writer);
            Style       style  = Style;
            StyleFilter filter = writer.CurrentStyleClass.GetFilter(style);

            if ((filter & XhtmlConstants.Layout) != 0)
            {
                ConditionalEnterLayout(writer, style);
            }
            if (Device.CanInitiateVoiceCall)
            {
                String text        = Control.Text;
                String phoneNumber = Control.PhoneNumber;

                if (text == null || text.Length == 0)
                {
                    text = phoneNumber;
                }

                writer.WriteBeginTag("a");

                if ((String)Device["supportsWtai"] == "true")
                {
                    writer.Write(" href=\"wtai://wp/mc;");
                }
                else
                {
                    writer.Write(" href=\"tel:");
                }

                foreach (char ch in phoneNumber)
                {
                    if (ch >= '0' && ch <= '9' || ch == '#' || ch == '+')
                    {
                        writer.Write(ch);
                    }
                }
                writer.Write("\"");
                ConditionalRenderCustomAttribute(writer, XhtmlConstants.AccessKeyCustomAttribute);
                String cssClass = GetCustomAttributeValue(XhtmlConstants.CssClassCustomAttribute);
                if (CssLocation != StyleSheetLocation.PhysicalFile)
                {
                    String className = writer.GetCssFormatClassName(style);
                    if (className != null)
                    {
                        writer.WriteAttribute("class", className);
                    }
                }
                else if (cssClass != null && cssClass.Length > 0)
                {
                    writer.WriteAttribute("class", cssClass, true /* encode */);
                }
                writer.Write(">");
                writer.WriteEncodedText(text);
                writer.WriteEndTag("a");
                ConditionalSetPendingBreakAfterInline(writer);
            }
            else
            {
                // Format the text string based on properties
                String text = String.Format(
                    CultureInfo.CurrentCulture,
                    Control.AlternateFormat,
                    Control.Text,
                    Control.PhoneNumber);
                String url = Control.AlternateUrl;

                // If URI specified, create a link.  Otherwise, only text is displayed.
                if (url != null && url.Length > 0)
                {
                    String cssClass  = GetCustomAttributeValue(XhtmlConstants.CssClassCustomAttribute);
                    String accessKey = GetCustomAttributeValue(XhtmlConstants.AccessKeyCustomAttribute);
                    RenderBeginLink(writer, url, accessKey, style, cssClass);
                    writer.WriteEncodedText(text);
                    RenderEndLink(writer);
                    ConditionalSetPendingBreakAfterInline(writer);
                }
                else
                {
                    writer.WritePendingBreak();
                    ConditionalEnterFormat(writer, style);
                    ConditionalRenderOpeningSpanElement(writer);
                    writer.WriteEncodedText(text);
                    ConditionalRenderClosingSpanElement(writer);
                    ConditionalExitFormat(writer, style);
                    ConditionalSetPendingBreak(writer);
                }
            }
            if ((filter & XhtmlConstants.Layout) != 0)
            {
                ConditionalExitLayout(writer, style);
            }
        }
 // For Style/CssClass args, see ASURT 144034
 /// <include file='doc\XhtmlBasicControlAdapter.uex' path='docs/doc[@for="XhtmlControlAdapter.RenderPostBackEventAsAnchor2"]/*' />
 protected virtual void RenderPostBackEventAsAnchor (
     XhtmlMobileTextWriter writer,
     String argument,
     String linkText, 
     String accessKey,
     Style style,
     String cssClass) {            
     writer.WriteBeginTag("a");
     writer.Write(" href=\"");
     PageAdapter.RenderUrlPostBackEvent(writer, Control.UniqueID /* target */, argument);
     writer.Write("\" ");
     if (accessKey != null && accessKey.Length > 0) {
         writer.WriteAttribute("accesskey", accessKey);
     }
     if ((String)Device[XhtmlConstants.RequiresXhtmlCssSuppression] != "true") {
         if (CssLocation != StyleSheetLocation.PhysicalFile) {
             String className = writer.GetCssFormatClassName(style);
             if (className != null) {
                 writer.WriteAttribute ("class", className);
             }
         }
         else if (cssClass != null && cssClass.Length > 0) {
             writer.WriteAttribute ("class", cssClass, true /* encode */);
         }
     }
     writer.Write(">");
     writer.WriteEncodedText(linkText);
     writer.WriteEndTag("a");
 }
 private void RenderListItem (XhtmlMobileTextWriter writer, MobileListItem item) {
     String accessKey = GetCustomAttributeValue(item, XhtmlConstants.AccessKeyCustomAttribute);
     String cssClass = GetCustomAttributeValue(item, XhtmlConstants.CssClassCustomAttribute);
     if (Control.ItemsAsLinks) {
         RenderBeginLink (writer, item.Value, accessKey, Style, cssClass);
         writer.WriteEncodedText (item.Text);
         RenderEndLink (writer);
     }
     else if (Control.HasItemCommandHandler) {
         RenderPostBackEventAsAnchor (writer, 
             item.Index.ToString(CultureInfo.InvariantCulture) /*event argument*/, 
             item.Text /*link text*/,
             accessKey,
             Style,
             cssClass);
     }
     else {
         writer.WriteEncodedText (item.Text);
     }
 }
 // Called from RenderItemDetails.  (Extracted for intelligibility.)
 private void RenderItemFieldsInDetailsView (XhtmlMobileTextWriter writer, ObjectListItem item) {
     Style style = Style;
     IObjectListFieldCollection fields = Control.AllFields;
     foreach (ObjectListField field in fields) {
         if (field.Visible) {
             writer.Write("<tr><td>");
             ConditionalEnterStyle(writer, Style);
             writer.WriteEncodedText (field.Title);
             ConditionalExitStyle(writer, Style);
             writer.Write("</td><td>");
             ConditionalEnterStyle(writer, style);
             writer.WriteEncodedText (item [fields.IndexOf (field)]);
             ConditionalExitStyle(writer, style);
             writer.WriteLine("</td></tr>");
         }
     }
 }
        /// <include file='doc\XhtmlBasicPageAdapter.uex' path='docs/doc[@for="XhtmlPageAdapter.Render"]/*' />
        public override void Render(XhtmlMobileTextWriter writer)
        {
            writer.BeginResponse();
            if (Page.Request.Browser["requiresPragmaNoCacheHeader"] == "true")
            {
                Page.Response.AppendHeader("Pragma", "no-cache");
            }
            InitWriterState(writer);
            writer.BeginCachedRendering();
            // For consistency with HTML, we render the form style with body tag.
            RenderOpeningBodyElement(writer);
            // Certain WML 2.0 devices require that we write an onevent onenterforward setvar snippet.
            // We cannot know the relevant variables until after the form is rendered, so we mark this
            // position.  The setvar elements will be inserted into the cached rendering here.
            writer.MarkWmlOnEventLocation();
            Page.ActiveForm.RenderControl(writer);
            RenderClosingBodyElement(writer);
            writer.ClearPendingBreak();
            writer.EndCachedRendering();

            // Note: first and third arguments are not used.
            writer.BeginFile(Page.Request.Url.ToString(), Page.Device.PreferredRenderingMime, Page.Response.Charset);
            String supportsXmlDeclaration = Device["supportsXmlDeclaration"];

            // Invariant culture not needed, included for best practices compliance.
            if (supportsXmlDeclaration == null ||
                !String.Equals(supportsXmlDeclaration, "false", StringComparison.OrdinalIgnoreCase))
            {
                writer.WriteXmlDeclaration();
            }
            writer.WriteDoctypeDeclaration(DocumentType);
            // Review: Hard coded xmlns.
            writer.WriteFullBeginTag("html xmlns=\"http://www.w3.org/1999/xhtml\"");
            writer.WriteLine();
            writer.WriteFullBeginTag("head");
            writer.WriteLine();
            writer.WriteFullBeginTag("title");
            if (Page.ActiveForm.Title != null)
            {
                writer.WriteEncodedText(Page.ActiveForm.Title);
            }
            writer.WriteEndTag("title");
            ConditionalRenderLinkElement(writer);
            ConditionalRenderStyleElement(writer);
            writer.WriteEndTag("head");
            writer.WriteLine();
            writer.WriteCachedMarkup();  // includes body tag.
            writer.WriteLine();
            writer.WriteEndTag("html");
            writer.EndFile();
            if (!DoesDeviceRequireCssSuppression())
            {
                if (CssLocation == StyleSheetLocation.ApplicationCache && !writer.IsStyleSheetEmpty())
                {
                    // Recall that Page.Cache has application scope
                    Page.Cache.Insert(writer.CacheKey, writer.GetStyles(), null, DateTime.MaxValue, _cacheExpirationTime);
                }
                else if (CssLocation == StyleSheetLocation.SessionState && !writer.IsStyleSheetEmpty())
                {
                    Page.Session[writer.SessionKey] = writer.GetStyles();
                }
            }

            writer.EndResponse();
        }
 private void RenderListViewTableHeader (XhtmlMobileTextWriter writer, int fieldCount, int[] fieldIndices, bool itemRequiresMoreButton){
     String cssClass = GetCustomAttributeValue(XhtmlConstants.CssClassCustomAttribute);
     String labelClass = GetCustomAttributeValue(XhtmlConstants.CssLabelClassCustomAttribute); 
     if (labelClass == null || labelClass.Length == 0) {
         labelClass = cssClass;
     }
     writer.WriteLine("<tr>");
     for (int field = 0; field < fieldCount; field++) {
         writer.WriteBeginTag("td");
         if (CssLocation == StyleSheetLocation.PhysicalFile && labelClass != null && labelClass.Length > 0) {
             writer.WriteAttribute("class", labelClass, true);
         }
         writer.Write(">");
         Style labelStyle = Control.LabelStyle;
         ConditionalEnterStyle(writer, labelStyle);
         writer.WriteEncodedText(Control.AllFields[fieldIndices[field]].Title);
         ConditionalExitStyle(writer, labelStyle);
         writer.Write("</td>");
     }
     if (itemRequiresMoreButton) {
         writer.WriteLine("<td/>");
     }
     writer.WriteLine();
     writer.WriteLine("</tr>");
 }
 /// <include file='doc\XhtmlBasicTextViewAdapter.uex' path='docs/doc[@for="XhtmlTextViewAdapter.RenderElement"]/*' />
 public void RenderElement(XhtmlMobileTextWriter writer, int index, int beginSubstring, int endSubstring) {
     TextViewElement element = Control.GetElement(index);
     writer.WritePendingBreak();
     if (endSubstring == -1) {
         endSubstring = element.Text.Length;
     }
     String text = element.Text;
     if (beginSubstring > 0 || endSubstring < text.Length) {
         text = text.Substring(beginSubstring, endSubstring - beginSubstring);
     }
     BooleanOption prevBold = Style.Font.Bold;
     BooleanOption prevItalic = Style.Font.Italic;
     if (element.IsBold) {
         Style.Font.Bold = BooleanOption.True;
     }
     if (element.IsItalic) {
         Style.Font.Italic = BooleanOption.True;
     }
     ConditionalEnterStyle(writer, Style);           
     if (element.Url != null) {
         RenderBeginLink(writer, element.Url);
         writer.WriteEncodedText(text);
         RenderEndLink(writer);
     }
     else {
         writer.WriteEncodedText(text);
     }
     if (element.BreakAfter) {
         writer.SetPendingBreak();
     }
     ConditionalExitStyle(writer, Style);
     Style.Font.Bold = prevBold;
     Style.Font.Italic = prevItalic;
 }
        void RenderInputElementSet(XhtmlMobileTextWriter writer)
        {
            string wrappingTag = Device.Tables ? "table" :
                                 (((string)Device["usePOverDiv"] == "true") ? "p" : "div");
            ListSelectType           selectType = Control.SelectType;
            MobileListItemCollection items      = Control.Items;
            // Review: We always render a table.  Should we optimize away the table tags when the alignment is left?
            String selectTypeString =
                (selectType == ListSelectType.Radio) ?
                "radio" :
                "checkbox";

            ClearPendingBreakIfDeviceBreaksOnBlockLevel(writer); // Since we are writing a block-level element in all cases.
            ConditionalEnterLayout(writer, Style);
            RenderOpeningListTag(writer, wrappingTag);
            for (int itemIndex = 0; itemIndex < items.Count; itemIndex++)
            {
                MobileListItem item = items[itemIndex];
                if (Device.Tables)
                {
                    writer.WriteFullBeginTag("tr");
                    writer.WriteFullBeginTag("td");
                }

                writer.WriteBeginTag("input");
                writer.WriteAttribute("type", selectTypeString);
                writer.WriteAttribute("name", Control.UniqueID);
                WriteItemValueAttribute(writer, itemIndex, item.Value);
                String accessKey = GetCustomAttributeValue(item, XhtmlConstants.AccessKeyCustomAttribute);
                if (accessKey != null && accessKey.Length > 0)
                {
                    writer.WriteAttribute("accesskey", accessKey, true);
                }
                // Assumption: Device.SupportsUncheck is always true for Xhtml devices.
                if (item.Selected &&
                    (Control.IsMultiSelect || itemIndex == Control.SelectedIndex))
                {
                    writer.Write(" checked=\"checked\"/>");
                }
                else
                {
                    writer.Write("/>");
                }

                writer.WriteEncodedText(item.Text);
                if (Device.Tables)
                {
                    writer.WriteEndTag("td");
                }
                if ((string)Device["usePOverDiv"] == "true" || !Device.Tables)
                {
                    writer.Write("<br/>");
                }
                if (Device.Tables)
                {
                    writer.WriteEndTag("tr");
                }
            }
            RenderClosingListTag(writer, wrappingTag);
            ConditionalExitLayout(writer, Style);
        }
        /// <include file='doc\XhtmlBasicFormAdapter.uex' path='docs/doc[@for="XhtmlFormAdapter.Render"]/*' />
        public override void Render(XhtmlMobileTextWriter writer)
        {
            // Note: <head>, <body> rendered by page adapter, as in HTML case.
            String formsAuthCookieName = FormsAuthentication.FormsCookieName;

            if (!Device.SupportsRedirectWithCookie)
            {
                if (formsAuthCookieName != null && formsAuthCookieName.Length > 0)
                {
                    HttpContext.Current.Response.Cookies.Remove(formsAuthCookieName);
                }
            }
            writer.WriteBeginTag("form");
            writer.WriteAttribute("id", Control.ClientID);
            writer.WriteAttribute("method", Control.Method.ToString().ToLower(CultureInfo.CurrentCulture));
            writer.Write(" action=\"");
            RenderPostbackUrl(writer);
            if (Control.Action.Length > 0)
            {
                if (Control.Action.IndexOf("?", StringComparison.Ordinal) != -1)
                {
                    writer.Write("&");
                }
                else
                {
                    writer.Write("?");
                }
            }
            else
            {
                writer.Write("?");
            }
            writer.Write(Page.UniqueFilePathSuffix);

            if (Control.Method != FormMethod.Get &&
                Control.Action.Length == 0)     // VSWhidbey 411176: We don't include QueryStringText if Action is explicitly set

            {
                String queryStringText = PreprocessQueryString(Page.QueryStringText);
                if (queryStringText != null && queryStringText.Length > 0)
                {
                    String amp = (String)Device[XhtmlConstants.SupportsUrlAttributeEncoding] != "false"  ? "&amp;" : "&";
                    writer.Write(amp);
                    if ((String)Device[XhtmlConstants.SupportsUrlAttributeEncoding] != "false")
                    {
                        writer.WriteEncodedText(queryStringText);
                    }
                    else
                    {
                        writer.Write(queryStringText);
                    }
                }
            }
            writer.WriteLine("\">");
            bool needDivStyle = (String)Device[XhtmlConstants.RequiresXhtmlCssSuppression] != "true" &&
                                (String)Device["supportsBodyClassAttribute"] == "false";

            if (!needDivStyle)
            {
                if ((String)Device["usePOverDiv"] == "true")
                {
                    writer.WriteFullBeginTag("p");
                }
                else
                {
                    writer.WriteFullBeginTag("div");
                }
            }
            else
            {
                if ((String)Device["usePOverDiv"] == "true")
                {
                    writer.EnterStyle(Style, "p");
                }
                else
                {
                    writer.EnterStyle(Style, "div");
                }
            }
            RenderPostBackHeader(writer);
            // Renders hidden variables for IPostBackDataHandlers which are
            // not displayed due to pagination or secondary UI.
            RenderOffPageVariables(writer, Control, Control.CurrentPage);

            RenderChildren(writer);
            if (!needDivStyle)
            {
                if ((String)Device["usePOverDiv"] == "true")
                {
                    writer.WriteEndTag("p");
                }
                else
                {
                    writer.WriteEndTag("div");
                }
            }
            else
            {
                if ((String)Device["usePOverDiv"] == "true")
                {
                    writer.ExitStyle(Style);
                }
                else
                {
                    writer.ExitStyle(Style);
                }
            }
            writer.WriteEndTag("form");
        }