📄 webtextpane.cs
字号:
/*
* WebTextPane.cs @Microsoft Visual Studio 2008 <.NET Framework 2.0 (or Higher)>
* AfritXia
* 2006-07-09
*
* Copyright(c) http://www.AfritXia.NET/
*
*/
using System;
using System.Collections;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
namespace Net.AfritXia.Web.UI
{
/// <summary>
/// 自定义 Web 编辑器
/// </summary>
[ParseChildren(false)]
[ToolboxData(@"<{0}:WebTextPane Runat=""server""></{0}:WebTextPane>")]
[ControlBuilder(typeof(WtpRootCtrlBuilder))]
public class WebTextPane : WebControl, IPostBackDataHandler, INamingContainer, IClientRunTime
{
// 文本修改事件对象健
private static readonly object Event_TextChanged = new object();
// 工具条容器
private WtpToolbarContainer m_toolbarContainer = null;
// 设计器窗体
private WtpDesignerPane m_designerPane = null;
// 文本模型窗体
private WtpTextModelPane m_textModelPane = null;
// 存入 ViewState 的文本值
private string m_viewStateTextValue = null;
// 回发文本值
private string m_postBackTextValue = null;
// 当前文本值
private string m_xmlNText = null;
#region 类构造器
/// <summary>
/// 类默认构造器
/// </summary>
public WebTextPane()
: base("div")
{
}
/// <summary>
/// 类参数构造器
/// </summary>
/// <param name="parentControl">父控件</param>
public WebTextPane(TemplateControl parentControl)
: this()
{
if (parentControl != null)
parentControl.Controls.Add(this);
}
#endregion
/// <summary>
/// 文本修改事件处理句柄
/// </summary>
public event EventHandler TextChanged
{
add
{
this.Events.AddHandler(WebTextPane.Event_TextChanged, value);
}
remove
{
this.Events.RemoveHandler(WebTextPane.Event_TextChanged, value);
}
}
/// <summary>
/// 设置或获取当前文本值
/// </summary>
public string XMLNText
{
set
{
this.m_xmlNText = value;
}
get
{
return this.m_xmlNText;
}
}
/// <summary>
/// 获取设计器窗体控件
/// </summary>
public WtpDesignerPane DesignerPane
{
get
{
return this.m_designerPane;
}
}
/// <summary>
/// 获取工具条容器控件
/// </summary>
public WtpToolbarContainer ToolbarContainer
{
get
{
return this.m_toolbarContainer;
}
}
/// <summary>
/// 控件初始化函数
/// </summary>
/// <param name="e">初始化事件参数</param>
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
// <textarea></textarea>
this.m_textModelPane = new Net.AfritXia.Web.UI.WtpTextModelPane();
// 添加控件到集合
this.Controls.Add(this.m_textModelPane);
// 添加工具条
if (this.m_toolbarContainer == null)
{
// 创建工具条容器控件
this.m_toolbarContainer = new WtpToolbarContainer();
this.m_toolbarContainer.AddToolbar(new WtpStandardToolbar("_default"));
// 将工具条容器添加为子控件
this.AddParsedSubObject(this.m_toolbarContainer);
}
// 添加设计器
if (this.m_designerPane == null)
{
// 创建设计器控件
this.m_designerPane = new WtpDesignerPane();
// 将设计器添加为子控件
this.AddParsedSubObject(this.m_designerPane);
}
}
/// <summary>
/// 控件加载函数
/// </summary>
/// <param name="e">加载事件参数</param>
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (this.Page.IsPostBack)
{
// 设置回发文本值
this.XMLNText = this.m_postBackTextValue;
}
}
/// <summary>
/// 添加子标记
/// </summary>
/// <param name="obj"></param>
protected override void AddParsedSubObject(object obj)
{
if ((obj is LiteralControl) == true)
{
string text = null;
// 获取控件文本
text = ((LiteralControl)obj).Text;
text = text.Trim();
if (String.IsNullOrEmpty(text.Trim()) == true)
return;
}
else if (obj is WtpToolbarContainer)
{
// 获取工具条容器控件
this.m_toolbarContainer = (WtpToolbarContainer)obj;
this.Controls.Add(this.m_toolbarContainer);
return;
}
else if (obj is WtpDesignerPane)
{
// 获取设计器控件
this.m_designerPane = (WtpDesignerPane)obj;
this.Controls.Add(this.m_designerPane);
// 获取文本值
this.XMLNText = this.m_designerPane.InnerHtml;
return;
}
throw new Exception("无效的子控件类型 ( Invalid Type of Child Control )");
}
/// <summary>
/// 读取 ViewState 状态值
/// </summary>
/// <param name="savedState"></param>
protected override void LoadViewState(object savedState)
{
object[] myObj = (object[])savedState;
base.LoadViewState(myObj[0]);
// 获取存放于 ViewState 中的文本值
this.m_viewStateTextValue = (myObj[1] as string);
}
/// <summary>
/// 保存 ViewState 状态值
/// </summary>
/// <returns></returns>
protected override object SaveViewState()
{
object obj1 = base.SaveViewState();
object obj2 = this.XMLNText;
if (this.XMLNText == null)
obj2 = "";
return new object[] { obj1, obj2 };
}
/// <summary>
/// 在绘制该控件之前,为控件注册为需要回发处理
/// </summary>
/// <param name="e"></param>
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
// 为控件注册为需要回发处理
this.Page.RegisterRequiresPostBack(this);
// 注册客户端脚本
(new WtpClientScriptManager(this.Page)).Register();
// 如果样式为空,则使用默认样式
if (String.IsNullOrEmpty(this.CssClass))
this.CssClass = "WebTextPane";
// 设置设计器的内置 HTML 为用户指定的文本
this.m_designerPane.InnerHtml = this.XMLNText;
// 设置隐藏字段文本
this.m_textModelPane.InnerHtml = this.XMLNText;
}
/// <summary>
/// 绘制该服务器控件
/// </summary>
/// <param name="writer"></param>
protected override void Render(HtmlTextWriter writer)
{
base.Render(writer);
// 绘制客户端脚本
ClientRunTimeRender.Render(writer, this);
}
/// <summary>
/// 引发 OnTextChanged 事件
/// </summary>
/// <param name="args">事件参数</param>
protected virtual void OnTextChanged(EventArgs args)
{
EventHandler handler = Events[WebTextPane.Event_TextChanged] as EventHandler;
if (handler != null)
handler(this, EventArgs.Empty);
}
/// <summary>
/// 将正则表达式匹配字符串转为大写
/// </summary>
/// <param name="match">正则表达式匹配结果</param>
/// <returns>大写字符串</returns>
public static string CapText(Match match)
{
return match.ToString().ToUpper();
}
#region IPostBackDataHandler 成员
/// <summary>
/// 读取回发数据
/// </summary>
/// <param name="postDataKey">回发数据健</param>
/// <param name="postCollection">回发数据集合</param>
/// <returns></returns>
public bool LoadPostData(string postDataKey, NameValueCollection postCollection)
{
// 获取回发数据中的文本值
this.m_postBackTextValue = postCollection[this.m_textModelPane.UniqueID];
// 如果存放在 ViewState 中的文本值为空,则不触发 TextChanged 事件。
// 当该控件被嵌入到 web 用户控件(.ascx 控件)中时,ViewState 中的文本值有可能为空
if (this.m_viewStateTextValue == null)
return false;
// 替换标记中的字符串为大写
// 例如 <font size=2></font>,将替换成 <FONT SIZE=2></FONT>
this.m_viewStateTextValue = Regex.Replace(this.m_viewStateTextValue,
@"<[\/]{0,1}[^>]+>", new MatchEvaluator(CapText));
// 如果文本已修改,则触发数据修改事件
// RaisePostDataChangedEvent()
return (this.m_postBackTextValue != this.m_viewStateTextValue);
}
/// <summary>
/// 数据修改事件
/// </summary>
public void RaisePostDataChangedEvent()
{
this.OnTextChanged(EventArgs.Empty);
}
#endregion
#region IClientRunTime 成员
public string CreateJavaScriptObject()
{
return "new CWebTextPane();";
}
#endregion
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -