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 = @"&nbsp;";
		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 + -
显示快捷键?