e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
503 lines
18 KiB
C#
503 lines
18 KiB
C#
//------------------------------------------------------------------------------
|
|
// <copyright file="BulletedList.cs" company="Microsoft">
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
//------------------------------------------------------------------------------
|
|
|
|
namespace System.Web.UI.WebControls {
|
|
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Specialized;
|
|
using System.ComponentModel;
|
|
using System.Globalization;
|
|
using System.Web;
|
|
using System.Web.UI;
|
|
using System.Web.UI.WebControls;
|
|
using System.Drawing.Design;
|
|
using System.Web.Util;
|
|
|
|
|
|
|
|
/// <devdoc>
|
|
/// <para>Generates a bulleted list.</para>
|
|
/// </devdoc>
|
|
[DefaultProperty("BulletStyle")]
|
|
[DefaultEvent("Click")]
|
|
[Designer("System.Web.UI.Design.WebControls.BulletedListDesigner, " + AssemblyRef.SystemDesign)]
|
|
[SupportsEventValidation]
|
|
public class BulletedList : ListControl, IPostBackEventHandler {
|
|
|
|
private static readonly object EventClick = new object();
|
|
|
|
private bool _cachedIsEnabled;
|
|
private int _firstItem;
|
|
private int _itemCount;
|
|
|
|
|
|
/// <devdoc></devdoc>
|
|
public BulletedList() {
|
|
_firstItem = 0;
|
|
_itemCount = -1;
|
|
}
|
|
|
|
|
|
/// <devdoc>
|
|
/// <para>Gets the value of the base classes AutoPostBack propert.
|
|
/// AutoPostBack is not applicable to the bulleted list control</para>
|
|
/// </devdoc>
|
|
[
|
|
Browsable(false),
|
|
EditorBrowsable(EditorBrowsableState.Never)
|
|
]
|
|
public override bool AutoPostBack {
|
|
get {
|
|
return base.AutoPostBack;
|
|
}
|
|
set {
|
|
throw new NotSupportedException(SR.GetString(SR.Property_Set_Not_Supported, "AutoPostBack", this.GetType().ToString()));
|
|
}
|
|
}
|
|
|
|
|
|
/// <devdoc>
|
|
/// <para>Gets or sets a value indicating the style of bullet to be
|
|
/// applied to the list.</para>
|
|
/// </devdoc>
|
|
[
|
|
WebCategory("Appearance"),
|
|
DefaultValue(BulletStyle.NotSet),
|
|
WebSysDescription(SR.BulletedList_BulletStyle)
|
|
]
|
|
public virtual BulletStyle BulletStyle {
|
|
get {
|
|
object o = ViewState["BulletStyle"];
|
|
return((o == null) ? BulletStyle.NotSet : (BulletStyle)o);
|
|
}
|
|
set {
|
|
if (value < BulletStyle.NotSet || value > BulletStyle.CustomImage) {
|
|
throw new ArgumentOutOfRangeException("value");
|
|
}
|
|
ViewState["BulletStyle"] = value;
|
|
}
|
|
}
|
|
|
|
|
|
/// <devdoc>
|
|
/// <para>Gets or sets the source of the image used for an
|
|
/// Image styled bulleted list.</para>
|
|
/// </devdoc>
|
|
[
|
|
WebCategory("Appearance"),
|
|
DefaultValue(""),
|
|
Editor("System.Web.UI.Design.ImageUrlEditor, " + AssemblyRef.SystemDesign, typeof(UITypeEditor)),
|
|
UrlProperty(),
|
|
WebSysDescription(SR.BulletedList_BulletImageUrl)
|
|
]
|
|
public virtual string BulletImageUrl {
|
|
get {
|
|
object o = ViewState["BulletImageUrl"];
|
|
return((o == null) ? string.Empty : (string)o);
|
|
}
|
|
set {
|
|
ViewState["BulletImageUrl"] = value;
|
|
}
|
|
}
|
|
|
|
|
|
/// <devdoc>
|
|
/// <para>Gets the EmptyControlCollection.</para>
|
|
/// </devdoc>
|
|
public override ControlCollection Controls {
|
|
get {
|
|
return new EmptyControlCollection(this);
|
|
}
|
|
}
|
|
|
|
|
|
/// <devdoc>
|
|
/// <para>Gets or sets the display mode of the bulleted list.</para>
|
|
/// </devdoc>
|
|
[
|
|
WebCategory("Behavior"),
|
|
DefaultValue(BulletedListDisplayMode.Text),
|
|
WebSysDescription(SR.BulletedList_BulletedListDisplayMode) //
|
|
]
|
|
public virtual BulletedListDisplayMode DisplayMode {
|
|
get {
|
|
object o = ViewState["DisplayMode"];
|
|
return ((o == null) ? BulletedListDisplayMode.Text : (BulletedListDisplayMode)o);
|
|
}
|
|
set {
|
|
if (value < BulletedListDisplayMode.Text || value > BulletedListDisplayMode.LinkButton) {
|
|
throw new ArgumentOutOfRangeException("value");
|
|
}
|
|
ViewState["DisplayMode"] = value;
|
|
}
|
|
}
|
|
|
|
|
|
/// <devdoc>
|
|
/// <para>Gets or sets the value at which an ordered list should
|
|
/// begin its numbering.</para>
|
|
/// </devdoc>
|
|
[
|
|
WebCategory("Appearance"),
|
|
DefaultValue(1),
|
|
WebSysDescription(SR.BulletedList_FirstBulletNumber)
|
|
]
|
|
public virtual int FirstBulletNumber {
|
|
get {
|
|
object o = ViewState["FirstBulletNumber"];
|
|
return((o == null) ? 1 : (int)o);
|
|
}
|
|
set {
|
|
ViewState["FirstBulletNumber"] = value;
|
|
}
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// <para>Indicates whether the control will be rendered when the data source has no items.</para>
|
|
/// </summary>
|
|
[DefaultValue(false)]
|
|
[Themeable(true)]
|
|
[WebCategory("Behavior")]
|
|
[WebSysDescription(SR.ListControl_RenderWhenDataEmpty)]
|
|
public virtual bool RenderWhenDataEmpty {
|
|
get {
|
|
object o = ViewState["RenderWhenDataEmpty"];
|
|
return ((o == null) ? false : (bool)o);
|
|
}
|
|
set {
|
|
ViewState["RenderWhenDataEmpty"] = value;
|
|
}
|
|
}
|
|
|
|
|
|
/// <devdoc>
|
|
/// <para>Gets the value of selected index. Not applicable to the
|
|
/// bulleted list control.</para>
|
|
/// </devdoc>
|
|
[
|
|
Bindable(false),
|
|
EditorBrowsable(EditorBrowsableState.Never)
|
|
]
|
|
public override int SelectedIndex {
|
|
get {
|
|
return base.SelectedIndex;
|
|
}
|
|
set {
|
|
throw new NotSupportedException(SR.GetString(SR.BulletedList_SelectionNotSupported));
|
|
}
|
|
}
|
|
|
|
|
|
/// <devdoc>
|
|
/// <para>Gets the selected item. Not applicable to the
|
|
/// bulleted list control.</para>
|
|
/// </devdoc>
|
|
[
|
|
EditorBrowsable(EditorBrowsableState.Never)
|
|
]
|
|
public override ListItem SelectedItem {
|
|
get {
|
|
return base.SelectedItem;
|
|
}
|
|
}
|
|
|
|
[
|
|
Bindable(false),
|
|
EditorBrowsable(EditorBrowsableState.Never)
|
|
]
|
|
public override string SelectedValue {
|
|
get {
|
|
return base.SelectedValue;
|
|
}
|
|
set {
|
|
throw new NotSupportedException(SR.GetString(SR.BulletedList_SelectionNotSupported));
|
|
}
|
|
}
|
|
|
|
|
|
/// <devdoc>
|
|
/// <para>Gets the HtmlTextWriterTag value that corresponds
|
|
/// to the particular bulleted list.</para>
|
|
/// </devdoc>
|
|
protected override HtmlTextWriterTag TagKey {
|
|
get {
|
|
return TagKeyInternal;
|
|
}
|
|
}
|
|
|
|
internal HtmlTextWriterTag TagKeyInternal {
|
|
get {
|
|
switch (BulletStyle) {
|
|
// Ordered Lists
|
|
case BulletStyle.LowerAlpha:
|
|
case BulletStyle.UpperAlpha:
|
|
case BulletStyle.LowerRoman:
|
|
case BulletStyle.UpperRoman:
|
|
case BulletStyle.Numbered:
|
|
return HtmlTextWriterTag.Ol;
|
|
// Unordered Lists
|
|
case BulletStyle.Square:
|
|
case BulletStyle.Circle:
|
|
case BulletStyle.Disc:
|
|
return HtmlTextWriterTag.Ul;
|
|
// Image Lists
|
|
case BulletStyle.CustomImage:
|
|
return HtmlTextWriterTag.Ul;
|
|
// Not Set
|
|
case BulletStyle.NotSet:
|
|
// NotSet is specified as an unordered list.
|
|
return HtmlTextWriterTag.Ul;
|
|
default:
|
|
Debug.Assert(false, "Invalid BulletStyle");
|
|
return HtmlTextWriterTag.Ol;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/// <devdoc>
|
|
/// <para>Gets or sets the Target window when the
|
|
/// list is displayed as Hyperlinks.</para>
|
|
/// </devdoc>
|
|
[
|
|
WebCategory("Behavior"),
|
|
DefaultValue(""),
|
|
WebSysDescription(SR.BulletedList_Target),
|
|
TypeConverter(typeof(TargetConverter))
|
|
]
|
|
public virtual string Target {
|
|
get {
|
|
object o = ViewState["Target"];
|
|
return ((o == null) ? string.Empty : (string)o);
|
|
}
|
|
set {
|
|
ViewState["Target"] = value;
|
|
}
|
|
}
|
|
|
|
[
|
|
EditorBrowsable(EditorBrowsableState.Never)
|
|
]
|
|
public override string Text {
|
|
get {
|
|
return base.Text;
|
|
}
|
|
set {
|
|
throw new NotSupportedException(SR.GetString(SR.BulletedList_TextNotSupported));
|
|
}
|
|
}
|
|
|
|
|
|
/// <devdoc>
|
|
/// <para>Occurs when the a link button is clicked.</para>
|
|
/// </devdoc>
|
|
[
|
|
WebCategory("Action"),
|
|
WebSysDescription(SR.BulletedList_OnClick)
|
|
]
|
|
public event BulletedListEventHandler Click {
|
|
add {
|
|
Events.AddHandler(EventClick, value);
|
|
}
|
|
remove {
|
|
Events.RemoveHandler(EventClick, value);
|
|
}
|
|
}
|
|
|
|
|
|
/// <devdoc>
|
|
/// <para>Adds HTML attributes that need to be rendered.</para>
|
|
/// </devdoc>
|
|
protected override void AddAttributesToRender(HtmlTextWriter writer) {
|
|
bool addBulletNumber = false;
|
|
|
|
switch (BulletStyle) {
|
|
case BulletStyle.NotSet:
|
|
break;
|
|
case BulletStyle.Numbered:
|
|
writer.AddStyleAttribute(HtmlTextWriterStyle.ListStyleType, "decimal");
|
|
addBulletNumber = true;
|
|
break;
|
|
case BulletStyle.LowerAlpha:
|
|
writer.AddStyleAttribute(HtmlTextWriterStyle.ListStyleType, "lower-alpha");
|
|
addBulletNumber = true;
|
|
break;
|
|
case BulletStyle.UpperAlpha:
|
|
writer.AddStyleAttribute(HtmlTextWriterStyle.ListStyleType, "upper-alpha");
|
|
addBulletNumber = true;
|
|
break;
|
|
case BulletStyle.LowerRoman:
|
|
writer.AddStyleAttribute(HtmlTextWriterStyle.ListStyleType, "lower-roman");
|
|
addBulletNumber = true;
|
|
break;
|
|
case BulletStyle.UpperRoman:
|
|
writer.AddStyleAttribute(HtmlTextWriterStyle.ListStyleType, "upper-roman");
|
|
addBulletNumber = true;
|
|
break;
|
|
case BulletStyle.Disc:
|
|
writer.AddStyleAttribute(HtmlTextWriterStyle.ListStyleType, "disc");
|
|
break;
|
|
case BulletStyle.Circle:
|
|
writer.AddStyleAttribute(HtmlTextWriterStyle.ListStyleType, "circle");
|
|
break;
|
|
case BulletStyle.Square:
|
|
writer.AddStyleAttribute(HtmlTextWriterStyle.ListStyleType, "square");
|
|
break;
|
|
case BulletStyle.CustomImage:
|
|
String url = ResolveClientUrl(BulletImageUrl);
|
|
writer.AddStyleAttribute(HtmlTextWriterStyle.ListStyleImage, "url(" + HttpUtility.UrlPathEncode(url) + ")");
|
|
break;
|
|
default:
|
|
Debug.Assert(false, "Invalid BulletStyle");
|
|
break;
|
|
}
|
|
int firstBulletNumber = FirstBulletNumber;
|
|
if ((addBulletNumber == true) && (firstBulletNumber != 1)) {
|
|
writer.AddAttribute("start", firstBulletNumber.ToString(CultureInfo.InvariantCulture));
|
|
}
|
|
base.AddAttributesToRender(writer);
|
|
}
|
|
|
|
private string GetPostBackEventReference(string eventArgument) {
|
|
if (CausesValidation && Page.GetValidators(ValidationGroup).Count > 0) {
|
|
return ClientScriptManager.JscriptPrefix + Util.GetClientValidatedPostback(this, ValidationGroup, eventArgument);
|
|
} else {
|
|
return Page.ClientScript.GetPostBackClientHyperlink(this, eventArgument, true);
|
|
}
|
|
}
|
|
|
|
/// <devdoc>
|
|
/// <para>Raises the Click event.</para>
|
|
/// </devdoc>
|
|
protected virtual void OnClick(BulletedListEventArgs e) {
|
|
BulletedListEventHandler onClickHandler = (BulletedListEventHandler)Events[EventClick];
|
|
if (onClickHandler != null)
|
|
onClickHandler(this, e);
|
|
}
|
|
|
|
|
|
/// <devdoc>
|
|
/// <para>Writes the text of each bullet according to the list's display mode.</para>
|
|
/// </devdoc>
|
|
protected virtual void RenderBulletText(ListItem item, int index, HtmlTextWriter writer) {
|
|
switch (DisplayMode) {
|
|
case BulletedListDisplayMode.Text:
|
|
if (!item.Enabled) {
|
|
RenderDisabledAttributeHelper(writer, false);
|
|
writer.RenderBeginTag(HtmlTextWriterTag.Span);
|
|
}
|
|
HttpUtility.HtmlEncode(item.Text, writer);
|
|
if (!item.Enabled) {
|
|
writer.RenderEndTag();
|
|
}
|
|
break;
|
|
|
|
case BulletedListDisplayMode.HyperLink:
|
|
if (_cachedIsEnabled && item.Enabled) {
|
|
writer.AddAttribute(HtmlTextWriterAttribute.Href, ResolveClientUrl(item.Value));
|
|
string target = Target;
|
|
if (!String.IsNullOrEmpty(target)) {
|
|
writer.AddAttribute(HtmlTextWriterAttribute.Target, Target);
|
|
}
|
|
}
|
|
else {
|
|
RenderDisabledAttributeHelper(writer, item.Enabled);
|
|
}
|
|
|
|
RenderAccessKey(writer, AccessKey);
|
|
writer.RenderBeginTag(HtmlTextWriterTag.A);
|
|
HttpUtility.HtmlEncode(item.Text, writer);
|
|
writer.RenderEndTag();
|
|
break;
|
|
|
|
case BulletedListDisplayMode.LinkButton:
|
|
if (_cachedIsEnabled && item.Enabled) {
|
|
writer.AddAttribute(HtmlTextWriterAttribute.Href, GetPostBackEventReference(index.ToString(CultureInfo.InvariantCulture)));
|
|
}
|
|
else {
|
|
RenderDisabledAttributeHelper(writer, item.Enabled);
|
|
}
|
|
|
|
RenderAccessKey(writer, AccessKey);
|
|
writer.RenderBeginTag(HtmlTextWriterTag.A);
|
|
HttpUtility.HtmlEncode(item.Text, writer);
|
|
writer.RenderEndTag();
|
|
break;
|
|
|
|
default:
|
|
Debug.Assert(false, "Invalid BulletedListDisplayMode");
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
private void RenderDisabledAttributeHelper(HtmlTextWriter writer, bool isItemEnabled) {
|
|
if (SupportsDisabledAttribute) {
|
|
writer.AddAttribute(HtmlTextWriterAttribute.Disabled, "disabled");
|
|
}
|
|
else if (!isItemEnabled && !String.IsNullOrEmpty(DisabledCssClass)) {
|
|
writer.AddAttribute(HtmlTextWriterAttribute.Class, DisabledCssClass);
|
|
}
|
|
}
|
|
|
|
internal void RenderAccessKey(HtmlTextWriter writer, string AccessKey) {
|
|
string s = AccessKey;
|
|
if (s.Length > 0) {
|
|
writer.AddAttribute(HtmlTextWriterAttribute.Accesskey, s);
|
|
}
|
|
}
|
|
|
|
protected internal override void Render(HtmlTextWriter writer) {
|
|
// Don't render anything if the control is empty (unless the developer opts in)
|
|
if (Items.Count == 0 && !RenderWhenDataEmpty) {
|
|
return;
|
|
}
|
|
|
|
base.Render(writer);
|
|
}
|
|
|
|
|
|
/// <devdoc>
|
|
/// <para>Renders the ListItems as bullets in the bulleted list.</para>
|
|
/// </devdoc>
|
|
protected internal override void RenderContents(HtmlTextWriter writer) {
|
|
_cachedIsEnabled = IsEnabled;
|
|
|
|
if (_itemCount == -1) {
|
|
for (int i = 0; i < Items.Count; i++) {
|
|
Items[i].RenderAttributes(writer);
|
|
writer.RenderBeginTag(HtmlTextWriterTag.Li);
|
|
RenderBulletText(Items[i], i, writer);
|
|
writer.RenderEndTag();
|
|
}
|
|
}
|
|
else {
|
|
for (int i = _firstItem; i < _firstItem + _itemCount; i++) {
|
|
Items[i].RenderAttributes(writer);
|
|
writer.RenderBeginTag(HtmlTextWriterTag.Li);
|
|
RenderBulletText(Items[i], i, writer);
|
|
writer.RenderEndTag();
|
|
}
|
|
}
|
|
}
|
|
|
|
protected virtual void RaisePostBackEvent(string eventArgument) {
|
|
ValidateEvent(this.UniqueID, eventArgument);
|
|
|
|
if (CausesValidation) {
|
|
Page.Validate(ValidationGroup);
|
|
}
|
|
OnClick(new BulletedListEventArgs(Int32.Parse(eventArgument, CultureInfo.InvariantCulture)));
|
|
}
|
|
|
|
void IPostBackEventHandler.RaisePostBackEvent(string eventArgument) {
|
|
RaisePostBackEvent(eventArgument);
|
|
}
|
|
}
|
|
}
|