1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 // Copyright (c) 2004-2006 Novell, Inc.
23 // Jordi Mas i Hernandez (jordi@ximian.com)
24 // Benjamin Dasnois (benjamin.dasnois@gmail.com)
25 // Robert Thompson (rmt@corporatism.org)
26 // Peter Bartok (pbartok@novell.com)
29 // - Add support for MessageBoxOptions and MessageBoxDefaultButton.
37 using System.Globalization;
38 using System.Resources;
40 namespace System.Windows.Forms
42 public class MessageBox
44 #region Private MessageBoxForm class
45 private class MessageBoxForm : Form
47 #region MessageBoxFrom Local Variables
48 const int space_border = 10;
49 const int button_width = 86;
50 const int button_height = 23;
51 const int button_space = 5;
52 const int space_image_text= 10;
55 bool size_known = false;
58 MessageBoxButtons msgbox_buttons;
59 MessageBoxDefaultButton msgbox_default;
60 bool buttons_placed = false;
62 Button[] buttons = new Button[4];
64 string help_file_path;
66 HelpNavigator help_navigator;
68 #endregion // MessageBoxFrom Local Variables
70 #region MessageBoxForm Constructors
71 public MessageBoxForm (IWin32Window owner, string text, string caption,
72 MessageBoxButtons buttons, MessageBoxIcon icon,
73 bool displayHelpButton)
75 show_help = displayHelpButton;
78 case MessageBoxIcon.None: {
83 case MessageBoxIcon.Error: { // Same as MessageBoxIcon.Hand and MessageBoxIcon.Stop
84 icon_image = ThemeEngine.Current.Images(UIIcon.MessageBoxError);
88 case MessageBoxIcon.Question: {
89 icon_image = ThemeEngine.Current.Images(UIIcon.MessageBoxQuestion);
93 case MessageBoxIcon.Asterisk: { // Same as MessageBoxIcon.Information
94 icon_image = ThemeEngine.Current.Images(UIIcon.MessageBoxInfo);
98 case MessageBoxIcon.Warning: { // Same as MessageBoxIcon.Exclamation:
99 icon_image = ThemeEngine.Current.Images(UIIcon.MessageBoxWarning);
105 msgbox_buttons = buttons;
106 msgbox_default = MessageBoxDefaultButton.Button1;
109 Owner = Control.FromHandle(owner.Handle).FindForm();
111 if (Application.MWFThread.Current.Context != null) {
112 Owner = Application.MWFThread.Current.Context.MainForm;
116 this.ControlBox = true;
117 this.MinimizeBox = false;
118 this.MaximizeBox = false;
119 this.ShowInTaskbar = (Owner == null);
120 this.FormBorderStyle = FormBorderStyle.FixedDialog;
123 public MessageBoxForm (IWin32Window owner, string text, string caption,
124 MessageBoxButtons buttons, MessageBoxIcon icon,
125 MessageBoxDefaultButton defaultButton, MessageBoxOptions options, bool displayHelpButton)
126 : this (owner, text, caption, buttons, icon, displayHelpButton)
128 msgbox_default = defaultButton;
131 public MessageBoxForm (IWin32Window owner, string text, string caption,
132 MessageBoxButtons buttons, MessageBoxIcon icon)
133 : this (owner, text, caption, buttons, icon, false)
136 #endregion // MessageBoxForm Constructors
138 #region Protected Instance Properties
139 protected override CreateParams CreateParams {
141 CreateParams cp = base.CreateParams;;
143 cp.Style |= (int)(WindowStyles.WS_DLGFRAME | WindowStyles.WS_CLIPCHILDREN | WindowStyles.WS_CLIPSIBLINGS | WindowStyles.WS_CAPTION);
146 cp.Style |= (int)(WindowStyles.WS_DISABLED);
151 #endregion // Protected Instance Properties
153 #region MessageBoxForm Methods
154 public void SetHelpData (string file_path, string keyword, HelpNavigator navigator, object param)
156 help_file_path = file_path;
157 help_keyword = keyword;
158 help_navigator = navigator;
162 internal string HelpFilePath {
163 get { return help_file_path; }
166 internal string HelpKeyword {
167 get { return help_keyword; }
170 internal HelpNavigator HelpNavigator {
171 get { return help_navigator; }
174 internal object HelpParam {
175 get { return help_param; }
178 public DialogResult RunDialog ()
180 this.StartPosition = FormStartPosition.CenterScreen;
182 if (size_known == false) {
188 return this.DialogResult;
191 internal override void OnPaintInternal (PaintEventArgs e)
193 e.Graphics.DrawString (msgbox_text, this.Font, ThemeEngine.Current.ResPool.GetSolidBrush (Color.Black), textleft_up);
194 if (icon_image != null) {
195 e.Graphics.DrawImage(icon_image, new Point(space_border, space_border));
199 private void InitFormsSize ()
203 // First we have to know the size of text + image
204 Drawing.SizeF tsize = TextRenderer.MeasureString (msgbox_text, this.Font);
206 if (icon_image != null) {
207 tsize.Width += icon_image.Width + 10;
208 if(icon_image.Height > tsize.Height) {
209 // Place text middle-right
210 textleft_up = new Point (icon_image.Width + space_image_text + space_border, (int)((icon_image.Height/2)-(tsize.Height/2)) + space_border);
212 textleft_up = new Point (icon_image.Width + space_image_text + space_border, 2 + space_border);
214 if (tsize.Height < icon_image.Height)
215 tsize.Height = icon_image.Height;
217 tsize.Width += space_border * 2;
218 textleft_up = new Point (space_border + button_space, space_border);
220 tsize.Height += space_border * 2;
222 // Now we want to know the amount of buttons
224 switch (msgbox_buttons) {
225 case MessageBoxButtons.OK:
229 case MessageBoxButtons.OKCancel:
233 case MessageBoxButtons.AbortRetryIgnore:
237 case MessageBoxButtons.YesNoCancel:
241 case MessageBoxButtons.YesNo:
245 case MessageBoxButtons.RetryCancel:
257 // Calculate the width based on amount of buttons
258 tb_width = (button_width + button_space) * buttoncount;
260 // Now we choose the good size for the form
261 if (tsize.ToSize ().Width > tb_width)
262 this.ClientSize = new Size(tsize.ToSize().Width + (space_border * 2), Height = tsize.ToSize ().Height + (space_border * 4));
264 this.ClientSize = new Size(tb_width + (space_border * 2), Height = tsize.ToSize ().Height + (space_border * 4));
266 // Now we set the left of the buttons
267 button_left = (this.ClientSize.Width / 2) - (tb_width / 2) + 5;
271 // Still needs to implement defaultButton and options
272 switch(msgbox_default) {
273 case MessageBoxDefaultButton.Button1: {
274 AcceptButton = this.buttons[0];
278 case MessageBoxDefaultButton.Button2: {
279 if (this.buttons[1] != null) {
280 AcceptButton = this.buttons[1];
285 case MessageBoxDefaultButton.Button3: {
286 if (this.buttons[2] != null) {
287 AcceptButton = this.buttons[2];
294 protected override bool ProcessDialogKey(Keys keyData) {
295 if (keyData == Keys.Escape) {
296 this.CancelClick(this, null);
300 if (((keyData & Keys.Modifiers) == Keys.Control) &&
301 (((keyData & Keys.KeyCode) == Keys.C) ||
302 ((keyData & Keys.KeyCode) == Keys.Insert))) {
306 return base.ProcessDialogKey (keyData);
311 string separator = "---------------------------" + Environment.NewLine;
313 System.Text.StringBuilder contents = new System.Text.StringBuilder ();
315 contents.Append (separator);
316 contents.Append (this.Text).Append (Environment.NewLine);
317 contents.Append (separator);
318 contents.Append (msgbox_text).Append (Environment.NewLine);
319 contents.Append (separator);
321 foreach (Button btn in buttons) {
324 contents.Append (btn.Text).Append (" ");;
327 contents.Append (Environment.NewLine);
328 contents.Append (separator);
330 DataObject obj = new DataObject(DataFormats.Text, contents.ToString());
331 Clipboard.SetDataObject (obj);
334 #endregion // MessageBoxForm Methods
336 #region Functions for Adding buttons
337 private void AddButtons()
339 if (!buttons_placed) {
340 switch (msgbox_buttons) {
341 case MessageBoxButtons.OK: {
342 buttons[0] = AddOkButton (0);
346 case MessageBoxButtons.OKCancel: {
347 buttons[0] = AddOkButton (0);
348 buttons[1] = AddCancelButton (1);
352 case MessageBoxButtons.AbortRetryIgnore: {
353 buttons[0] = AddAbortButton (0);
354 buttons[1] = AddRetryButton (1);
355 buttons[2] = AddIgnoreButton (2);
359 case MessageBoxButtons.YesNoCancel: {
360 buttons[0] = AddYesButton (0);
361 buttons[1] = AddNoButton (1);
362 buttons[2] = AddCancelButton (2);
366 case MessageBoxButtons.YesNo: {
367 buttons[0] = AddYesButton (0);
368 buttons[1] = AddNoButton (1);
372 case MessageBoxButtons.RetryCancel: {
373 buttons[0] = AddRetryButton (0);
374 buttons[1] = AddCancelButton (1);
381 for (int i = 0; i <= 3; i++) {
382 if (buttons [i] == null) {
389 buttons_placed = true;
393 private Button AddButton (string text, int left, EventHandler click_event)
395 Button button = new Button ();
396 button.Text = Locale.GetText(text);
397 button.Width = button_width;
398 button.Height = button_height;
399 button.Top = this.ClientSize.Height - button.Height - space_border;
400 button.Left = ((button_width + button_space) * left) + button_left;
402 if (click_event != null)
403 button.Click += click_event;
405 if ((text == "OK") || (text == "Retry") || (text == "Yes"))
406 AcceptButton = button;
407 else if ((text == "Cancel") || (text == "Abort") || (text == "No"))
408 CancelButton = button;
410 this.Controls.Add (button);
415 private Button AddOkButton (int left)
417 return AddButton ("OK", left, new EventHandler (OkClick));
420 private Button AddCancelButton (int left)
422 return AddButton ("Cancel", left, new EventHandler (CancelClick));
425 private Button AddAbortButton (int left)
427 return AddButton ("Abort", left, new EventHandler (AbortClick));
430 private Button AddRetryButton(int left)
432 return AddButton ("Retry", left, new EventHandler (RetryClick));
435 private Button AddIgnoreButton (int left)
437 return AddButton ("Ignore", left, new EventHandler (IgnoreClick));
440 private Button AddYesButton (int left)
442 return AddButton ("Yes", left, new EventHandler (YesClick));
445 private Button AddNoButton (int left)
447 return AddButton ("No", left, new EventHandler (NoClick));
451 private Button AddHelpButton (int left)
453 Button button = AddButton ("Help", left, null);
454 button.Click += delegate { Owner.RaiseHelpRequested (new HelpEventArgs (Owner.Location)); };
460 #region Button click handlers
461 private void OkClick (object sender, EventArgs e)
463 this.DialogResult = DialogResult.OK;
467 private void CancelClick (object sender, EventArgs e)
469 this.DialogResult = DialogResult.Cancel;
473 private void AbortClick (object sender, EventArgs e)
475 this.DialogResult = DialogResult.Abort;
479 private void RetryClick (object sender, EventArgs e)
481 this.DialogResult = DialogResult.Retry;
485 private void IgnoreClick (object sender, EventArgs e)
487 this.DialogResult = DialogResult.Ignore;
491 private void YesClick (object sender, EventArgs e)
493 this.DialogResult = DialogResult.Yes;
497 private void NoClick (object sender, EventArgs e)
499 this.DialogResult = DialogResult.No;
504 #endregion // Private MessageBoxForm class
508 private MessageBox ()
511 #endregion // Constructors
513 #region Public Static Methods
514 public static DialogResult Show (string text)
516 MessageBoxForm form = new MessageBoxForm (null, text, string.Empty, MessageBoxButtons.OK, MessageBoxIcon.None);
518 return form.RunDialog ();
521 public static DialogResult Show (IWin32Window owner, string text)
523 MessageBoxForm form = new MessageBoxForm (owner, text, string.Empty, MessageBoxButtons.OK, MessageBoxIcon.None);
525 return form.RunDialog ();
528 public static DialogResult Show (string text, string caption)
530 MessageBoxForm form = new MessageBoxForm (null, text, caption, MessageBoxButtons.OK, MessageBoxIcon.None);
532 return form.RunDialog ();
535 public static DialogResult Show (string text, string caption, MessageBoxButtons buttons)
537 MessageBoxForm form = new MessageBoxForm (null, text, caption, buttons, MessageBoxIcon.None);
539 return form.RunDialog ();
542 public static DialogResult Show (IWin32Window owner, string text, string caption,
543 MessageBoxButtons buttons)
545 MessageBoxForm form = new MessageBoxForm (owner, text, caption, buttons, MessageBoxIcon.None);
547 return form.RunDialog ();
550 public static DialogResult Show (IWin32Window owner, string text, string caption,
551 MessageBoxButtons buttons, MessageBoxIcon icon)
553 MessageBoxForm form = new MessageBoxForm (owner, text, caption, buttons, icon);
555 return form.RunDialog ();
559 public static DialogResult Show (IWin32Window owner, string text, string caption)
561 MessageBoxForm form = new MessageBoxForm (owner, text, caption, MessageBoxButtons.OK, MessageBoxIcon.None);
563 return form.RunDialog ();
567 public static DialogResult Show (string text, string caption, MessageBoxButtons buttons,
570 MessageBoxForm form = new MessageBoxForm (null, text, caption, buttons, icon);
572 return form.RunDialog ();
575 public static DialogResult Show (string text, string caption, MessageBoxButtons buttons,
576 MessageBoxIcon icon, MessageBoxDefaultButton defaultButton)
579 MessageBoxForm form = new MessageBoxForm (null, text, caption, buttons,
580 icon, defaultButton, MessageBoxOptions.DefaultDesktopOnly, false);
582 return form.RunDialog ();
585 public static DialogResult Show (IWin32Window owner, string text, string caption,
586 MessageBoxButtons buttons, MessageBoxIcon icon,
587 MessageBoxDefaultButton defaultButton)
589 MessageBoxForm form = new MessageBoxForm (owner, text, caption, buttons,
590 icon, defaultButton, MessageBoxOptions.DefaultDesktopOnly, false);
592 return form.RunDialog ();
595 public static DialogResult Show (string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon,
596 MessageBoxDefaultButton defaultButton, MessageBoxOptions options)
598 MessageBoxForm form = new MessageBoxForm (null, text, caption, buttons,
599 icon, defaultButton, options, false);
601 return form.RunDialog ();
604 public static DialogResult Show (IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon,
605 MessageBoxDefaultButton defaultButton, MessageBoxOptions options)
607 MessageBoxForm form = new MessageBoxForm (owner, text, caption, buttons,
608 icon, defaultButton, options, false);
610 return form.RunDialog ();
612 #endregion // Public Static Methods
615 public static DialogResult Show (string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon,
616 MessageBoxDefaultButton defaultButton, MessageBoxOptions options,
617 bool displayHelpButton)
619 MessageBoxForm form = new MessageBoxForm (null, text, caption, buttons,
620 icon, defaultButton, options, displayHelpButton);
621 return form.RunDialog ();
624 [MonoTODO ("Help is not implemented")]
625 public static DialogResult Show (string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon,
626 MessageBoxDefaultButton defaultButton, MessageBoxOptions options,
629 MessageBoxForm form = new MessageBoxForm (null, text, caption, buttons,
630 icon, defaultButton, options, true);
631 form.SetHelpData (helpFilePath, null, HelpNavigator.TableOfContents, null);
632 return form.RunDialog ();
635 [MonoTODO ("Help is not implemented")]
636 public static DialogResult Show (string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon,
637 MessageBoxDefaultButton defaultButton, MessageBoxOptions options,
638 string helpFilePath, string keyword)
640 MessageBoxForm form = new MessageBoxForm (null, text, caption, buttons,
641 icon, defaultButton, options, true);
642 form.SetHelpData (helpFilePath, keyword, HelpNavigator.TableOfContents, null);
643 return form.RunDialog ();
646 [MonoTODO ("Help is not implemented")]
647 public static DialogResult Show (string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon,
648 MessageBoxDefaultButton defaultButton, MessageBoxOptions options,
649 string helpFilePath, HelpNavigator navigator)
651 MessageBoxForm form = new MessageBoxForm (null, text, caption, buttons,
652 icon, defaultButton, options, true);
653 form.SetHelpData (helpFilePath, null, navigator, null);
654 return form.RunDialog ();
657 [MonoTODO ("Help is not implemented")]
658 public static DialogResult Show (string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon,
659 MessageBoxDefaultButton defaultButton, MessageBoxOptions options,
660 string helpFilePath, HelpNavigator navigator, object param)
662 MessageBoxForm form = new MessageBoxForm (null, text, caption, buttons,
663 icon, defaultButton, options, true);
664 form.SetHelpData (helpFilePath, null, navigator, param);
665 return form.RunDialog ();
668 [MonoTODO ("Help is not implemented")]
669 public static DialogResult Show (IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon,
670 MessageBoxDefaultButton defaultButton, MessageBoxOptions options,
673 MessageBoxForm form = new MessageBoxForm (owner, text, caption, buttons,
674 icon, defaultButton, options, true);
675 form.SetHelpData (helpFilePath, null, HelpNavigator.TableOfContents, null);
676 return form.RunDialog ();
679 [MonoTODO ("Help is not implemented")]
680 public static DialogResult Show (IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon,
681 MessageBoxDefaultButton defaultButton, MessageBoxOptions options,
682 string helpFilePath, string keyword)
684 MessageBoxForm form = new MessageBoxForm (owner, text, caption, buttons,
685 icon, defaultButton, options, true);
686 form.SetHelpData (helpFilePath, keyword, HelpNavigator.TableOfContents, null);
687 return form.RunDialog ();
690 [MonoTODO ("Help is not implemented")]
691 public static DialogResult Show (IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon,
692 MessageBoxDefaultButton defaultButton, MessageBoxOptions options,
693 string helpFilePath, HelpNavigator navigator)
695 MessageBoxForm form = new MessageBoxForm (owner, text, caption, buttons,
696 icon, defaultButton, options, true);
697 form.SetHelpData (helpFilePath, null, navigator, null);
698 return form.RunDialog ();
701 [MonoTODO ("Help is not implemented")]
702 public static DialogResult Show (IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon,
703 MessageBoxDefaultButton defaultButton, MessageBoxOptions options,
704 string helpFilePath, HelpNavigator navigator, object param)
706 MessageBoxForm form = new MessageBoxForm (owner, text, caption, buttons,
707 icon, defaultButton, options, true);
708 form.SetHelpData (helpFilePath, null, navigator, param);
709 return form.RunDialog ();