⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 textareaclipboardhandler.cs

📁 c#源代码
💻 CS
字号:
// <file>
//     <copyright see="prj:///doc/copyright.txt"/>
//     <license see="prj:///doc/license.txt"/>
//     <owner name="Mike Krüger" email="mike@icsharpcode.net"/>
//     <version value="$version"/>
// </file>

using System;
using System.Collections;
using System.IO;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Printing;
using System.Diagnostics;
using System.Windows.Forms;
using System.Threading;
using System.Runtime.Remoting;
using System.Runtime.InteropServices;
using System.Xml;
using System.Text;

using ICSharpCode.TextEditor.Document;
using ICSharpCode.TextEditor.Undo;
using ICSharpCode.TextEditor.Util;

namespace ICSharpCode.TextEditor
{
	public class TextAreaClipboardHandler
	{
		TextArea textArea;
		
		public bool EnableCut {
			get {
				if (textArea != null && textArea.SelectionManager != null)
					return textArea.SelectionManager.HasSomethingSelected && textArea.EnableCutOrPaste;
				return false;
			}
		}
		
		public bool EnableCopy {
			get {
				if (textArea != null && textArea.SelectionManager != null)
					return textArea.SelectionManager.HasSomethingSelected;
				return false;
			}
		}
		
		public bool EnablePaste {
			get {
				// Clipboard.GetDataObject may throw an exception...
				try {
					if (textArea.EnableCutOrPaste == false)
						return false;
					IDataObject data = Clipboard.GetDataObject();
					return data != null && data.GetDataPresent(DataFormats.Text);
				} catch (Exception e) {
					Console.WriteLine("Got exception while enablepaste : " + e);
					return false;
				}
			}
		}
		
		public bool EnableDelete {
			get {
				if (textArea != null && textArea.SelectionManager != null)
					return textArea.SelectionManager.HasSomethingSelected && textArea.EnableCutOrPaste;
				return false;
			}
		}
		
		public bool EnableSelectAll {
			get {
				return true;
			}
		}
		
		public TextAreaClipboardHandler(TextArea textArea)
		{
			this.textArea = textArea;
			textArea.SelectionManager.SelectionChanged += new EventHandler(DocumentSelectionChanged);
		}

		void DocumentSelectionChanged(object sender, EventArgs e)
		{
		}
		
		bool CopyTextToClipboard()
		{
			string str = textArea.SelectionManager.SelectedText;
			
			if (str.Length > 0) {
				// paste to clipboard
				// BIG HACK: STRANGE EXTERNAL EXCEPTION BUG WORKAROUND
				for (int i = 0; i < 5; ++i) {
					try {
						DataObject dataObject = new DataObject();
						dataObject.SetData(DataFormats.UnicodeText, true, str);
						// Default has no highlighting, therefore we don't need RTF output
						if (textArea.Document.HighlightingStrategy.Name != "Default") {
							dataObject.SetData(DataFormats.Rtf, RtfWriter.GenerateRtf(textArea));
						}
						OnCopyText(new CopyTextEventArgs(str));
						Clipboard.SetDataObject(dataObject, true);
						return true;
					} catch (Exception e) {
						Console.WriteLine("Got exception while Copy text to clipboard : " + e);
					}
					Thread.Sleep(100);
				}
			}
			return false;
		}
		
		public void Cut(object sender, EventArgs e)
		{
			if (CopyTextToClipboard()) {
				// remove text
				textArea.BeginUpdate();
				textArea.Caret.Position = textArea.SelectionManager.SelectionCollection[0].StartPosition;
				textArea.SelectionManager.RemoveSelectedText();
				textArea.EndUpdate();
			}
		}
		
		public void Copy(object sender, EventArgs e)
		{
			CopyTextToClipboard();
		}
		
		public void Paste(object sender, EventArgs e)
		{
			// Clipboard.GetDataObject may throw an exception...
			try {
				IDataObject data = Clipboard.GetDataObject();
				if (data.GetDataPresent(DataFormats.UnicodeText)) {
					string text = (string)data.GetData(DataFormats.UnicodeText);
					if (text.Length > 0) {
						int redocounter = 0;
						if (textArea.SelectionManager.HasSomethingSelected) {
							Delete(sender, e);
							redocounter++;
						}
						textArea.InsertString(text);
						if (redocounter > 0) {
							textArea.Document.UndoStack.UndoLast(redocounter + 1); // redo the whole operation
						}					}
				}
			} catch (Exception ex) {
				Console.WriteLine("Got exception while Paste : " + ex);
			}
		}
		
		public void Delete(object sender, EventArgs e)
		{
			new ICSharpCode.TextEditor.Actions.Delete().Execute(textArea);
		}
		
		public void SelectAll(object sender, EventArgs e)
		{
			new ICSharpCode.TextEditor.Actions.SelectWholeDocument().Execute(textArea);
		}
		
		protected virtual void OnCopyText(CopyTextEventArgs e)
		{
			if (CopyText != null) {
				CopyText(this, e);
			}
		}
		
		public event CopyTextEventHandler CopyText;
	}
	
	public delegate void CopyTextEventHandler(object sender, CopyTextEventArgs e);
	public class CopyTextEventArgs : EventArgs
	{
		string text;
		
		public string Text {
			get {
				return text;
			}
		}
		
		public CopyTextEventArgs(string text)
		{
			this.text = text;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -