Code:
/ FX-1434 / FX-1434 / 1.0 / untmp / whidbey / REDBITS / ndp / fx / src / WinForms / Managed / System / WinForms / ThreadExceptionDialog.cs / 1 / ThreadExceptionDialog.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
/*
*/
namespace System.Windows.Forms {
using System.Threading;
using System.Runtime.Remoting;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System;
using System.Text;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Reflection;
using System.Security;
using System.Security.Permissions;
using System.Runtime.InteropServices;
using System.Globalization;
///
///
///
///
/// Implements a dialog box that is displayed when an unhandled exception occurs in
/// a thread.
///
///
[
ComVisible(true),
ClassInterface(ClassInterfaceType.AutoDispatch),
SecurityPermission(SecurityAction.InheritanceDemand, Flags = SecurityPermissionFlag.UnmanagedCode),
SecurityPermission(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.UnmanagedCode),
UIPermission(SecurityAction.Assert, Window=UIPermissionWindow.AllWindows)]
public class ThreadExceptionDialog : Form {
private const int MAXWIDTH = 440;
private const int MAXHEIGHT = 325;
// private const int IDI_ERROR = 32513;
private PictureBox pictureBox = new PictureBox();
private Label message = new Label();
private Button continueButton = new Button();
private Button quitButton = new Button();
private Button detailsButton = new Button();
private Button helpButton = new Button();
private TextBox details = new TextBox();
private Bitmap expandImage = null;
private Bitmap collapseImage = null;
private bool detailsVisible = false;
///
///
///
/// Initializes a new instance of the class.
///
///
///
public ThreadExceptionDialog(Exception t) {
string messageRes;
string messageText;
Button[] buttons;
bool detailAnchor = false;
WarningException w = t as WarningException;
if (w != null) {
messageRes = SR.ExDlgWarningText;
messageText = w.Message;
if (w.HelpUrl == null) {
buttons = new Button[] {continueButton};
}
else {
buttons = new Button[] {continueButton, helpButton};
}
}
else {
messageText = t.Message;
detailAnchor = true;
if (Application.AllowQuit) {
if (t is SecurityException) {
messageRes = "ExDlgSecurityErrorText";
}
else {
messageRes = "ExDlgErrorText";
}
buttons = new Button[] {detailsButton, continueButton, quitButton};
}
else {
if (t is SecurityException) {
messageRes = "ExDlgSecurityContinueErrorText";
}
else {
messageRes = "ExDlgContinueErrorText";
}
buttons = new Button[] {detailsButton, continueButton};
}
}
if (messageText.Length == 0) {
messageText = t.GetType().Name;
}
if (t is SecurityException) {
messageText = SR.GetString(messageRes, t.GetType().Name, Trim(messageText));
}
else {
messageText = SR.GetString(messageRes, Trim(messageText));
}
StringBuilder detailsTextBuilder = new StringBuilder();
string newline = "\r\n";
string separator = SR.GetString(SR.ExDlgMsgSeperator);
string sectionseparator = SR.GetString(SR.ExDlgMsgSectionSeperator);
if (Application.CustomThreadExceptionHandlerAttached) {
detailsTextBuilder.Append(SR.GetString(SR.ExDlgMsgHeaderNonSwitchable));
}
else {
detailsTextBuilder.Append(SR.GetString(SR.ExDlgMsgHeaderSwitchable));
}
detailsTextBuilder.Append(string.Format(CultureInfo.CurrentCulture, sectionseparator, SR.GetString(SR.ExDlgMsgExceptionSection)));
detailsTextBuilder.Append(t.ToString());
detailsTextBuilder.Append(newline);
detailsTextBuilder.Append(newline);
detailsTextBuilder.Append(string.Format(CultureInfo.CurrentCulture, sectionseparator, SR.GetString(SR.ExDlgMsgLoadedAssembliesSection)));
new FileIOPermission(PermissionState.Unrestricted).Assert();
try {
foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) {
AssemblyName name = asm.GetName();
string fileVer = SR.GetString(SR.NotAvailable);
try {
// bug 113573 -- if there's a path with an escaped value in it
// like c:\temp\foo%2fbar, the AssemblyName call will unescape it to
// c:\temp\foo\bar, which is wrong, and this will fail. It doesn't look like the
// assembly name class handles this properly -- even the "CodeBase" property is un-escaped
// so we can't circumvent this.
//
if (name.EscapedCodeBase != null && name.EscapedCodeBase.Length > 0) {
Uri codeBase = new Uri(name.EscapedCodeBase);
if (codeBase.Scheme == "file") {
fileVer = FileVersionInfo.GetVersionInfo(NativeMethods.GetLocalPath(name.EscapedCodeBase)).FileVersion;
}
}
}
catch(System.IO.FileNotFoundException){
}
detailsTextBuilder.Append(SR.GetString(SR.ExDlgMsgLoadedAssembliesEntry, name.Name, name.Version, fileVer, name.EscapedCodeBase));
detailsTextBuilder.Append(separator);
}
}
finally {
CodeAccessPermission.RevertAssert();
}
detailsTextBuilder.Append(string.Format(CultureInfo.CurrentCulture, sectionseparator, SR.GetString(SR.ExDlgMsgJITDebuggingSection)));
if (Application.CustomThreadExceptionHandlerAttached) {
detailsTextBuilder.Append(SR.GetString(SR.ExDlgMsgFooterNonSwitchable));
}
else {
detailsTextBuilder.Append(SR.GetString(SR.ExDlgMsgFooterSwitchable));
}
detailsTextBuilder.Append(newline);
detailsTextBuilder.Append(newline);
string detailsText = detailsTextBuilder.ToString();
Graphics g = message.CreateGraphicsInternal();
Size textSize = Size.Ceiling(g.MeasureString(messageText, Font, MAXWIDTH - 84));
textSize.Height += 4;
g.Dispose();
if (textSize.Width < 180) textSize.Width = 180;
if (textSize.Height > MAXHEIGHT) textSize.Height = MAXHEIGHT;
int width = textSize.Width + 84;
int buttonTop = Math.Max(textSize.Height, 40) + 26;
// SECREVIEW : We must get a hold of the parent to get at it's text
// : to make this dialog look like the parent.
//
IntSecurity.GetParent.Assert();
try {
Form activeForm = Form.ActiveForm;
if (activeForm == null || activeForm.Text.Length == 0) {
Text = SR.GetString(SR.ExDlgCaption);
}
else {
Text = SR.GetString(SR.ExDlgCaption2, activeForm.Text);
}
}
finally {
CodeAccessPermission.RevertAssert();
}
AcceptButton = continueButton;
CancelButton = continueButton;
FormBorderStyle = FormBorderStyle.FixedDialog;
MaximizeBox = false;
MinimizeBox = false;
StartPosition = FormStartPosition.CenterScreen;
Icon = null;
ClientSize = new Size(width, buttonTop + 31);
TopMost = true;
pictureBox.Location = new Point(0, 0);
pictureBox.Size = new Size(64, 64);
pictureBox.SizeMode = PictureBoxSizeMode.CenterImage;
if (t is SecurityException) {
pictureBox.Image = SystemIcons.Information.ToBitmap();
}
else {
pictureBox.Image = SystemIcons.Error.ToBitmap();
}
Controls.Add(pictureBox);
message.SetBounds(64,
8 + (40 - Math.Min(textSize.Height, 40)) / 2,
textSize.Width, textSize.Height);
message.Text = messageText;
Controls.Add(message);
continueButton.Text = SR.GetString(SR.ExDlgContinue);
continueButton.FlatStyle = FlatStyle.Standard;
continueButton.DialogResult = DialogResult.Cancel;
quitButton.Text = SR.GetString(SR.ExDlgQuit);
quitButton.FlatStyle = FlatStyle.Standard;
quitButton.DialogResult = DialogResult.Abort;
helpButton.Text = SR.GetString(SR.ExDlgHelp);
helpButton.FlatStyle = FlatStyle.Standard;
helpButton.DialogResult = DialogResult.Yes;
detailsButton.Text = SR.GetString(SR.ExDlgShowDetails);
detailsButton.FlatStyle = FlatStyle.Standard;
detailsButton.Click += new EventHandler(DetailsClick);
Button b = null;
int startIndex = 0;
if (detailAnchor) {
b = detailsButton;
expandImage = new Bitmap(this.GetType(), "down.bmp");
expandImage.MakeTransparent();
collapseImage = new Bitmap(this.GetType(), "up.bmp");
collapseImage.MakeTransparent();
b.SetBounds( 8, buttonTop, 100, 23 );
b.Image = expandImage;
b.ImageAlign = ContentAlignment.MiddleLeft;
Controls.Add(b);
startIndex = 1;
}
int buttonLeft = (width - 8 - ((buttons.Length - startIndex) * 105 - 5));
for (int i = startIndex; i < buttons.Length; i++) {
b = buttons[i];
b.SetBounds(buttonLeft, buttonTop, 100, 23);
Controls.Add(b);
buttonLeft += 105;
}
details.Text = detailsText;
details.ScrollBars = ScrollBars.Both;
details.Multiline = true;
details.ReadOnly = true;
details.WordWrap = false;
details.TabStop = false;
details.AcceptsReturn = false;
details.SetBounds(8, buttonTop + 31, width - 16,154);
Controls.Add(details);
}
///
///
///
/// Hide the property
///
///
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public override bool AutoSize
{
[SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")]
get
{
return base.AutoSize;
}
[SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")]
set
{
base.AutoSize = value;
}
}
///
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
new public event EventHandler AutoSizeChanged
{
add
{
base.AutoSizeChanged += value;
}
remove
{
base.AutoSizeChanged -= value;
}
}
///
///
/// Called when the details button is clicked.
///
private void DetailsClick(object sender, EventArgs eventargs) {
int delta = details.Height + 8;
if (detailsVisible) delta = -delta;
Height = Height + delta;
detailsVisible = !detailsVisible;
detailsButton.Image = detailsVisible ? collapseImage : expandImage;
}
private static string Trim(string s) {
if (s == null) return s;
int i = s.Length;
while (i > 0 && s[i - 1] == '.') i--;
return s.Substring(0, i);
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- FieldNameLookup.cs
- MouseButtonEventArgs.cs
- DynamicMethod.cs
- WrappedIUnknown.cs
- ListViewGroupItemCollection.cs
- KeyTime.cs
- ThousandthOfEmRealDoubles.cs
- TextRangeAdaptor.cs
- EasingKeyFrames.cs
- XslAst.cs
- SqlDuplicator.cs
- EntitySqlException.cs
- BulletedListEventArgs.cs
- ConsumerConnectionPointCollection.cs
- SolidBrush.cs
- SiteMapNodeItemEventArgs.cs
- WorkflowRuntimeServiceElementCollection.cs
- SplineKeyFrames.cs
- StreamGeometry.cs
- StrokeCollectionDefaultValueFactory.cs
- TimeoutHelper.cs
- ContentPropertyAttribute.cs
- MediaPlayer.cs
- log.cs
- _UncName.cs
- Suspend.cs
- LineVisual.cs
- CalculatedColumn.cs
- CompilationSection.cs
- EntityConnection.cs
- PersonalizationStateInfoCollection.cs
- TextServicesPropertyRanges.cs
- HtmlValidationSummaryAdapter.cs
- SafeTokenHandle.cs
- TableLayoutPanelCodeDomSerializer.cs
- CTreeGenerator.cs
- ParenthesizePropertyNameAttribute.cs
- ToolboxItemFilterAttribute.cs
- IsolatedStorageFile.cs
- WindowsToolbarAsMenu.cs
- UpDownBase.cs
- ParallelTimeline.cs
- ConcurrentBag.cs
- UnsafeNativeMethods.cs
- XhtmlConformanceSection.cs
- XhtmlTextWriter.cs
- DataServiceCollectionOfT.cs
- StandardMenuStripVerb.cs
- WebPartsPersonalization.cs
- BamlTreeNode.cs
- BinaryObjectReader.cs
- Ipv6Element.cs
- InheritanceContextHelper.cs
- PinnedBufferMemoryStream.cs
- OperationContractAttribute.cs
- PublisherIdentityPermission.cs
- Decimal.cs
- PtsContext.cs
- MdiWindowListStrip.cs
- RemoteWebConfigurationHost.cs
- ButtonChrome.cs
- XmlDataSourceNodeDescriptor.cs
- TextEditorSpelling.cs
- ConfigurationSectionHelper.cs
- SqlProviderUtilities.cs
- UDPClient.cs
- PropertyTabAttribute.cs
- HttpHeaderCollection.cs
- AVElementHelper.cs
- ApplicationSecurityManager.cs
- SettingsPropertyWrongTypeException.cs
- ProviderCommandInfoUtils.cs
- DesignerFrame.cs
- EncoderExceptionFallback.cs
- Thickness.cs
- GridViewUpdateEventArgs.cs
- Int32RectConverter.cs
- DataKey.cs
- PackageRelationshipCollection.cs
- DecimalStorage.cs
- XmlSchemaChoice.cs
- SystemResources.cs
- StringExpressionSet.cs
- XDRSchema.cs
- GraphicsPath.cs
- DispatcherProcessingDisabled.cs
- SQLBinaryStorage.cs
- HwndSourceParameters.cs
- Compiler.cs
- InkCanvasAutomationPeer.cs
- ConfigurationElementProperty.cs
- ResetableIterator.cs
- DisplayInformation.cs
- DoubleUtil.cs
- ToolStripContentPanel.cs
- AnnotationHighlightLayer.cs
- ClientSettingsSection.cs
- FontSizeConverter.cs
- SystemIcmpV4Statistics.cs
- OleDbPropertySetGuid.cs