infopanel.cs

来自「SharpDevelop2.0.0 c#开发免费工具」· CS 代码 · 共 196 行

CS
196
字号
// <file>
//     <copyright see="prj:///doc/copyright.txt"/>
//     <license see="prj:///doc/license.txt"/>
//     <owner name="Mike Krüger" email="mike@icsharpcode.net"/>
//     <version>$Revision: 915 $</version>
// </file>

using System;
using System.Collections;
using System.Drawing;
using System.Reflection;
using System.Threading;
using System.Windows.Forms;
using ICSharpCode.SharpDevelop.Gui;
using NSvn.Common;
using NSvn.Core;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Gui.XmlForms;

namespace ICSharpCode.Svn
{
	/// <summary>
	/// Description of InfoPanel.
	/// </summary>
	public class InfoPanel : BaseSharpDevelopUserControl
	{
		IViewContent viewContent;
		ListView revisionList, changesList;
		
		public InfoPanel(IViewContent viewContent)
		{
			this.viewContent = viewContent;
			
			SetupFromXmlStream(GetType().Assembly.GetManifestResourceStream("ICSharpCode.Svn.Resources.InfoPanel.xfrm"));
			
			revisionList = Get<ListView>("revision");
			changesList  = Get<ListView>("changes");
			revisionList.SelectedIndexChanged += RevisionListViewSelectionChanged;
			ControlDictionary["commentRichTextBox"].Enabled = false;
			ControlDictionary["commentRichTextBox"].Font = ResourceService.CourierNew10;
			
			// Work around WinForms/XmlForms bug:
			ControlDictionary["splitter1"].Height = 3;
		}
		
		public void ShowError(Exception ex)
		{
			TextBox txt = new TextBox();
			txt.Multiline = true;
			txt.ReadOnly = true;
			txt.BackColor = SystemColors.Window;
			SvnClientException svn;
			txt.Text = "";
			while ((svn = ex as SvnClientException) != null) {
				txt.Text += svn.SvnError + Environment.NewLine;
				ex = svn.InnerException;
			}
			if (ex != null) {
				txt.Text += ex.ToString();
			}
			txt.Dock = DockStyle.Fill;
			revisionList.Controls.Add(txt);
		}
		
		int lastRevision = -1;
		
		public void AddLogMessage(LogMessage logMessage)
		{
			if (lastRevision < 0)
				lastRevision = logMessage.Revision;
			ListViewItem newItem = new ListViewItem(new string[] {
			                                        	logMessage.Revision.ToString(),
			                                        	logMessage.Author,
			                                        	logMessage.Date.ToString(),
			                                        	logMessage.Message
			                                        });
			newItem.Tag = logMessage;
			revisionList.Items.Add(newItem);
		}
		
		void RevisionListViewSelectionChanged(object sender, EventArgs e)
		{
			changesList.Items.Clear();
			if (revisionList.SelectedItems.Count == 0) {
				ControlDictionary["commentRichTextBox"].Text = "";
				ControlDictionary["commentRichTextBox"].Enabled = false;
				return;
			}
			ControlDictionary["commentRichTextBox"].Enabled = true;
			ListViewItem item = revisionList.SelectedItems[0];
			LogMessage logMessage = item.Tag as LogMessage;
			ControlDictionary["commentRichTextBox"].Text = logMessage.Message;
			ChangedPathDictionary changes = logMessage.ChangedPaths;
			if (changes == null) {
				changesList.Items.Add("Loading...");
				if (!isLoadingChangedPaths) {
					isLoadingChangedPaths = true;
					loadChangedPathsItem = item;
					ThreadPool.QueueUserWorkItem(LoadChangedPaths);
				}
			} else {
				int pathWidth = 70;
				int copyFromWidth = 70;
				using (Graphics g = CreateGraphics()) {
					foreach (DictionaryEntry entry in changes) {
						string path = (string)entry.Key;
						path = path.Replace('\\', '/');
						SizeF size = g.MeasureString(path, changesList.Font);
						if (size.Width + 4 > pathWidth)
							pathWidth = (int)size.Width + 4;
						ChangedPath change = (ChangedPath)entry.Value;
						string copyFrom = change.CopyFromPath;
						if (copyFrom == null) {
							copyFrom = string.Empty;
						} else {
							copyFrom = copyFrom + " : r" + change.CopyFromRevision;
							size = g.MeasureString(copyFrom, changesList.Font);
							if (size.Width + 4 > copyFromWidth)
								copyFromWidth = (int)size.Width + 4;
						}
						ListViewItem newItem = new ListViewItem(new string[] {
						                                        	SvnClient.GetActionString(change.Action),
						                                        	path,
						                                        	copyFrom
						                                        });
						changesList.Items.Add(newItem);
					}
				}
				changesList.Columns[1].Width = pathWidth;
				changesList.Columns[2].Width = copyFromWidth;
			}
		}
		
		ListViewItem loadChangedPathsItem;
		volatile bool isLoadingChangedPaths;
		
		void LoadChangedPaths(object state)
		{
			try {
				LogMessage logMessage = (LogMessage)loadChangedPathsItem.Tag;
				string fileName = System.IO.Path.GetFullPath(viewContent.FileName);
				Client client = SvnClient.Instance.Client;
				try {
					client.Log(new string[] { fileName },
					           Revision.FromNumber(logMessage.Revision), // Revision start
					           Revision.FromNumber(logMessage.Revision), // Revision end
					           true,                   // bool discoverChangePath
					           false,                  // bool strictNodeHistory
					           new LogMessageReceiver(ReceiveChangedPaths));
				} catch (SvnClientException ex) {
					if (ex.ErrorCode == 160013) {
						// This can happen when the file was renamed/moved so it cannot be found
						// directly in the old revision. In that case, we do a full download of
						// all revisions (so the file can be found in the new revision and svn can
						// follow back its history).
						client.Log(new string[] { fileName },
						           Revision.FromNumber(1),            // Revision start
						           Revision.FromNumber(lastRevision), // Revision end
						           true,                   // bool discoverChangePath
						           false,                  // bool strictNodeHistory
						           new LogMessageReceiver(ReceiveAllChangedPaths));
					} else {
						throw;
					}
				}
				loadChangedPathsItem = null;
				isLoadingChangedPaths = false;
				WorkbenchSingleton.SafeThreadAsyncCall(this, "RevisionListViewSelectionChanged", null, null);
			} catch (Exception ex) {
				MessageService.ShowError(ex);
			}
		}
		
		void ReceiveChangedPaths(LogMessage logMessage)
		{
			loadChangedPathsItem.Tag = logMessage;
		}
		
		void ReceiveAllChangedPaths(LogMessage logMessage)
		{
			WorkbenchSingleton.SafeThreadAsyncCall(this, "ReceiveAllChangedPathsInvoked", logMessage);
		}
		
		void ReceiveAllChangedPathsInvoked(LogMessage logMessage)
		{
			foreach (ListViewItem item in revisionList.Items) {
				LogMessage oldMessage = (LogMessage)item.Tag;
				if (oldMessage.Revision == logMessage.Revision) {
					item.Tag = logMessage;
					break;
				}
			}
		}
	}
}

⌨️ 快捷键说明

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