#develop (short for SharpDevelop) is a free IDE for .NET programming languages.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

322 lines
11 KiB

// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Mike Krüger" email="mike@icsharpcode.net"/>
// <version>$Revision$</version>
// </file>
// project created on 2/6/2003 at 11:10 AM
using System;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using ICSharpCode.Core;
using ICSharpCode.Core.WinForms;
namespace ICSharpCode.SharpDevelop.Sda
{
/// <summary>
/// Form used to display display unhandled errors in SharpDevelop.
/// </summary>
public class ExceptionBox : Form
{
private System.Windows.Forms.TextBox exceptionTextBox;
private System.Windows.Forms.CheckBox copyErrorCheckBox;
//private System.Windows.Forms.CheckBox includeSysInfoCheckBox;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label;
private System.Windows.Forms.Button continueButton;
private System.Windows.Forms.Button reportButton;
private System.Windows.Forms.PictureBox pictureBox;
Exception exceptionThrown;
string message;
internal static void RegisterExceptionBoxForUnhandledExceptions()
{
Application.ThreadException += ShowErrorBox;
AppDomain.CurrentDomain.UnhandledException += ShowErrorBox;
MessageService.CustomErrorReporter = ShowErrorBox;
}
static void ShowErrorBox(object sender, ThreadExceptionEventArgs e)
{
LoggingService.Error("ThreadException caught", e.Exception);
ShowErrorBox(e.Exception, null);
}
[SuppressMessage("Microsoft.Globalization", "CA1303:DoNotPassLiteralsAsLocalizedParameters")]
static void ShowErrorBox(object sender, UnhandledExceptionEventArgs e)
{
Exception ex = e.ExceptionObject as Exception;
LoggingService.Fatal("UnhandledException caught", ex);
if (e.IsTerminating)
LoggingService.Fatal("Runtime is terminating because of unhandled exception.");
ShowErrorBox(ex, "Unhandled exception", e.IsTerminating);
}
static void ShowErrorBox(Exception exception, string message)
{
ShowErrorBox(exception, message, false);
}
[SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")]
static void ShowErrorBox(Exception exception, string message, bool mustTerminate)
{
try {
using (ExceptionBox box = new ExceptionBox(exception, message, mustTerminate)) {
try {
box.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm);
} catch (InvalidOperationException) {
box.ShowDialog();
}
}
} catch (Exception ex) {
LoggingService.Warn("Error showing ExceptionBox", ex);
MessageBox.Show(exception.ToString(), message, MessageBoxButtons.OK,
MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly);
}
}
/// <summary>
/// Creates a new ExceptionBox instance.
/// </summary>
/// <param name="exception">The exception to display</param>
/// <param name="message">An additional message to display</param>
/// <param name="mustTerminate">If <paramref name="mustTerminate"/> is true, the
/// continue button is not available.</param>
[SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")]
public ExceptionBox(Exception exception, string message, bool mustTerminate)
{
this.exceptionThrown = exception;
this.message = message;
InitializeComponent();
if (mustTerminate) {
closeButton.Visible = false;
continueButton.Text = closeButton.Text;
continueButton.Left -= closeButton.Width - continueButton.Width;
continueButton.Width = closeButton.Width;
}
try {
Translate(this);
} catch {}
exceptionTextBox.Text = getClipboardString();
try {
this.pictureBox.Image = WinFormsResourceService.GetBitmap("ErrorReport");
} catch {}
}
void Translate(Control ctl)
{
ctl.Text = StringParser.Parse(ctl.Text);
foreach (Control child in ctl.Controls) {
Translate(child);
}
}
string getClipboardString()
{
StringBuilder sb = new StringBuilder();
sb.Append(Gui.AboutSharpDevelopTabPage.GetVersionInformationString());
sb.AppendLine();
if (message != null) {
sb.AppendLine(message);
}
sb.AppendLine("Exception thrown:");
sb.AppendLine(exceptionThrown.ToString());
sb.AppendLine();
sb.AppendLine("---- Recent log messages:");
try {
LogMessageRecorder.AppendRecentLogMessages(sb, log4net.LogManager.GetLogger(typeof(log4netLoggingService)));
} catch (Exception ex) {
sb.AppendLine("Failed to append recent log messages.");
sb.AppendLine(ex.ToString());
}
sb.AppendLine();
sb.AppendLine("---- Post-error application state information:");
try {
ApplicationStateInfoService.AppendFormatted(sb);
} catch (Exception ex) {
sb.AppendLine("Failed to append application state information.");
sb.AppendLine(ex.ToString());
}
return sb.ToString();
}
void CopyInfoToClipboard()
{
if (copyErrorCheckBox.Checked) {
string exceptionText = exceptionTextBox.Text;
if (Application.OleRequired() == ApartmentState.STA) {
ClipboardWrapper.SetText(exceptionText);
} else {
Thread th = new Thread((ThreadStart)delegate {
ClipboardWrapper.SetText(exceptionText);
});
th.Name = "CopyInfoToClipboard";
th.SetApartmentState(ApartmentState.STA);
th.Start();
}
}
}
void buttonClick(object sender, System.EventArgs e)
{
CopyInfoToClipboard();
StartUrl("http://www.icsharpcode.net/OpenSource/SD/BugReporting.aspx?version=" + RevisionClass.FullVersion);
}
[SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")]
static void StartUrl(string url)
{
try {
Process.Start(url);
} catch (Exception e) {
LoggingService.Warn("Cannot start " + url, e);
}
}
void continueButtonClick(object sender, System.EventArgs e)
{
DialogResult = System.Windows.Forms.DialogResult.Ignore;
Close();
}
void CloseButtonClick(object sender, EventArgs e)
{
if (MessageBox.Show(StringParser.Parse("${res:ICSharpCode.SharpDevelop.ExceptionBox.QuitWarning}"), MessageService.ProductName, MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2, MessageBoxOptions.DefaultDesktopOnly)
== DialogResult.Yes)
{
Application.Exit();
}
}
[SuppressMessage("Microsoft.Globalization", "CA1303")]
void InitializeComponent()
{
this.closeButton = new System.Windows.Forms.Button();
this.label3 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.label = new System.Windows.Forms.Label();
this.continueButton = new System.Windows.Forms.Button();
this.reportButton = new System.Windows.Forms.Button();
this.copyErrorCheckBox = new System.Windows.Forms.CheckBox();
this.exceptionTextBox = new System.Windows.Forms.TextBox();
this.pictureBox = new System.Windows.Forms.PictureBox();
((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit();
this.SuspendLayout();
//
// closeButton
//
this.closeButton.Location = new System.Drawing.Point(445, 424);
this.closeButton.Name = "closeButton";
this.closeButton.Size = new System.Drawing.Size(141, 23);
this.closeButton.TabIndex = 5;
this.closeButton.Text = "${res:ICSharpCode.SharpDevelop.ExceptionBox.ExitSharpDevelop}";
this.closeButton.Click += new System.EventHandler(this.CloseButtonClick);
//
// label3
//
this.label3.Location = new System.Drawing.Point(230, 159);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(448, 23);
this.label3.TabIndex = 9;
this.label3.Text = "${res:ICSharpCode.SharpDevelop.ExceptionBox.ThankYouMsg}";
//
// label2
//
this.label2.Location = new System.Drawing.Point(232, 64);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(448, 95);
this.label2.TabIndex = 8;
this.label2.Text = "${res:ICSharpCode.SharpDevelop.ExceptionBox.HelpText2}";
//
// label
//
this.label.Location = new System.Drawing.Point(232, 8);
this.label.Name = "label";
this.label.Size = new System.Drawing.Size(448, 48);
this.label.TabIndex = 6;
this.label.Text = "${res:ICSharpCode.SharpDevelop.ExceptionBox.HelpText1}";
//
// continueButton
//
this.continueButton.Location = new System.Drawing.Point(592, 424);
this.continueButton.Name = "continueButton";
this.continueButton.Size = new System.Drawing.Size(88, 23);
this.continueButton.TabIndex = 6;
this.continueButton.Text = "${res:ICSharpCode.SharpDevelop.ExceptionBox.Continue}";
this.continueButton.Click += new System.EventHandler(this.continueButtonClick);
//
// reportButton
//
this.reportButton.Location = new System.Drawing.Point(230, 424);
this.reportButton.Name = "reportButton";
this.reportButton.Size = new System.Drawing.Size(209, 23);
this.reportButton.TabIndex = 4;
this.reportButton.Text = "${res:ICSharpCode.SharpDevelop.ExceptionBox.ReportError}";
this.reportButton.Click += new System.EventHandler(this.buttonClick);
//
// copyErrorCheckBox
//
this.copyErrorCheckBox.Checked = true;
this.copyErrorCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.copyErrorCheckBox.Location = new System.Drawing.Point(230, 373);
this.copyErrorCheckBox.Name = "copyErrorCheckBox";
this.copyErrorCheckBox.Size = new System.Drawing.Size(440, 24);
this.copyErrorCheckBox.TabIndex = 2;
this.copyErrorCheckBox.Text = "${res:ICSharpCode.SharpDevelop.ExceptionBox.CopyToClipboard}";
//
// exceptionTextBox
//
this.exceptionTextBox.Location = new System.Drawing.Point(230, 183);
this.exceptionTextBox.Multiline = true;
this.exceptionTextBox.Name = "exceptionTextBox";
this.exceptionTextBox.ReadOnly = true;
this.exceptionTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
this.exceptionTextBox.Size = new System.Drawing.Size(448, 184);
this.exceptionTextBox.TabIndex = 1;
this.exceptionTextBox.Text = "textBoxExceptionText";
//
// pictureBox
//
this.pictureBox.Location = new System.Drawing.Point(0, 0);
this.pictureBox.Name = "pictureBox";
this.pictureBox.Size = new System.Drawing.Size(224, 464);
this.pictureBox.TabIndex = 0;
this.pictureBox.TabStop = false;
//
// ExceptionBox
//
this.ClientSize = new System.Drawing.Size(688, 453);
this.Controls.Add(this.closeButton);
this.Controls.Add(this.label3);
this.Controls.Add(this.label2);
this.Controls.Add(this.label);
this.Controls.Add(this.continueButton);
this.Controls.Add(this.reportButton);
this.Controls.Add(this.copyErrorCheckBox);
this.Controls.Add(this.exceptionTextBox);
this.Controls.Add(this.pictureBox);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "ExceptionBox";
this.Text = "${res:ICSharpCode.SharpDevelop.ExceptionBox.Title}";
((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
private System.Windows.Forms.Button closeButton;
}
}