📄 texteditordisplaybinding.cs
字号:
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Mike Krüger" email="mike@icsharpcode.net"/>
// <version>$Revision: 1117 $</version>
// </file>
using System;
using System.IO;
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Printing;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.TextEditor;
using ICSharpCode.TextEditor.Document;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Internal.Undo;
using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
{
public class TextEditorDisplayBinding : IDisplayBinding
{
// load #D-specific syntax highlighting files here
// don't know if this could be solved better by new codons,
// but this will do
static TextEditorDisplayBinding()
{
string modeDir = Path.Combine(PropertyService.ConfigDirectory, "modes");
if (!Directory.Exists(modeDir)) {
Directory.CreateDirectory(modeDir);
}
HighlightingManager.Manager.AddSyntaxModeFileProvider(new ICSharpCode.SharpDevelop.DefaultEditor.Codons.AddInTreeSyntaxModeProvider());
HighlightingManager.Manager.AddSyntaxModeFileProvider(new FileSyntaxModeProvider(modeDir));
HighlightingManager.Manager.AddSyntaxModeFileProvider(new FileSyntaxModeProvider(Path.Combine(PropertyService.DataDirectory, "modes")));
}
public virtual bool CanCreateContentForFile(string fileName)
{
return true;
}
public virtual bool CanCreateContentForLanguage(string language)
{
return true;
}
public virtual IViewContent CreateContentForFile(string fileName)
{
TextEditorDisplayBindingWrapper b2 = new TextEditorDisplayBindingWrapper();
b2.textAreaControl.Dock = DockStyle.Fill;
b2.Load(fileName);
b2.textAreaControl.Document.HighlightingStrategy = HighlightingStrategyFactory.CreateHighlightingStrategyForFile(fileName);
b2.textAreaControl.InitializeFormatter();
b2.ForceFoldingUpdate();
b2.textAreaControl.ActivateQuickClassBrowserOnDemand();
return b2;
}
public virtual IViewContent CreateContentForLanguage(string language, string content)
{
TextEditorDisplayBindingWrapper b2 = new TextEditorDisplayBindingWrapper();
b2.textAreaControl.Document.TextContent = StringParser.Parse(content);
b2.textAreaControl.Document.HighlightingStrategy = HighlightingStrategyFactory.CreateHighlightingStrategy(language);
b2.textAreaControl.InitializeFormatter();
b2.textAreaControl.ActivateQuickClassBrowserOnDemand();
return b2;
}
}
public class TextEditorDisplayBindingWrapper : AbstractViewContent, IMementoCapable, IPrintable, IEditable, IUndoHandler, IPositionable, ITextEditorControlProvider, IParseInformationListener, IClipboardHandler, IContextHelpProvider
{
public SharpDevelopTextAreaControl textAreaControl = null;
public TextEditorControl TextEditorControl {
get {
return textAreaControl;
}
}
// KSL Start, New lines
protected FileSystemWatcher watcher;
protected bool wasChangedExternally = false;
// KSL End
public bool EnableUndo {
get {
return textAreaControl.EnableUndo;
}
}
public bool EnableRedo {
get {
return textAreaControl.EnableRedo;
}
}
// ParserUpdateThread uses the text property via IEditable, I had an exception
// because multiple threads were accessing the GapBufferStrategy at the same time.
string GetText()
{
return textAreaControl.Document.TextContent;
}
void SetText(string value)
{
textAreaControl.Document.TextContent = value;
}
public string Text {
get {
if (WorkbenchSingleton.InvokeRequired)
return (string)WorkbenchSingleton.SafeThreadCall(this, "GetText", null);
else
return GetText();
}
set {
if (WorkbenchSingleton.InvokeRequired)
WorkbenchSingleton.SafeThreadCall(this, "SetText", value);
else
SetText(value);
}
}
public PrintDocument PrintDocument {
get {
return textAreaControl.PrintDocument;
}
}
public override Control Control {
get {
return textAreaControl;
}
}
public override string TabPageText {
get {
return "${res:FormsDesigner.DesignTabPages.SourceTabPage}";
}
}
public override string UntitledName {
get {
return base.UntitledName;
}
set {
base.UntitledName = value;
textAreaControl.FileName = value;
ForceFoldingUpdate();
}
}
protected override void OnFileNameChanged(System.EventArgs e)
{
base.OnFileNameChanged(e);
textAreaControl.FileName = base.FileName;
}
public void Undo()
{
this.textAreaControl.Undo();
}
public void Redo()
{
this.textAreaControl.Redo();
}
protected virtual SharpDevelopTextAreaControl CreateSharpDevelopTextAreaControl()
{
return new SharpDevelopTextAreaControl();
}
public TextEditorDisplayBindingWrapper()
{
textAreaControl = CreateSharpDevelopTextAreaControl();
textAreaControl.RightToLeft = RightToLeft.No;
textAreaControl.Document.DocumentChanged += new DocumentEventHandler(TextAreaChangedEvent);
textAreaControl.ActiveTextAreaControl.Caret.CaretModeChanged += new EventHandler(CaretModeChanged);
textAreaControl.ActiveTextAreaControl.Enter += new EventHandler(CaretUpdate);
// KSL Start, New lines
// textAreaControl.FileNameChanged += new EventHandler(FileNameChangedEvent);
((Form)ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.Workbench).Activated += new EventHandler(GotFocusEvent);
// KSL End
}
// KSL Start, new event handlers
public void ShowHelp()
{
// Resolve expression at cursor and show help
TextArea textArea = textAreaControl.ActiveTextAreaControl.TextArea;
IDocument doc = textArea.Document;
IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(textArea.MotherTextEditorControl.FileName);
if (expressionFinder == null)
return;
LineSegment seg = doc.GetLineSegment(textArea.Caret.Line);
string textContent = doc.TextContent;
ExpressionResult expressionResult = expressionFinder.FindFullExpression(textContent, seg.Offset + textArea.Caret.Column);
string expression = expressionResult.Expression;
if (expression != null && expression.Length > 0) {
ResolveResult result = ParserService.Resolve(expressionResult, textArea.Caret.Line + 1, textArea.Caret.Column + 1, textAreaControl.FileName, textContent);
TypeResolveResult trr = result as TypeResolveResult;
if (trr != null) {
ICSharpCode.SharpDevelop.Dom.HelpProvider.ShowHelp(trr.ResolvedClass);
}
MemberResolveResult mrr = result as MemberResolveResult;
if (mrr != null) {
ICSharpCode.SharpDevelop.Dom.HelpProvider.ShowHelp(mrr.ResolvedMember);
}
}
}
protected void SetWatcher()
{
try {
if (this.watcher == null) {
this.watcher = new FileSystemWatcher();
this.watcher.Changed += new FileSystemEventHandler(this.OnFileChangedEvent);
} else {
this.watcher.EnableRaisingEvents = false;
}
this.watcher.Path = Path.GetDirectoryName(textAreaControl.FileName);
this.watcher.Filter = Path.GetFileName(textAreaControl.FileName);
this.watcher.NotifyFilter = NotifyFilters.LastWrite;
this.watcher.EnableRaisingEvents = true;
} catch (Exception) {
if (watcher != null) {
watcher.Dispose();
}
watcher = null;
}
}
protected virtual void GotFocusEvent(object sender, EventArgs e)
{
if (wasChangedExternally) {
wasChangedExternally = false;
string message = StringParser.Parse("${res:ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor.TextEditorDisplayBinding.FileAlteredMessage}", new string[,] {{"File", Path.GetFullPath(textAreaControl.FileName)}});
if (MessageBox.Show(message,
StringParser.Parse("${res:MainWindow.DialogName}"),
MessageBoxButtons.YesNo,
MessageBoxIcon.Question) == DialogResult.Yes) {
Load(textAreaControl.FileName);
} else {
IsDirty = true;
}
}
}
void OnFileChangedEvent(object sender, FileSystemEventArgs e)
{
if(e.ChangeType != WatcherChangeTypes.Deleted) {
wasChangedExternally = true;
if (textAreaControl.IsHandleCreated)
textAreaControl.BeginInvoke(new MethodInvoker(OnFileChangedEventInvoked));
}
}
void OnFileChangedEventInvoked()
{
if (((Form)ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.Workbench).Focused) {
GotFocusEvent(this, EventArgs.Empty);
}
}
// KSL End
void TextAreaChangedEvent(object sender, DocumentEventArgs e)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -