📄 texteditorcontrolbase.cs
字号:
[DefaultValue(LineViewerStyle.None)]
[Description("The line viewer style")]
public LineViewerStyle LineViewerStyle {
get {
return document.TextEditorProperties.LineViewerStyle;
}
set {
document.TextEditorProperties.LineViewerStyle = value;
OptionsChanged();
}
}
/// <value>
/// The indent style
/// </value>
[Category("Behavior")]
[DefaultValue(IndentStyle.Smart)]
[Description("The indent style")]
public IndentStyle IndentStyle {
get {
return document.TextEditorProperties.IndentStyle;
}
set {
document.TextEditorProperties.IndentStyle = value;
OptionsChanged();
}
}
/// <value>
/// if true spaces are converted to tabs
/// </value>
[Category("Behavior")]
[DefaultValue(false)]
[Description("Converts tabs to spaces while typing")]
public bool ConvertTabsToSpaces {
get {
return document.TextEditorProperties.ConvertTabsToSpaces;
}
set {
document.TextEditorProperties.ConvertTabsToSpaces = value;
OptionsChanged();
}
}
/// <value>
/// if true spaces are converted to tabs
/// </value>
[Category("Behavior")]
[DefaultValue(false)]
[Description("Creates a backup copy for overwritten files")]
public bool CreateBackupCopy {
get {
return document.TextEditorProperties.CreateBackupCopy;
}
set {
document.TextEditorProperties.CreateBackupCopy = value;
OptionsChanged();
}
}
/// <value>
/// if true spaces are converted to tabs
/// </value>
[Category("Behavior")]
[DefaultValue(false)]
[Description("Hide the mouse cursor while typing")]
public bool HideMouseCursor {
get {
return document.TextEditorProperties.HideMouseCursor;
}
set {
document.TextEditorProperties.HideMouseCursor = value;
OptionsChanged();
}
}
/// <value>
/// if true spaces are converted to tabs
/// </value>
[Category("Behavior")]
[DefaultValue(false)]
[Description("Allows the caret to be places beyonde the end of line")]
public bool AllowCaretBeyondEOL {
get {
return document.TextEditorProperties.AllowCaretBeyondEOL;
}
set {
document.TextEditorProperties.AllowCaretBeyondEOL = value;
OptionsChanged();
}
}
/// <value>
/// if true spaces are converted to tabs
/// </value>
[Category("Behavior")]
[DefaultValue(BracketMatchingStyle.After)]
[Description("Specifies if the bracket matching should match the bracket before or after the caret.")]
public BracketMatchingStyle BracketMatchingStyle {
get {
return document.TextEditorProperties.BracketMatchingStyle;
}
set {
document.TextEditorProperties.BracketMatchingStyle = value;
OptionsChanged();
}
}
/// <value>
/// The base font of the text area. No bold or italic fonts
/// can be used because bold/italic is reserved for highlighting
/// purposes.
/// </value>
[Browsable(true)]
[Description("The base font of the text area. No bold or italic fonts can be used because bold/italic is reserved for highlighting purposes.")]
public override Font Font {
get {
return document.TextEditorProperties.Font;
}
set {
document.TextEditorProperties.Font = value;
OptionsChanged();
}
}
#endregion
public abstract TextAreaControl ActiveTextAreaControl {
get;
}
protected TextEditorControlBase()
{
GenerateDefaultActions();
HighlightingManager.Manager.ReloadSyntaxHighlighting += new EventHandler(ReloadHighlighting);
}
void ReloadHighlighting(object sender, EventArgs e)
{
if (Document.HighlightingStrategy != null) {
Document.HighlightingStrategy = HighlightingStrategyFactory.CreateHighlightingStrategy(Document.HighlightingStrategy.Name);
OptionsChanged();
}
}
internal IEditAction GetEditAction(Keys keyData)
{
return (IEditAction)editactions[keyData];
}
void GenerateDefaultActions()
{
editactions[Keys.Left] = new CaretLeft();
editactions[Keys.Left | Keys.Shift] = new ShiftCaretLeft();
editactions[Keys.Left | Keys.Control] = new WordLeft();
editactions[Keys.Left | Keys.Control | Keys.Shift] = new ShiftWordLeft();
editactions[Keys.Right] = new CaretRight();
editactions[Keys.Right | Keys.Shift] = new ShiftCaretRight();
editactions[Keys.Right | Keys.Control] = new WordRight();
editactions[Keys.Right | Keys.Control | Keys.Shift] = new ShiftWordRight();
editactions[Keys.Up] = new CaretUp();
editactions[Keys.Up | Keys.Shift] = new ShiftCaretUp();
editactions[Keys.Up | Keys.Control] = new ScrollLineUp();
editactions[Keys.Down] = new CaretDown();
editactions[Keys.Down | Keys.Shift] = new ShiftCaretDown();
editactions[Keys.Down | Keys.Control] = new ScrollLineDown();
editactions[Keys.Insert] = new ToggleEditMode();
editactions[Keys.Insert | Keys.Control] = new Copy();
editactions[Keys.Insert | Keys.Shift] = new Paste();
editactions[Keys.Delete] = new Delete();
editactions[Keys.Delete | Keys.Shift] = new Cut();
editactions[Keys.Home] = new Home();
editactions[Keys.Home | Keys.Shift] = new ShiftHome();
editactions[Keys.Home | Keys.Control] = new MoveToStart();
editactions[Keys.Home | Keys.Control | Keys.Shift] = new ShiftMoveToStart();
editactions[Keys.End] = new End();
editactions[Keys.End | Keys.Shift] = new ShiftEnd();
editactions[Keys.End | Keys.Control] = new MoveToEnd();
editactions[Keys.End | Keys.Control | Keys.Shift] = new ShiftMoveToEnd();
editactions[Keys.PageUp] = new MovePageUp();
editactions[Keys.PageUp | Keys.Shift] = new ShiftMovePageUp();
editactions[Keys.PageDown] = new MovePageDown();
editactions[Keys.PageDown | Keys.Shift] = new ShiftMovePageDown();
editactions[Keys.Return] = new Return();
editactions[Keys.Tab] = new Tab();
editactions[Keys.Tab | Keys.Shift] = new ShiftTab();
editactions[Keys.Back] = new Backspace();
editactions[Keys.Back | Keys.Shift] = new Backspace();
editactions[Keys.X | Keys.Control] = new Cut();
editactions[Keys.C | Keys.Control] = new Copy();
editactions[Keys.V | Keys.Control] = new Paste();
editactions[Keys.A | Keys.Control] = new SelectWholeDocument();
editactions[Keys.Escape] = new ClearAllSelections();
editactions[Keys.Divide | Keys.Control] = new ToggleComment();
editactions[Keys.OemQuestion | Keys.Control] = new ToggleComment();
editactions[Keys.Back | Keys.Alt] = new Actions.Undo();
editactions[Keys.Z | Keys.Control] = new Actions.Undo();
editactions[Keys.Y | Keys.Control] = new Redo();
editactions[Keys.Delete | Keys.Control] = new DeleteWord();
editactions[Keys.Back | Keys.Control] = new WordBackspace();
editactions[Keys.D | Keys.Control] = new DeleteLine();
editactions[Keys.D | Keys.Shift | Keys.Control] = new DeleteToLineEnd();
editactions[Keys.B | Keys.Control] = new GotoMatchingBrace();
}
/// <remarks>
/// Call this method before a long update operation this
/// 'locks' the text area so that no screen update occurs.
/// </remarks>
public virtual void BeginUpdate()
{
++updateLevel;
}
/// <remarks>
/// Call this method to 'unlock' the text area. After this call
/// screen update can occur. But no automatical refresh occurs you
/// have to commit the updates in the queue.
/// </remarks>
public virtual void EndUpdate()
{
Debug.Assert(updateLevel > 0);
updateLevel = Math.Max(0, updateLevel - 1);
}
public void LoadFile(string fileName)
{
LoadFile(fileName, true);
}
/// <remarks>
/// Loads a file given by fileName
/// </remarks>
public void LoadFile(string fileName, bool autoLoadHighlighting)
{
BeginUpdate();
document.TextContent = String.Empty;
document.UndoStack.ClearAll();
document.BookmarkManager.Clear();
if (autoLoadHighlighting) {
document.HighlightingStrategy = HighlightingStrategyFactory.CreateHighlightingStrategyForFile(fileName);
}
StreamReader stream;
if (Encoding != null) {
stream = new StreamReader(fileName, Encoding);
} else {
stream = new StreamReader(fileName);
}
Document.TextContent = stream.ReadToEnd();
stream.Close();
this.FileName = fileName;
OptionsChanged();
Document.UpdateQueue.Clear();
EndUpdate();
Refresh();
}
/// <remarks>
/// Saves a file given by fileName
/// </remarks>
public void SaveFile(string fileName)
{
if (document.TextEditorProperties.CreateBackupCopy) {
MakeBackupCopy(fileName);
}
StreamWriter stream;
if (Encoding != null && Encoding.CodePage != 65001) {
stream = new StreamWriter(fileName, false, Encoding);
} else {
stream = new StreamWriter(fileName, false);
}
foreach (LineSegment line in Document.LineSegmentCollection) {
stream.Write(Document.GetText(line.Offset, line.Length));
stream.Write(document.TextEditorProperties.LineTerminator);
}
stream.Close();
this.FileName = fileName;
}
void MakeBackupCopy(string fileName)
{
try {
if (File.Exists(fileName)) {
string backupName = fileName + ".bak";
if (File.Exists(backupName)) {
File.Delete(backupName);
}
File.Copy(fileName, backupName);
}
} catch (Exception) {
// IMessageService messageService =(IMessageService)ServiceManager.Services.GetService(typeof(IMessageService));
// messageService.ShowError(e, "Can not create backup copy of " + fileName);
}
}
public abstract void OptionsChanged();
// Localization ISSUES
// used in insight window
public virtual string GetRangeDescription(int selectedItem, int itemCount)
{
StringBuilder sb=new StringBuilder(selectedItem.ToString());
sb.Append(" from ");
sb.Append(itemCount.ToString());
return sb.ToString();
}
/// <remarks>
/// Overwritten refresh method that locks if the control is in
/// an update cycle.
/// </remarks>
public override void Refresh()
{
if (IsUpdating) {
return;
}
base.Refresh();
}
protected override void Dispose(bool disposing)
{
if (disposing) {
HighlightingManager.Manager.ReloadSyntaxHighlighting -= new EventHandler(ReloadHighlighting);
document.HighlightingStrategy = null;
document.UndoStack.TextEditorControl = null;
}
base.Dispose(disposing);
}
// public virtual IDeclarationViewWindow CreateDeclarationViewWindow(Form parent)
// {
// return new DeclarationViewWindow(parent);
// }
protected virtual void OnFileNameChanged(EventArgs e)
{
if (FileNameChanged != null) {
FileNameChanged(this, e);
}
}
protected virtual void OnChanged(EventArgs e)
{
if (Changed != null) {
Changed(this, e);
}
}
public event EventHandler FileNameChanged;
public event EventHandler Changed;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -