// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; using System.Drawing; using System.Windows.Forms; namespace ICSharpCode.Core.WinForms { sealed class CustomDialog : System.Windows.Forms.Form { System.Windows.Forms.Label label; System.Windows.Forms.Panel panel; int acceptButton; int cancelButton; int result = -1; /// /// Gets the index of the button pressed. /// public int Result { get { return result; } } public CustomDialog(string caption, string message, int acceptButton, int cancelButton, string[] buttonLabels) { this.SuspendLayout(); MyInitializeComponent(); this.Icon = null; this.acceptButton = acceptButton; this.cancelButton = cancelButton; message = StringParser.Parse(message); this.Text = StringParser.Parse(caption); using (Graphics g = this.CreateGraphics()) { Rectangle screen = Screen.PrimaryScreen.WorkingArea; SizeF size = g.MeasureString(message, label.Font, screen.Width - 20); Size clientSize = size.ToSize(); Button[] buttons = new Button[buttonLabels.Length]; int[] positions = new int[buttonLabels.Length]; int pos = 0; for (int i = 0; i < buttons.Length; i++) { Button newButton = new Button(); newButton.FlatStyle = FlatStyle.System; newButton.Tag = i; string buttonLabel = StringParser.Parse(buttonLabels[i]); newButton.Text = buttonLabel; newButton.Click += new EventHandler(ButtonClick); SizeF buttonSize = g.MeasureString(buttonLabel, newButton.Font); newButton.Width = Math.Max(newButton.Width, ((int)Math.Ceiling(buttonSize.Width / 8.0) + 1) * 8); positions[i] = pos; buttons[i] = newButton; pos += newButton.Width + 4; } if (acceptButton >= 0) { AcceptButton = buttons[acceptButton]; } if (cancelButton >= 0) { CancelButton = buttons[cancelButton]; } pos += 4; // add space before first button // (we don't start with pos=4 because this space doesn't belong to the button panel) if (pos > clientSize.Width) { clientSize.Width = pos; } clientSize.Height += panel.Height + 6; this.ClientSize = clientSize; int start = (clientSize.Width - pos) / 2; for (int i = 0; i < buttons.Length; i++) { buttons[i].Location = new Point(start + positions[i], 4); } panel.Controls.AddRange(buttons); } label.Text = message; RightToLeftConverter.ConvertRecursive(this); this.ResumeLayout(false); } protected override void OnKeyDown(KeyEventArgs e) { if (cancelButton == -1 && e.KeyCode == Keys.Escape) { this.Close(); } } void ButtonClick(object sender, EventArgs e) { result = (int)((Control)sender).Tag; this.Close(); } /// /// This method is required for Windows Forms designer support. /// Do not change the method contents inside the source code editor. The Forms designer might /// not be able to load this method if it was changed manually. /// void MyInitializeComponent() { this.panel = new System.Windows.Forms.Panel(); this.label = new System.Windows.Forms.Label(); // // panel // this.panel.Dock = System.Windows.Forms.DockStyle.Bottom; this.panel.Location = new System.Drawing.Point(4, 80); this.panel.Name = "panel"; this.panel.Size = new System.Drawing.Size(266, 32); this.panel.TabIndex = 0; // // label // this.label.Dock = System.Windows.Forms.DockStyle.Fill; this.label.FlatStyle = System.Windows.Forms.FlatStyle.System; this.label.Location = new System.Drawing.Point(4, 4); this.label.Name = "label"; this.label.Size = new System.Drawing.Size(266, 76); this.label.TabIndex = 1; this.label.UseMnemonic = false; // // CustomDialog // this.ClientSize = new System.Drawing.Size(274, 112); this.Controls.Add(this.label); this.Controls.Add(this.panel); this.DockPadding.Left = 4; this.DockPadding.Right = 4; this.DockPadding.Top = 4; this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; this.ShowInTaskbar = false; this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "CustomDialog"; this.KeyPreview = true; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.Text = "CustomDialog"; } } }