htmleditorcontrol.cs
来自「一个很好用的html编辑器。带源码」· CS 代码 · 共 1,178 行 · 第 1/5 页
CS
1,178 行
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
using System.Text.RegularExpressions;
using System.Web;
using System.IO;
using System.Net;
using System.Text;
using System.Globalization;
using System.Runtime.InteropServices;
using HtmlDocument = mshtml.HTMLDocument;
using HtmlBody = mshtml.HTMLBody;
using HtmlStyleSheet = mshtml.IHTMLStyleSheet;
using HtmlStyle = mshtml.IHTMLStyle;
using HtmlDomNode = mshtml.IHTMLDOMNode;
using HtmlDomTextNode = mshtml.IHTMLDOMTextNode;
using HtmlTextRange = mshtml.IHTMLTxtRange;
using HtmlSelection = mshtml.IHTMLSelectionObject;
using HtmlControlRange = mshtml.IHTMLControlRange;
using HtmlElement = mshtml.IHTMLElement;
using HtmlElementCollection = mshtml.IHTMLElementCollection;
using HtmlControlElement = mshtml.IHTMLControlElement;
using HtmlAnchorElement = mshtml.IHTMLAnchorElement;
using HtmlImageElement = mshtml.IHTMLImgElement;
using HtmlFontElement= mshtml.IHTMLFontElement;
using HtmlLineElement = mshtml.IHTMLHRElement;
using HtmlSpanElement = mshtml.IHTMLSpanFlow;
using HtmlScriptElement = mshtml.IHTMLScriptElement;
using HtmlTable = mshtml.IHTMLTable;
using HtmlTableCaption = mshtml.IHTMLTableCaption;
using HtmlTableRow = mshtml.IHTMLTableRow;
using HtmlTableCell = mshtml.IHTMLTableCell;
using HtmlTableRowMetrics = mshtml.IHTMLTableRowMetrics;
using HtmlTableColumn = mshtml.IHTMLTableCol;
using HtmlEventObject = mshtml.IHTMLEventObj;
using Microsoft.ConsultingServices.COM;
using Microsoft.ConsultingServices.COM.IOleCommandTarget;
namespace Microsoft.ConsultingServices.HtmlEditor
{
/// <summary>
/// This is the main UserControl class that defines the Html Editor
/// BodyHtml sets the complet Body including the body tag
/// InnerText and InnerHtml sets the contents of the Body
/// Property ReadOnly defines whether the content is editable
/// </summary>
[DefaultProperty("InnerText")]
public sealed class HtmlEditorControl : UserControl
{
#region Public Events
// public event that is raised if an internal processing exception is found
[Category("Exception"), Description("An Internal Processing Exception was encountered")]
public event HtmlExceptionEventHandler HtmlException;
// public event that is raised if navigation event is captured
[Category("Navigation"), Description("A Navigation Event was encountered")]
public event HtmlNavigationEventHandler HtmlNavigation;
#endregion
#region Constant Defintions
// general constants
private const int HTML_BUFFER_SIZE = 256;
// define the tags being used by the application
private const string BODY_TAG = "BODY";
private const string SCRIPT_TAG = "SCRIPT";
private const string ANCHOR_TAG = "A";
private const string FONT_TAG = "FONT";
private const string BOLD_TAG = "STRONG";
private const string UNDERLINE_TAG = "U";
private const string ITALIC_TAG = "EM";
private const string STRIKE_TAG = "STRIKE";
private const string SUBSCRIPT_TAG = "SUB";
private const string SUPERSCRIPT_TAG = "SUP";
private const string HEAD_TAG = "HEAD";
private const string IMAGE_TAG = "IMG";
private const string TABLE_TAG = "TABLE";
private const string TABLE_ROW_TAG = "TR";
private const string TABLE_CELL_TAG = "TD";
private const string TABLE_HEAD_TAG = "TH";
private const string SPAN_TAG = "SPAN";
private const string OPEN_TAG = "<";
private const string CLOSE_TAG = ">";
private const string SELECT_TYPE_TEXT = "text";
private const string SELECT_TYPE_CONTROL = "control";
private const string SELECT_TYPE_NONE = "none";
private const string FORMATTED_PRE = "Formatted";
private const string FORMATTED_NORMAL = "Normal";
private const string FORMATTED_HEADING = "Heading";
private const string EVENT_CONTEXT_MENU = "contextmenu";
// define commands for mshtml execution execution
private const string HTML_COMMAND_OVERWRITE = "OverWrite";
private const string HTML_COMMAND_BOLD = "Bold";
private const string HTML_COMMAND_UNDERLINE = "Underline";
private const string HTML_COMMAND_ITALIC = "Italic";
private const string HTML_COMMAND_SUBSCRIPT = "Subscript";
private const string HTML_COMMAND_SUPERSCRIPT = "Superscript";
private const string HTML_COMMAND_STRIKE_THROUGH = "StrikeThrough";
private const string HTML_COMMAND_FONT_NAME = "FontName";
private const string HTML_COMMAND_FONT_SIZE = "FontSize";
private const string HTML_COMMAND_FORE_COLOR = "ForeColor";
private const string HTML_COMMAND_INSERT_FORMAT_BLOCK = "FormatBlock";
private const string HTML_COMMAND_REMOVE_FORMAT = "RemoveFormat";
private const string HTML_COMMAND_JUSTIFY_LEFT = "JustifyLeft";
private const string HTML_COMMAND_JUSTIFY_CENTER = "JustifyCenter";
private const string HTML_COMMAND_JUSTIFY_RIGHT = "JustifyRight";
private const string HTML_COMMAND_INDENT = "Indent";
private const string HTML_COMMAND_OUTDENT = "Outdent";
private const string HTML_COMMAND_INSERT_LINE = "InsertHorizontalRule";
private const string HTML_COMMAND_INSERT_LIST = "Insert{0}List"; // replace with (Un)Ordered
private const string HTML_COMMAND_INSERT_IMAGE = "InsertImage";
private const string HTML_COMMAND_INSERT_LINK = "CreateLink";
private const string HTML_COMMAND_REMOVE_LINK = "Unlink";
private const string HTML_COMMAND_TEXT_CUT = "Cut";
private const string HTML_COMMAND_TEXT_COPY = "Copy";
private const string HTML_COMMAND_TEXT_PASTE = "Paste";
private const string HTML_COMMAND_TEXT_DELETE = "Delete";
private const string HTML_COMMAND_TEXT_UNDO = "Undo";
private const string HTML_COMMAND_TEXT_REDO= "Redo";
private const string HTML_COMMAND_TEXT_SELECT_ALL = "SelectAll";
private const string HTML_COMMAND_TEXT_UNSELECT = "Unselect";
private const string HTML_COMMAND_TEXT_PRINT = "Print";
// internal command constants
private const string INTERNAL_COMMAND_TEXTCUT = "TextCut";
private const string INTERNAL_COMMAND_TEXTCOPY = "TextCopy";
private const string INTERNAL_COMMAND_TEXTPASTE = "TextPaste";
private const string INTERNAL_COMMAND_TEXTDELETE = "TextDelete";
private const string INTERNAL_COMMAND_CLEARSELECT = "ClearSelect";
private const string INTERNAL_COMMAND_SELECTALL = "SelectAll";
private const string INTERNAL_COMMAND_EDITUNDO = "EditUndo";
private const string INTERNAL_COMMAND_EDITREDO = "EditRedo";
private const string INTERNAL_COMMAND_FORMATBOLD = "FormatBold";
private const string INTERNAL_COMMAND_FORMATUNDERLINE = "FormatUnderline";
private const string INTERNAL_COMMAND_FORMATITALIC = "FormatItalic";
private const string INTERNAL_COMMAND_FORMATSUPERSCRIPT = "FormatSuperscript";
private const string INTERNAL_COMMAND_FORMATSUBSCRIPT = "FormatSubscript";
private const string INTERNAL_COMMAND_FORMATSTRIKEOUT = "FormatStrikeout";
private const string INTERNAL_COMMAND_FONTDIALOG = "FontDialog";
private const string INTERNAL_COMMAND_FONTNORMAL = "FontNormal";
private const string INTERNAL_COMMAND_COLORDIALOG = "ColorDialog";
private const string INTERNAL_COMMAND_FONTINCREASE = "FontIncrease";
private const string INTERNAL_COMMAND_FONTDECREASE = "FontDecrease";
private const string INTERNAL_COMMAND_JUSTIFYLEFT = "JustifyLeft";
private const string INTERNAL_COMMAND_JUSTIFYCENTER = "JustifyCenter";
private const string INTERNAL_COMMAND_JUSTIFYRIGHT = "JustifyRight";
private const string INTERNAL_COMMAND_FONTINDENT = "FontIndent";
private const string INTERNAL_COMMAND_FONTOUTDENT = "FontOutdent";
private const string INTERNAL_COMMAND_LISTORDERED = "ListOrdered";
private const string INTERNAL_COMMAND_LISTUNORDERED = "ListUnordered";
private const string INTERNAL_COMMAND_INSERTLINE = "InsertLine";
private const string INTERNAL_COMMAND_INSERTTABLE = "InsertTable";
private const string INTERNAL_COMMAND_TABLEPROPERTIES = "TableModify";
private const string INTERNAL_COMMAND_TABLEINSERTROW = "TableInsertRow";
private const string INTERNAL_COMMAND_TABLEDELETEROW = "TableDeleteRow";
private const string INTERNAL_COMMAND_INSERTIMAGE = "InsertImage";
private const string INTERNAL_COMMAND_INSERTLINK = "InsertLink";
private const string INTERNAL_COMMAND_INSERTTEXT = "InsertText";
private const string INTERNAL_COMMAND_INSERTHTML = "InsertHtml";
private const string INTERNAL_COMMAND_FINDREPLACE = "FindReplace";
private const string INTERNAL_COMMAND_DOCUMENTPRINT = "DocumentPrint";
private const string INTERNAL_COMMAND_OPENFILE = "OpenFile";
private const string INTERNAL_COMMAND_SAVEFILE = "SaveFile";
private const string INTERNAL_TOGGLE_OVERWRITE = "ToggleOverwrite";
private const string INTERNAL_TOGGLE_TOOLBAR = "ToggleToolbar";
private const string INTERNAL_TOGGLE_SCROLLBAR = "ToggleScrollbar";
private const string INTERNAL_TOGGLE_WORDWRAP = "ToggleWordwrap";
// browser html constan expressions
private const string EMPTY_SPACE = @" ";
private const string BLANK_HTML_PAGE = "about:blank";
private const string TARGET_WINDOW_NEW = "_BLANK";
private const string TARGET_WINDOW_SAME = "_SELF";
// constants for displaying the HTML dialog
private const string HTML_TITLE_EDIT = "Edit Html";
private const string HTML_TITLE_VIEW = "View Html";
private const string PASTE_TITLE_HTML = "Enter Html";
private const string PASTE_TITLE_TEXT = "Enter Text";
private const string HTML_TITLE_OPENFILE = "Open Html File";
private const string HTML_TITLE_SAVEFILE = "Save Html File";
private const string HTML_FILTER = "Html files (*.html,*.htm)|*.html;*htm|All files (*.*)|*.*";
private const string HTML_EXTENSION = "html";
private const string CONTENT_EDITABLE_INHERIT = "inherit";
private const string DEFAULT_HTML_TEXT = "";
// constants for regular expression work
// BODY_INNER_TEXT_PARSE = @"(<)/*\w*/*(>)";
// HREF_TEST_EXPRESSION = @"(http|ftp|https):\/\/[\w]+(.[\w]+)([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?";
// BODY_PARSE_EXPRESSION = @"(?<preBody>.*)(?<bodyOpen><body.*?>)(?<innerBody>.*)(?<bodyClose></body>)(?<afterBody>.*)";
private const string HREF_TEST_EXPRESSION = @"mailto\:|(news|(ht|f)tp(s?))\:\/\/[\w]+(.[\w]+)([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?";
private const string BODY_PARSE_PRE_EXPRESSION = @"(<body).*?(</body)";
private const string BODY_PARSE_EXPRESSION = @"(?<bodyOpen>(<body).*?>)(?<innerBody>.*?)(?<bodyClose>(</body\s*>))";
private const string BODY_DEFAULT_TAG = @"<Body></Body>";
private const string BODY_TAG_PARSE_MATCH = @"${bodyOpen}${bodyClose}";
private const string BODY_INNER_PARSE_MATCH = @"${innerBody}";
private const string CONTENTTYPE_PARSE_EXPRESSION = @"^(?<mainType>\w+)(\/?)(?<subType>\w*)((\s*;\s*charset=)?)(?<charSet>.*)";
private const string CONTENTTYPE_PARSE_MAINTYPE = @"${mainType}";
private const string CONTENTTYPE_PARSE_SUBTYPE = @"${subType}";
private const string CONTENTTYPE_PARSE_CHARSET = @"${charSet}";
#endregion
# region Initialization and Dispose Code
// browser constants and commands
private object EMPTY_PARAMETER;
// acceptable formatting commands
// in case order to enable binary search
private readonly string[] formatCommands = new String[] {"Formatted", "Heading 1", "Heading 2", "Heading 3", "Heading 4", "Heading 5", "Normal"};
// document and body elements
private HtmlDocument document;
private HtmlBody body;
private HtmlStyleSheet stylesheet;
private HtmlScriptElement script;
private volatile bool loading = false;
private volatile bool codeNavigate = false;
private volatile bool rebaseUrlsNeeded = false;
// default values used to reset values
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?