📄 freetextbox.cs
字号:
using System;
using System.Collections;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using FreeTextBoxControls.Common;
using FreeTextBoxControls.Design;
[assembly:TagPrefix("FreeTextBoxControls", "FTB")]
namespace FreeTextBoxControls
{
#region 处理回传事件
/// <summary>
/// 回传事件委托
/// </summary>
public delegate void ToolbarPostBackButtonEventHandler(object sender, ToolbarPostBackButtonEventArgs e);
/// <summary>
/// 处理回传事件
/// </summary>
public class ToolbarPostBackButtonEventArgs : System.EventArgs
{
private readonly string title = string.Empty;
public ToolbarPostBackButtonEventArgs(string title)
{
this.title = title;
}
public string Title
{
get
{
return title;
}
}
}
#endregion
/// <summary>
/// 一个基于 MSHTML 的 ASP.NET 可视化编辑器。
/// </summary>
[ToolboxData("<{0}:FreeTextBox runat=server></{0}:FreeTextBox>"),ValidationPropertyAttribute("Text"),Designer(typeof(FreeTextBoxControls.Design.FreeTextBoxDesigner)),DescriptionAttribute("一个基于 MSHTML 的 ASP.NET 可视化编辑器。")]
public class FreeTextBox : Control, IPostBackDataHandler, INamingContainer, IPostBackEventHandler
{
#region 回传事件
/// <summary>
/// The event fired when a Save button is pressed.
/// </summary>
[DescriptionAttribute("当 保存 按钮按下时发生。")]
public event EventHandler SaveClick;
/// <summary>
/// The event fired when any ToolbarPostBackButton is pressed.
/// </summary>
public event ToolbarPostBackButtonEventHandler ToolbarPostBackButtonClick;
/// <summary>
/// Event for Save button
/// </summary>
[DescriptionAttribute("引发 SaveClick 事件。")]
protected virtual void OnSaveClick(EventArgs e)
{
if (SaveClick != null)
{
SaveClick(this, e);
}
}
/// <summary>
/// Event for ToolbarPostBackButton button
/// </summary>
protected virtual void OnToolbarPostBackButtonClick(ToolbarPostBackButtonEventArgs e)
{
if (ToolbarPostBackButtonClick != null)
{
ToolbarPostBackButtonClick(this, e);
}
}
public virtual void RaisePostBackEvent(string eventArgument)
{
switch (eventArgument)
{
case "Save":
this.OnSaveClick(EventArgs.Empty);
break;
default:
// calls the post back button event handler
this.OnToolbarPostBackButtonClick(new ToolbarPostBackButtonEventArgs(eventArgument));
break;
}
}
public void RaisePostDataChangedEvent()
{
// nothing happens for text changed
}
public bool LoadPostData(String postDataKey, NameValueCollection values)
{
string PresentValue = this.ViewStateText;
string PostedValue = values[this.ClientID];
if (!PresentValue.Equals(PostedValue))
{
this.Text = PostedValue;
return true;
}
else
{
return false;
}
}
#endregion
#region 属性集合
/// <summary>
/// Because CSS classes can't begin with an underscore, this property compartmentalizes removing the initial _ when FTB is inside of other controls
/// </summary>
private string CssID
{
get
{
string cssID = this.ClientID;
while (cssID.Substring(0,1) == "_")
{
cssID = cssID.Substring(1);
}
return cssID;
}
}
private string ViewStateText
{
get
{
object savedState = this.ViewState["Text"];
return (savedState == null) ? "" : (string) savedState;
}
}
/// <summary>
/// 获取去除 HTML 标记后的纯文本。
/// </summary>
[CategoryAttribute("输出"),BrowsableAttribute(false),DescriptionAttribute("获取去除 HTML 标记后的纯文本。")]
public string HtmlStrippedText
{
get
{
return Regex.Replace(this.Text,"<(.|\n)+?>","");
}
}
/// <summary>
/// 工具条集合
/// </summary>
[DescriptionAttribute("工具条集合")]
public ToolbarList Toolbars = new ToolbarList();
/// <summary>
/// 获取或设置编辑器中的内容。
/// </summary>
[CategoryAttribute("输出"),DescriptionAttribute("获取或设置编辑器中的内容,输出前将经过一些整理。")]
public string Text
{
get
{
string output = this.ViewStateText;
if (this.RemoveServerNameFromUrls || this.RemoveScriptNameFromBookmarks)
{
try
{
PostProcessor processor = new PostProcessor();
if (this.RemoveScriptNameFromBookmarks)
{
string server = Page.Request.ServerVariables["HTTP_HOST"];
string script = Page.Request.ServerVariables["SCRIPT_NAME"];
string qstring = Page.Request.QueryString.ToString();
output = processor.RemoveScriptNameFromBookmarks(output,server,script,qstring);
output = processor.RemoveScriptNameFromBookmarks(output,server,script,qstring.Replace("&","&"));
}
if (this.RemoveServerNameFromUrls)
output = processor.RemoveServerNameFromUrls(output,Page.Request.ServerVariables["HTTP_HOST"]);
}
catch (Exception ex)
{
throw new Exception(ex.ToString());
}
}
return output;
}
set
{
ViewState["Text"] = value;
}
}
/// <summary>
/// 获取编辑器中的原始内容。
/// </summary>
[CategoryAttribute("输出"),BrowsableAttribute(false),DescriptionAttribute("获取编辑器中的原始内容。")]
public string RawText
{
get
{
object savedState = this.ViewState["Text"];
return (savedState == null) ? "" : (string) savedState;
}
}
/// <summary>
/// 获取经 Server.HtmlEncode 编码后的文本。
/// </summary>
[CategoryAttribute("输出"),BrowsableAttribute(false),DescriptionAttribute("获取经 Server.HtmlEncode 编码后的文本。")]
public string HtmlEncodedText
{
get
{
return Page.Server.HtmlEncode(this.Text);
}
}
/// <summary>
/// 获取或设置 FreeTextBox 的粘贴模式。可以为 Default(默认), NoScript(自动去除脚本), NoHtml(自动去除 HTML 标记), Disabled(禁用粘贴功能)。
/// </summary>
[CategoryAttribute("行为"),DescriptionAttribute("获取或设置 FreeTextBox 的粘贴模式。可以为 Default(默认), NoScript(自动去除脚本), NoHtml(自动去除 HTML 标记), Disabled(禁用粘贴功能)。")]
public PasteMode PasteMode
{
get
{
object savedState = this.ViewState["PasteMode"];
return (savedState == null) ? PasteMode.Default : (PasteMode) savedState;
}
set
{
ViewState["PasteMode"] = value;
}
}
/// <summary>
/// 获取或设置是否注册样式表内容。
/// </summary>
[CategoryAttribute("行为"),DescriptionAttribute("获取或设置是否注册样式表内容。")]
public bool ParseStyleSheet
{
get
{
object savedState = this.ViewState["ParseStyleSheet"];
return (savedState == null) ? true : (bool) savedState;
}
set
{
ViewState["ParseStyleSheet"] = value;
}
}
/// <summary>
/// 获取或设置在编辑器中按TAB键时焦点是否切换到其他控件。
/// </summary>
[CategoryAttribute("行为"),DescriptionAttribute("获取或设置在编辑器中按TAB键时焦点是否切换到其他控件。")]
public TabMode TabMode
{
get
{
object savedState = this.ViewState["TabMode"];
return (savedState == null) ? TabMode.Default : (TabMode) savedState;
}
set
{
ViewState["TabMode"] = value;
}
}
/// <summary>
/// 控件在 IFrame 中的 Tab 键顺序
/// </summary>
[CategoryAttribute("行为"),DescriptionAttribute("控件的 Tab 键顺序")]
public int TabIndex
{
get
{
object savedState = this.ViewState["TabIndex"];
return (savedState == null) ? -1 : (int) savedState;
}
set
{
ViewState["TabIndex"] = value;
}
}
/// <summary>
/// 获取或设置一个值,该值指示编辑器是否为只读状态。
/// </summary>
[CategoryAttribute("行为"),DescriptionAttribute("获取或设置一个值,该值指示编辑器中的内容是否允许编辑。")]
public bool ReadOnly
{
get
{
object savedState = this.ViewState["ReadOnly"];
return (savedState == null) ? false : (bool) savedState;
}
set
{
ViewState["ReadOnly"] = value;
}
}
/// <summary>
/// 获取或设置一个值,该值指示是否将编辑器返回内容中 URL 的主机地址去除。如果不去除,则虚拟路径自动转换为绝对路径。
/// </summary>
[CategoryAttribute("行为"),DescriptionAttribute("获取或设置一个值,该值指示是否将编辑器返回内容中 URL 的主机地址去除。如果不去除,则虚拟路径自动转换为绝对路径。")]
public bool RemoveServerNameFromUrls
{
get
{
object savedState = this.ViewState["RemoveServerNameFromUrls"];
return (savedState == null) ? true : (bool) savedState;
}
set
{
ViewState["RemoveServerNameFromUrls"] = value;
}
}
/// <summary>
/// 获取或设置一个值,该值指示是否简化书签的 URL。
/// </summary>
[CategoryAttribute("行为"),DescriptionAttribute("获取或设置一个值,该值指示是否简化书签的 URL。")]
public bool RemoveScriptNameFromBookmarks
{
get
{
object savedState = this.ViewState["RemoveScriptNameFromBookmarks"];
return (savedState == null) ? true : (bool) savedState;
}
set
{
ViewState["RemoveScriptNameFromBookmarks"] = value;
}
}
/// <summary>
/// 获取或设置一个值,该值指示是否允许 SSL。默认为 false。
/// </summary>
[CategoryAttribute("行为"),DescriptionAttribute("获取或设置一个值,该值指示是否允许 SSL。默认为 false。")]
public bool EnableSsl
{
get
{
object savedState = this.ViewState["EnableSsl"];
return (savedState == null) ? false : (bool) savedState;
}
set
{
ViewState["EnableSsl"] = value;
}
}
/// <summary>
/// 获取或设置一个值,该值指示从 HTML 视图切换到设计视图时提示用户可能发生的 HTML 代码改变。默认为 false。
/// </summary>
[CategoryAttribute("行为"),DescriptionAttribute("获取或设置一个值,该值指示从 HTML 视图切换到设计视图时提示用户可能发生的 HTML 代码改变。默认为 false")]
public bool AlertClientToChangesInDesignMode
{
get
{
object savedState = this.ViewState["AlertClientToChangesInDesignMode"];
return (savedState == null) ? false : (bool) savedState;
}
set
{
ViewState["AlertClientToChangesInDesignMode"] = value;
}
}
/// <summary>
/// 获取或设置一个值,该值指示是否使用成对的引号。默认为 true。
/// </summary>
[CategoryAttribute("行为"),DescriptionAttribute("获取或设置一个值,该值指示是否使用成对的引号。默认为 true。")]
public bool EnableCurlyQuotes
{
get
{
object savedState = this.ViewState["EnableCurlyQuotes"];
return (savedState == null) ? true : (bool) savedState;
}
set
{
ViewState["EnableCurlyQuotes"] = value;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -