sl@0: //=============================================================================
sl@0: // COPYRIGHT: Prosoft-Lanz
sl@0: //=============================================================================
sl@0: //
sl@0: // $Workfile: DialogBox.cs $
sl@0: //
sl@0: // PROJECT : CodeProject Components
sl@0: // VERSION : 1.00
sl@0: // CREATION : 19.02.2003
sl@0: // AUTHOR : JCL
sl@0: //
sl@0: // DETAILS : DialogBoxes centered into the parent owner.
sl@0: //           This class implement the following objects:
sl@0: //
sl@0: //   DlgBox.ShowDialog(...)		for CommonDialog and Form
sl@0: //   MsgBox.Show(...)			for standard MessageBox
sl@0: //   AppBox.Show(...)			for standard MessageBox with ProductName as caption
sl@0: //	 ErrBox.Show(...)			for standard error MessageBox
sl@0: //
sl@0: //-----------------------------------------------------------------------------
sl@0: using System;
sl@0: using System.Drawing;
sl@0: using System.Windows.Forms;
sl@0: using System.Runtime.InteropServices;
sl@0: using System.Diagnostics;
sl@0: 
sl@0: using CodeProject.Win32API;
sl@0: using CodeProject.Win32API.Hook;
sl@0: 
sl@0: namespace CodeProject.Dialog
sl@0: {
sl@0: 	///////////////////////////////////////////////////////////////////////
sl@0: 	#region DlgBox
sl@0: 
sl@0: 	/// <summary>
sl@0: 	/// Class to display a CommonDialog or modal Form centered on the owner.
sl@0: 	/// </summary>
sl@0: 	/// <example>
sl@0: 	/// This example display the default print dialog box in the center of the parent.
sl@0: 	/// <code>
sl@0: 	/// PrintDialog printDlg = new PrintDialog();
sl@0: 	/// if (DlgBox.ShowDialog(printDlg, parent) == DialogResult.OK)
sl@0: 	///   printDocument.Print();
sl@0: 	/// </code>
sl@0: 	/// </example>
sl@0: 	public sealed class DlgBox
sl@0: 	{
sl@0: 		private DlgBox() {}	// To remove the constructor from the documentation!
sl@0: 
sl@0: 		///////////////////////////////////////////////////////////////////////
sl@0: 		// CommonDialog
sl@0: 
sl@0: 		/// <summary>
sl@0: 		/// Show a command dialog box at the center of the active window.
sl@0: 		/// </summary>
sl@0: 		public static DialogResult ShowDialog(CommonDialog dlg)
sl@0: 		{
sl@0: 			CenterWindow centerWindow = new CenterWindow(IntPtr.Zero);
sl@0: 			DialogResult dlgResult = dlg.ShowDialog();
sl@0: 			centerWindow.Dispose();
sl@0: 			return dlgResult;
sl@0: 		}
sl@0: 
sl@0: 		/// <summary>
sl@0: 		/// Show a command dialog box at the center of the owner window.
sl@0: 		/// </summary>
sl@0: 		public static DialogResult ShowDialog(CommonDialog dlg, IWin32Window owner)
sl@0: 		{
sl@0: 			IntPtr handle = (owner == null) ? IntPtr.Zero: owner.Handle;
sl@0: 			CenterWindow centerWindow = new CenterWindow(handle);
sl@0: 			DialogResult dlgResult = dlg.ShowDialog();
sl@0: 			centerWindow.Dispose();
sl@0: 			return dlgResult;
sl@0: 		}
sl@0: 
sl@0: 		///////////////////////////////////////////////////////////////////////
sl@0: 		// Form
sl@0: 
sl@0: 		/// <summary>
sl@0: 		/// Show a form dialog box at the center of the active window.
sl@0: 		/// </summary>
sl@0: 		public static DialogResult ShowDialog(Form form)
sl@0: 		{
sl@0: 			CenterWindow centerWindow = new CenterWindow(IntPtr.Zero);
sl@0: 			DialogResult dlgResult = form.ShowDialog();
sl@0: 			centerWindow.Dispose();
sl@0: 			return dlgResult;
sl@0: 		}
sl@0: 
sl@0: 		/// <summary>
sl@0: 		/// Show a form dialog box at the center of the owner window.
sl@0: 		/// </summary>
sl@0: 		public static DialogResult ShowDialog(Form form, IWin32Window owner)
sl@0: 		{
sl@0: 			IntPtr handle = (owner == null) ? IntPtr.Zero: owner.Handle;
sl@0: 			CenterWindow centerWindow = new CenterWindow(handle);
sl@0: 			DialogResult dlgResult = form.ShowDialog();
sl@0: 			centerWindow.Dispose();
sl@0: 			return dlgResult;
sl@0: 		}
sl@0: 	}
sl@0: 
sl@0: 	#endregion
sl@0: 
sl@0: 	///////////////////////////////////////////////////////////////////////
sl@0: 	#region MsgBox
sl@0: 
sl@0: 	/// <summary>
sl@0: 	/// Class to display a MessageBox centered on the owner.
sl@0: 	/// </summary>
sl@0: 	/// <remarks>
sl@0: 	/// Same methods as the standard MessageBox.
sl@0: 	/// </remarks>
sl@0: 	/// <example>
sl@0: 	/// This example display a "Hello" message box centered on the owner.
sl@0: 	/// <code>
sl@0: 	/// MsgBox.Show("Hello");
sl@0: 	/// </code>
sl@0: 	/// </example>
sl@0: 	public sealed class MsgBox
sl@0: 	{
sl@0: 		private MsgBox() {}	// To remove the constructor from the documentation!
sl@0: 
sl@0: 		///////////////////////////////////////////////////////////////////////
sl@0: 		// text
sl@0: 
sl@0: 		/// <summary>
sl@0: 		/// See MSDN MessageBox() method.
sl@0: 		/// </summary>
sl@0: 		public static DialogResult Show(string text)
sl@0: 		{
sl@0: 			CenterWindow centerWindow = new CenterWindow(IntPtr.Zero);
sl@0: 			string caption = Application.ProductName;
sl@0: 			DialogResult dlgResult = MessageBox.Show(text, caption);
sl@0: 			centerWindow.Dispose();
sl@0: 			return dlgResult;
sl@0: 		}
sl@0: 
sl@0: 		/// <summary>
sl@0: 		/// See MSDN MessageBox() method.
sl@0: 		/// </summary>
sl@0: 		public static DialogResult Show(IWin32Window owner, string text)
sl@0: 		{
sl@0: 			IntPtr handle = (owner == null) ? IntPtr.Zero: owner.Handle;
sl@0: 			CenterWindow centerWindow = new CenterWindow(handle);
sl@0: 			string caption = Application.ProductName;
sl@0: 			DialogResult dlgResult = MessageBox.Show(owner, text, caption);
sl@0: 			centerWindow.Dispose();
sl@0: 			return dlgResult;
sl@0: 		}
sl@0: 
sl@0: 		///////////////////////////////////////////////////////////////////////
sl@0: 		// text, caption
sl@0: 
sl@0: 		/// <summary>
sl@0: 		/// See MSDN MessageBox() method.
sl@0: 		/// </summary>
sl@0: 		public static DialogResult Show(string text, string caption)
sl@0: 		{
sl@0: 			CenterWindow centerWindow = new CenterWindow(IntPtr.Zero);
sl@0: 			DialogResult dlgResult = MessageBox.Show(text, caption);
sl@0: 			centerWindow.Dispose();
sl@0: 			return dlgResult;
sl@0: 		}
sl@0: 
sl@0: 		/// <summary>
sl@0: 		/// See MSDN MessageBox() method.
sl@0: 		/// </summary>
sl@0: 		public static DialogResult Show(IWin32Window owner, string text, string caption)
sl@0: 		{
sl@0: 			IntPtr handle = (owner == null) ? IntPtr.Zero: owner.Handle;
sl@0: 			CenterWindow centerWindow = new CenterWindow(handle);
sl@0: 			DialogResult dlgResult = MessageBox.Show(owner, text, caption);
sl@0: 			centerWindow.Dispose();
sl@0: 			return dlgResult;
sl@0: 		}
sl@0: 
sl@0: 		///////////////////////////////////////////////////////////////////////
sl@0: 		// text, caption, buttons
sl@0: 
sl@0: 		/// <summary>
sl@0: 		/// See MSDN MessageBox() method.
sl@0: 		/// </summary>
sl@0: 		public static DialogResult Show(string text, string caption, MessageBoxButtons buttons)
sl@0: 		{
sl@0: 			CenterWindow centerWindow = new CenterWindow(IntPtr.Zero);
sl@0: 			DialogResult dlgResult = MessageBox.Show(text, caption, buttons);
sl@0: 			centerWindow.Dispose();
sl@0: 			return dlgResult;
sl@0: 		}
sl@0: 
sl@0: 		/// <summary>
sl@0: 		/// See MSDN MessageBox() method.
sl@0: 		/// </summary>
sl@0: 		public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons)
sl@0: 		{
sl@0: 			IntPtr handle = (owner == null) ? IntPtr.Zero: owner.Handle;
sl@0: 			CenterWindow centerWindow = new CenterWindow(handle);
sl@0: 			DialogResult dlgResult = MessageBox.Show(owner, text, caption, buttons);
sl@0: 			centerWindow.Dispose();
sl@0: 			return dlgResult;
sl@0: 		}
sl@0: 
sl@0: 		///////////////////////////////////////////////////////////////////////
sl@0: 		// text, caption, buttons, defaultButton
sl@0: 
sl@0: 		/// <summary>
sl@0: 		/// See MSDN MessageBox() method.
sl@0: 		/// </summary>
sl@0: 		public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon)
sl@0: 		{
sl@0: 			CenterWindow centerWindow = new CenterWindow(IntPtr.Zero);
sl@0: 			DialogResult dlgResult = MessageBox.Show(text, caption, buttons, icon);
sl@0: 			centerWindow.Dispose();
sl@0: 			return dlgResult;
sl@0: 		}
sl@0: 
sl@0: 		/// <summary>
sl@0: 		/// See MSDN MessageBox() method.
sl@0: 		/// </summary>
sl@0: 		public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon)
sl@0: 		{
sl@0: 			IntPtr handle = (owner == null) ? IntPtr.Zero: owner.Handle;
sl@0: 			CenterWindow centerWindow = new CenterWindow(handle);
sl@0: 			DialogResult dlgResult = MessageBox.Show(owner, text, caption, buttons, icon);
sl@0: 			centerWindow.Dispose();
sl@0: 			return dlgResult;
sl@0: 		}
sl@0: 
sl@0: 		///////////////////////////////////////////////////////////////////////
sl@0: 		// text, caption, buttons, defaultButton, icon
sl@0: 
sl@0: 		/// <summary>
sl@0: 		/// See MSDN MessageBox() method.
sl@0: 		/// </summary>
sl@0: 		public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton)
sl@0: 		{
sl@0: 			CenterWindow centerWindow = new CenterWindow(IntPtr.Zero);
sl@0: 			DialogResult dlgResult = MessageBox.Show(text, caption, buttons, icon, defaultButton);
sl@0: 			centerWindow.Dispose();
sl@0: 			return dlgResult;
sl@0: 		}
sl@0: 
sl@0: 		/// <summary>
sl@0: 		/// See MSDN MessageBox() method.
sl@0: 		/// </summary>
sl@0: 		public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton)
sl@0: 		{
sl@0: 			IntPtr handle = (owner == null) ? IntPtr.Zero: owner.Handle;
sl@0: 			CenterWindow centerWindow = new CenterWindow(handle);
sl@0: 			DialogResult dlgResult = MessageBox.Show(owner, text, caption, buttons, icon, defaultButton);
sl@0: 			centerWindow.Dispose();
sl@0: 			return dlgResult;
sl@0: 		}
sl@0: 
sl@0: 		///////////////////////////////////////////////////////////////////////
sl@0: 		// text, caption, buttons, defaultButton, icon, options
sl@0: 
sl@0: 		/// <summary>
sl@0: 		/// See MSDN MessageBox() method.
sl@0: 		/// </summary>
sl@0: 		public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton, MessageBoxOptions options)
sl@0: 		{
sl@0: 			CenterWindow centerWindow = new CenterWindow(IntPtr.Zero);
sl@0: 			DialogResult dlgResult = MessageBox.Show(text, caption, buttons, icon, defaultButton, options);
sl@0: 			centerWindow.Dispose();
sl@0: 			return dlgResult;
sl@0: 		}
sl@0: 
sl@0: 		/// <summary>
sl@0: 		/// See MSDN MessageBox() method.
sl@0: 		/// </summary>
sl@0: 		public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton, MessageBoxOptions options)
sl@0: 		{
sl@0: 			IntPtr handle = (owner == null) ? IntPtr.Zero: owner.Handle;
sl@0: 			CenterWindow centerWindow = new CenterWindow(handle);
sl@0: 			DialogResult dlgResult = MessageBox.Show(owner, text, caption, buttons, icon, defaultButton, options);
sl@0: 			centerWindow.Dispose();
sl@0: 			return dlgResult;
sl@0: 		}
sl@0: 	}
sl@0: 
sl@0: 	#endregion
sl@0: 
sl@0: 	///////////////////////////////////////////////////////////////////////
sl@0: 	#region AppBox
sl@0: 
sl@0: 	/// <summary>
sl@0: 	/// Class to display a MessageBox centered on the owner.
sl@0: 	/// The MessageBox caption is always Application.ProductName.
sl@0: 	/// </summary>
sl@0: 	/// <remarks>
sl@0: 	/// Same methods as the standard MessageBox without caption.
sl@0: 	/// </remarks>
sl@0: 	/// <example>
sl@0: 	/// This example display an application message box centered on the owner.
sl@0: 	/// <code>
sl@0: 	/// AppBox.Show("Hello");
sl@0: 	/// </code>
sl@0: 	/// </example>
sl@0: 	public sealed class AppBox
sl@0: 	{
sl@0: 		private AppBox() {}	// To remove the constructor from the documentation!
sl@0: 
sl@0: 		///////////////////////////////////////////////////////////////////////
sl@0: 		// text
sl@0: 
sl@0: 		/// <summary>
sl@0: 		/// See MSDN MessageBox() method. Caption is Application.ProductName.
sl@0: 		/// </summary>
sl@0: 		public static DialogResult Show(string text)
sl@0: 		{
sl@0: 			CenterWindow centerWindow = new CenterWindow(IntPtr.Zero);
sl@0: 			string caption = Application.ProductName;
sl@0: 			DialogResult dlgResult = MessageBox.Show(text, caption);
sl@0: 			centerWindow.Dispose();
sl@0: 			return dlgResult;
sl@0: 		}
sl@0: 
sl@0: 		/// <summary>
sl@0: 		/// See MSDN MessageBox() method. Caption is Application.ProductName.
sl@0: 		/// </summary>
sl@0: 		public static DialogResult Show(IWin32Window owner, string text)
sl@0: 		{
sl@0: 			IntPtr handle = (owner == null) ? IntPtr.Zero: owner.Handle;
sl@0: 			CenterWindow centerWindow = new CenterWindow(handle);
sl@0: 			string caption = Application.ProductName;
sl@0: 			DialogResult dlgResult = MessageBox.Show(owner, text, caption);
sl@0: 			centerWindow.Dispose();
sl@0: 			return dlgResult;
sl@0: 		}
sl@0: 
sl@0: 		///////////////////////////////////////////////////////////////////////
sl@0: 		// text, buttons
sl@0: 
sl@0: 		/// <summary>
sl@0: 		/// See MSDN MessageBox() method. Caption is Application.ProductName.
sl@0: 		/// </summary>
sl@0: 		public static DialogResult Show(string text, MessageBoxButtons buttons)
sl@0: 		{
sl@0: 			CenterWindow centerWindow = new CenterWindow(IntPtr.Zero);
sl@0: 			string caption = Application.ProductName;
sl@0: 			DialogResult dlgResult = MessageBox.Show(text, caption, buttons);
sl@0: 			centerWindow.Dispose();
sl@0: 			return dlgResult;
sl@0: 		}
sl@0: 
sl@0: 		/// <summary>
sl@0: 		/// See MSDN MessageBox() method. Caption is Application.ProductName.
sl@0: 		/// </summary>
sl@0: 		public static DialogResult Show(IWin32Window owner, string text, MessageBoxButtons buttons)
sl@0: 		{
sl@0: 			IntPtr handle = (owner == null) ? IntPtr.Zero: owner.Handle;
sl@0: 			CenterWindow centerWindow = new CenterWindow(handle);
sl@0: 			string caption = Application.ProductName;
sl@0: 			DialogResult dlgResult = MessageBox.Show(owner, text, caption, buttons);
sl@0: 			centerWindow.Dispose();
sl@0: 			return dlgResult;
sl@0: 		}
sl@0: 
sl@0: 		///////////////////////////////////////////////////////////////////////
sl@0: 		// text, buttons, defaultButton
sl@0: 
sl@0: 		/// <summary>
sl@0: 		/// See MSDN MessageBox() method. Caption is Application.ProductName.
sl@0: 		/// </summary>
sl@0: 		public static DialogResult Show(string text, MessageBoxButtons buttons, MessageBoxIcon icon)
sl@0: 		{
sl@0: 			CenterWindow centerWindow = new CenterWindow(IntPtr.Zero);
sl@0: 			string caption = Application.ProductName;
sl@0: 			DialogResult dlgResult = MessageBox.Show(text, caption, buttons, icon);
sl@0: 			centerWindow.Dispose();
sl@0: 			return dlgResult;
sl@0: 		}
sl@0: 
sl@0: 		/// <summary>
sl@0: 		/// See MSDN MessageBox() method. Caption is Application.ProductName.
sl@0: 		/// </summary>
sl@0: 		public static DialogResult Show(IWin32Window owner, string text, MessageBoxButtons buttons, MessageBoxIcon icon)
sl@0: 		{
sl@0: 			IntPtr handle = (owner == null) ? IntPtr.Zero: owner.Handle;
sl@0: 			CenterWindow centerWindow = new CenterWindow(handle);
sl@0: 			string caption = Application.ProductName;
sl@0: 			DialogResult dlgResult = MessageBox.Show(owner, text, caption, buttons, icon);
sl@0: 			centerWindow.Dispose();
sl@0: 			return dlgResult;
sl@0: 		}
sl@0: 
sl@0: 		///////////////////////////////////////////////////////////////////////
sl@0: 		// text, buttons, defaultButton, icon
sl@0: 
sl@0: 		/// <summary>
sl@0: 		/// See MSDN MessageBox() method. Caption is Application.ProductName.
sl@0: 		/// </summary>
sl@0: 		public static DialogResult Show(string text, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton)
sl@0: 		{
sl@0: 			CenterWindow centerWindow = new CenterWindow(IntPtr.Zero);
sl@0: 			string caption = Application.ProductName;
sl@0: 			DialogResult dlgResult = MessageBox.Show(text, caption, buttons, icon, defaultButton);
sl@0: 			centerWindow.Dispose();
sl@0: 			return dlgResult;
sl@0: 		}
sl@0: 
sl@0: 		/// <summary>
sl@0: 		/// See MSDN MessageBox() method. Caption is Application.ProductName.
sl@0: 		/// </summary>
sl@0: 		public static DialogResult Show(IWin32Window owner, string text, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton)
sl@0: 		{
sl@0: 			IntPtr handle = (owner == null) ? IntPtr.Zero: owner.Handle;
sl@0: 			CenterWindow centerWindow = new CenterWindow(handle);
sl@0: 			string caption = Application.ProductName;
sl@0: 			DialogResult dlgResult = MessageBox.Show(owner, text, caption, buttons, icon, defaultButton);
sl@0: 			centerWindow.Dispose();
sl@0: 			return dlgResult;
sl@0: 		}
sl@0: 
sl@0: 		///////////////////////////////////////////////////////////////////////
sl@0: 		// text, buttons, defaultButton, icon, options
sl@0: 
sl@0: 		/// <summary>
sl@0: 		/// See MSDN MessageBox() method. Caption is Application.ProductName.
sl@0: 		/// </summary>
sl@0: 		public static DialogResult Show(string text, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton, MessageBoxOptions options)
sl@0: 		{
sl@0: 			CenterWindow centerWindow = new CenterWindow(IntPtr.Zero);
sl@0: 			string caption = Application.ProductName;
sl@0: 			DialogResult dlgResult = MessageBox.Show(text, caption, buttons, icon, defaultButton, options);
sl@0: 			centerWindow.Dispose();
sl@0: 			return dlgResult;
sl@0: 		}
sl@0: 
sl@0: 		/// <summary>
sl@0: 		/// See MSDN MessageBox() method. Caption is Application.ProductName.
sl@0: 		/// </summary>
sl@0: 		public static DialogResult Show(IWin32Window owner, string text, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton, MessageBoxOptions options)
sl@0: 		{
sl@0: 			IntPtr handle = (owner == null) ? IntPtr.Zero: owner.Handle;
sl@0: 			CenterWindow centerWindow = new CenterWindow(handle);
sl@0: 			string caption = Application.ProductName;
sl@0: 			DialogResult dlgResult = MessageBox.Show(owner, text, caption, buttons, icon, defaultButton, options);
sl@0: 			centerWindow.Dispose();
sl@0: 			return dlgResult;
sl@0: 		}
sl@0: 	}
sl@0: 
sl@0: 	#endregion
sl@0: 
sl@0: 	///////////////////////////////////////////////////////////////////////
sl@0: 	#region ErrBox
sl@0: 
sl@0: 	/// <summary>
sl@0: 	/// Class to display application error MessageBox centered on the owner.
sl@0: 	/// The caption of the MessageBox is Application.ProductName.
sl@0: 	/// </summary>
sl@0: 	/// <example>
sl@0: 	/// This example display an error message box centered on the owner.
sl@0: 	/// <code>
sl@0: 	/// ErrBox.Show(ex);
sl@0: 	/// </code>
sl@0: 	/// </example>
sl@0: 	public sealed class ErrBox
sl@0: 	{
sl@0: 		private ErrBox() {}	// To remove the constructor from the documentation!
sl@0: 
sl@0: 		/// <summary>
sl@0: 		/// Show an error MessageBox with an icon error and an OK button.
sl@0: 		/// </summary>
sl@0: 		/// <param name="err">The error message.</param>
sl@0: 		/// <param name="owner">The owner of the error MessageBox.</param>
sl@0: 		/// <returns>Dialog result of the MessageBox.</returns>
sl@0: 		public static DialogResult Show(IWin32Window owner, string err)
sl@0: 		{
sl@0: 			string caption = Application.ProductName;
sl@0: 			return MsgBox.Show(owner, err, caption, MessageBoxButtons.OK, MessageBoxIcon.Error);
sl@0: 		}
sl@0: 
sl@0: 		/// <summary>
sl@0: 		/// Show an error MessageBox with an icon error and an OK button.
sl@0: 		/// </summary>
sl@0: 		/// <param name="err">The error message.</param>
sl@0: 		/// <returns>Dialog result of the MessageBox.</returns>
sl@0: 		public static DialogResult Show(string err)
sl@0: 		{
sl@0: 			string caption = Application.ProductName;
sl@0: 			return MsgBox.Show(err, caption, MessageBoxButtons.OK, MessageBoxIcon.Error);
sl@0: 		}
sl@0: 
sl@0: 		/// <summary>
sl@0: 		/// Show an error MessageBox with exception message, an icon error and an OK button.
sl@0: 		/// </summary>
sl@0: 		/// <param name="ex">Exception to be displayed.</param>
sl@0: 		/// <returns>Dialog result of the MessageBox.</returns>
sl@0: 		public static DialogResult Show(Exception ex)
sl@0: 		{
sl@0: 			string err = ex.Message;
sl@0: 			while (ex.InnerException != null)
sl@0: 			{
sl@0: 				ex = ex.InnerException;
sl@0: 				err += Environment.NewLine;
sl@0: 				err += ex.Message;
sl@0: 			}
sl@0: 			string caption = Application.ProductName;
sl@0: 			return MsgBox.Show(err, caption, MessageBoxButtons.OK, MessageBoxIcon.Error);
sl@0: 		}
sl@0: 
sl@0: 		/// <summary>
sl@0: 		/// Show a specialized error MessageBox centered into the parent owner.
sl@0: 		/// </summary>
sl@0: 		/// <param name="ex">Exception to be displayed.</param>
sl@0: 		/// <param name="debugMode">true to display the full informations else false.</param>
sl@0: 		/// <returns>Dialog result of the MessageBox.</returns>
sl@0: 		public static DialogResult Show(Exception ex, bool debugMode)
sl@0: 		{
sl@0: 			if (debugMode)
sl@0: 				return Show(ex);
sl@0: 			else
sl@0: 				return Show(ex.Message);
sl@0: 		}
sl@0: 	}
sl@0: 
sl@0: 	#endregion
sl@0: 
sl@0: 	///////////////////////////////////////////////////////////////////////
sl@0: 	#region CenterWindow class
sl@0: 
sl@0: 	internal sealed class CenterWindow
sl@0: 	{
sl@0: 		public IntPtr hOwner = IntPtr.Zero;
sl@0: 		private Rectangle rect;
sl@0: 
sl@0: 		public CbtHook cbtHook = null;
sl@0: 		public WndProcRetHook wndProcRetHook = null;
sl@0: 
sl@0: 		public CenterWindow(IntPtr hOwner)
sl@0: 		{
sl@0: 			this.hOwner = hOwner;
sl@0: 			this.cbtHook = new CbtHook();
sl@0: 			cbtHook.WindowActivate += new CbtHook.CbtEventHandler(WndActivate);
sl@0: 			cbtHook.Install();
sl@0: 		}
sl@0: 
sl@0: 		public void Dispose()
sl@0: 		{
sl@0: 			if (wndProcRetHook != null)
sl@0: 			{
sl@0: 				wndProcRetHook.Uninstall();
sl@0: 				wndProcRetHook = null;
sl@0: 			}
sl@0: 			if (cbtHook != null)
sl@0: 			{
sl@0: 				cbtHook.Uninstall();
sl@0: 				cbtHook = null;
sl@0: 			}
sl@0: 		}
sl@0: 
sl@0: 		public void WndActivate(object sender, CbtEventArgs e)
sl@0: 		{
sl@0: 			IntPtr hMsgBox = e.wParam;
sl@0: 
sl@0: 			// try to find a howner for this message box
sl@0: 			if (hOwner == IntPtr.Zero)
sl@0: 				hOwner = USER32.GetActiveWindow();
sl@0: 
sl@0: 			// get the MessageBox window rect
sl@0: 			RECT rectDlg = new RECT();
sl@0: 			USER32.GetWindowRect(hMsgBox, ref rectDlg);
sl@0: 
sl@0: 			// get the owner window rect
sl@0: 			RECT rectForm = new RECT();
sl@0: 			USER32.GetWindowRect(hOwner, ref rectForm);
sl@0: 
sl@0: 			// get the biggest screen area
sl@0: 			Rectangle rectScreen = API.TrueScreenRect;
sl@0: 
sl@0: 			// if no parent window, center on the primary screen
sl@0: 			if (rectForm.right == rectForm.left)
sl@0: 				rectForm.right = rectForm.left = Screen.PrimaryScreen.WorkingArea.Width / 2;
sl@0: 			if (rectForm.bottom == rectForm.top)
sl@0: 				rectForm.bottom = rectForm.top = Screen.PrimaryScreen.WorkingArea.Height / 2;
sl@0: 
sl@0: 			// center on parent
sl@0: 			int dx = ((rectDlg.left + rectDlg.right) - (rectForm.left + rectForm.right)) / 2;
sl@0: 			int dy = ((rectDlg.top + rectDlg.bottom) - (rectForm.top + rectForm.bottom)) / 2;
sl@0: 
sl@0: 			rect = new Rectangle(
sl@0: 				rectDlg.left - dx,
sl@0: 				rectDlg.top - dy,
sl@0: 				rectDlg.right - rectDlg.left,
sl@0: 				rectDlg.bottom - rectDlg.top);
sl@0: 
sl@0: 			// place in the screen
sl@0: 			if (rect.Right > rectScreen.Right) rect.Offset(rectScreen.Right - rect.Right, 0);
sl@0: 			if (rect.Bottom > rectScreen.Bottom) rect.Offset(0, rectScreen.Bottom - rect.Bottom);
sl@0: 			if (rect.Left < rectScreen.Left) rect.Offset(rectScreen.Left - rect.Left, 0);
sl@0: 			if (rect.Top < rectScreen.Top) rect.Offset(0, rectScreen.Top - rect.Top);
sl@0: 
sl@0: 			if (e.IsDialog)
sl@0: 			{
sl@0: 				// do the job when the WM_INITDIALOG message returns
sl@0: 				wndProcRetHook = new WndProcRetHook(hMsgBox);
sl@0: 				wndProcRetHook.WndProcRet += new WndProcRetHook.WndProcEventHandler(WndProcRet);
sl@0: 				wndProcRetHook.Install();
sl@0: 			}
sl@0: 			else
sl@0: 				USER32.MoveWindow(hMsgBox, rect.Left, rect.Top, rect.Width, rect.Height, 1);
sl@0: 
sl@0: 			// uninstall this hook
sl@0: 			WindowsHook wndHook = (WindowsHook)sender;
sl@0: 			Debug.Assert(cbtHook == wndHook);
sl@0: 			cbtHook.Uninstall();
sl@0: 			cbtHook = null;
sl@0: 		}
sl@0: 
sl@0: 		public void WndProcRet(object sender, WndProcRetEventArgs e)
sl@0: 		{
sl@0: 			if (e.cw.message == WndMessage.WM_INITDIALOG ||
sl@0: 				e.cw.message == WndMessage.WM_UNKNOWINIT)
sl@0: 			{
sl@0: 				USER32.MoveWindow(e.cw.hwnd, rect.Left, rect.Top, rect.Width, rect.Height, 1);
sl@0: 				
sl@0: 				// uninstall this hook
sl@0: 				WindowsHook wndHook = (WindowsHook)sender;
sl@0: 				Debug.Assert(wndProcRetHook == wndHook);
sl@0: 				wndProcRetHook.Uninstall();
sl@0: 				wndProcRetHook = null;
sl@0: 			}
sl@0: 		}
sl@0: 	}
sl@0: 	#endregion
sl@0: }