From 2cbbae72cd9a3108cc2b39cdc60cb11546864996 Mon Sep 17 00:00:00 2001 From: Mogzol Date: Wed, 9 Mar 2016 01:01:14 -0800 Subject: [PATCH] Improve error messages, and numerous other fixes Changed how the main builder method works, now uses a state-based system. Wit error messages should now show more details about the error. The "Build Completed" sometimes appearing even if the build did not complete properly bug has (hopefully) been fixed, it should give you an error now if it didn't make it to the final stage. The --show-wit-debug option has been added which keeps wit windows open after wit finishes, to help with debugging The help text for the Brawl ISO has been edited to clarify how the ssbb.d folder works A crash if building with no GCT selected has been fixed Added some files that were missing from the Resources folder in the git repo. Updated readme's Upped assembly version Other code cleanup and misc. fixes --- BrawlBuilder/BrawlBuilder.WorkerCode.cs | 385 +++++++---- BrawlBuilder/BrawlBuilder.cs | 2 +- BrawlBuilder/BrawlBuilder.csproj | 1 + BrawlBuilder/FlexibleMessageBox.cs | 862 ++++++++++++++++++++++++ BrawlBuilder/Properties/AssemblyInfo.cs | 4 +- Other/readme.txt | 25 +- README.md | 4 + Resources/wit/cyggcc_s-1.dll | Bin 0 -> 109597 bytes Resources/wit/cygz.dll | Bin 0 -> 84519 bytes 9 files changed, 1136 insertions(+), 147 deletions(-) create mode 100644 BrawlBuilder/FlexibleMessageBox.cs create mode 100644 Resources/wit/cyggcc_s-1.dll create mode 100644 Resources/wit/cygz.dll diff --git a/BrawlBuilder/BrawlBuilder.WorkerCode.cs b/BrawlBuilder/BrawlBuilder.WorkerCode.cs index 88778ba..cb59f12 100644 --- a/BrawlBuilder/BrawlBuilder.WorkerCode.cs +++ b/BrawlBuilder/BrawlBuilder.WorkerCode.cs @@ -8,12 +8,28 @@ using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Windows.Forms; +using JR.Utils.GUI.Forms; namespace BrawlBuilder { partial class BrawlBuilder { + private enum State + { + Analyze, + Extract, + Verify, + DeleteSSE, + CopyModFiles, + CopyBanner, + Patch, + Build, + Finish + } + private bool _remove_en; + private bool _showWit; + private State _state; private void buildWorker_DoWork(object sender, DoWorkEventArgs e) { @@ -21,14 +37,15 @@ namespace BrawlBuilder _remove_en = false; // Set up wit - bool showWit = Environment.GetCommandLineArgs().Contains("--show-wit"); + _showWit = Environment.GetCommandLineArgs().Contains("--show-wit") || Environment.GetCommandLineArgs().Contains("--show-wit-debug"); if (!File.Exists(@".\Resources\wit\wit.exe")) StopWorker("Unable to find wit executable, stopping build..."); ProcessStartInfo pStartInfo = new ProcessStartInfo(@".\Resources\wit\wit.exe"); - pStartInfo.CreateNoWindow = !showWit; - pStartInfo.UseShellExecute = showWit; - pStartInfo.RedirectStandardOutput = !showWit; + pStartInfo.CreateNoWindow = !_showWit; + pStartInfo.UseShellExecute = _showWit; + pStartInfo.RedirectStandardOutput = !_showWit; + pStartInfo.RedirectStandardError = !_showWit; if (buildWorker.CancellationPending) { @@ -64,83 +81,104 @@ namespace BrawlBuilder return; } - // STAGE 1: Analyze GCT File.Delete(@"./Resources/temp.gct"); // Make sure any leftover gct gets removed - if (!Environment.GetCommandLineArgs().Contains("--no-gct-patch")) + + // Set state to the starting state + _state = State.Analyze; + + while (_state != State.Finish) { - if (!Analyze()) + switch (_state) { - e.Cancel = true; - return; + case State.Analyze: + if (gctFile.Text != "" && !Environment.GetCommandLineArgs().Contains("--no-gct-patch")) + { + if (!Analyze()) + { + e.Cancel = true; + return; + } + } + _state = State.Extract; + break; + + case State.Extract: + if (!Extract(pStartInfo)) + { + e.Cancel = true; + return; + } + _state = State.Verify; + break; + + case State.Verify: + if (!Verify()) + { + e.Cancel = true; + return; + } + _state = State.DeleteSSE; + break; + + case State.DeleteSSE: + if (removeSubspace.Checked) + { + if (!DeleteSSE()) + { + e.Cancel = true; + return; + } + } + _state = State.CopyModFiles; + break; + + case State.CopyModFiles: + if (modFolder.Text != "") + { + if (!CopyModFiles()) + { + e.Cancel = true; + return; + } + } + _state = State.CopyBanner; + break; + + case State.CopyBanner: + if (customBanner.Checked) + { + if (!CopyBanner()) + { + e.Cancel = true; + return; + } + } + _state = State.Patch; + break; + + case State.Patch: + if (gctFile.Text != "" || customID.Checked) + { + if (!Patch(pStartInfo)) + { + e.Cancel = true; + return; + } + } + _state = State.Build; + break; + + case State.Build: + if (!Build(pStartInfo)) + { + e.Cancel = true; + return; + } + _state = State.Finish; + break; } } - - // STAGE 2: Extract Brawl - if (!Extract(pStartInfo)) - { - e.Cancel = true; - return; - } - - - // STAGE 3: Verify files - if (!Verify()) - { - e.Cancel = true; - return; - } - - - // STAGE 4: Delete Subspace Emissary - if (removeSubspace.Checked) - { - if (!DeleteSSE()) - { - e.Cancel = true; - return; - } - } - - - // STAGE 5: Apply mod files - if (modFolder.Text != "") - { - if (!CopyModFiles()) - { - e.Cancel = true; - return; - } - } - - - // STAGE 6: Apply banner - if (customBanner.Checked) - { - if (!CopyBanner()) - { - e.Cancel = true; - return; - } - } - - // STAGE 7: Patch main.dol - if (gctFile.Text != "" || customID.Checked) - { - if (!Patch(pStartInfo)) - { - e.Cancel = true; - return; - } - } - - // STAGE 8: Build Brawl - if (!Build(pStartInfo)) - { - e.Cancel = true; - return; - } - // Clean up DeleteBrawlFolder(); } @@ -185,7 +223,6 @@ namespace BrawlBuilder _remove_en = true; continue; } - action = line; @@ -340,23 +377,8 @@ namespace BrawlBuilder // Extract brawl to ssbb.d folder pStartInfo.Arguments = "extract \"" + brawlIso.Text + "\" ssbb.d --psel=DATA -1ovv"; - if (pStartInfo.RedirectStandardOutput) - { - if (!DoWitWithProgress(pStartInfo)) - return false; - } - else - { - // --show-wit option was set - Process p = Process.Start(pStartInfo); - p.WaitForExit(); - - // Check wit exit code - if (p.ExitCode != 0) - StopWorker("Wit closed unexpectedly with exit code " + p.ExitCode + ", stopping build..."); - - p.Dispose(); - } + if (!DoWit(pStartInfo)) + return false; } if (!Directory.Exists("ssbb.d")) @@ -678,13 +700,9 @@ namespace BrawlBuilder SetStatus("Patching..."); pStartInfo.Arguments = "dolpatch ssbb.d/sys/main.dol" + patchArgs; - Process p = Process.Start(pStartInfo); - p.WaitForExit(); - if (p.ExitCode != 0) - StopWorker("Wit closed unexpectedly with exit code " + p.ExitCode + ", stopping build..."); - - p.Dispose(); + if (!DoWit(pStartInfo, true)) + return false; } if (buildWorker.CancellationPending) @@ -712,51 +730,33 @@ namespace BrawlBuilder pStartInfo.Arguments = "copy ssbb.d \"" + _saveFileName + "\" -ovv" + (splitOutput ? "z" : "") + (customID.Checked ? " --id=" + gameID.Text : "") + (cutomTitle.Checked ? " --name \"" + gameTitle.Text + "\"" : ""); - if (pStartInfo.RedirectStandardOutput) - { - if (!DoWitWithProgress(pStartInfo)) - return false; - } - else - { - // --show-wit option set - Process p = Process.Start(pStartInfo); - p.WaitForExit(); - - // Check wit exit code - if (p.ExitCode != 0) - StopWorker("Wit closed unexpectedly with exit code " + p.ExitCode + ", stopping build..."); - - p.Dispose(); - } - - // Make sure wit created the file - if (!File.Exists(_saveFileName)) - StopWorker("Build failed, stopping..."); + if (!DoWit(pStartInfo)) + return false; return true; } - private bool DoWitWithProgress(ProcessStartInfo pStartInfo) + private bool DoWit(ProcessStartInfo pStartInfo, bool forceNoProgress = false) { - // Set up blinker - _progress = 0; - _progressMax = 100; - if (blinker.IsBusy) + // Determine if we want wit to be hidden or not + if (!_showWit && !forceNoProgress) { - blinker.CancelAsync(); - while (blinker.IsBusy) + // Set up blinker + _progress = 0; + _progressMax = 100; + if (blinker.IsBusy) { - Thread.Sleep(100); + blinker.CancelAsync(); + while (blinker.IsBusy) + { + Thread.Sleep(100); + } } - } - blinker.RunWorkerAsync(); + blinker.RunWorkerAsync(); - // Create outside of loop for better performance - Regex r = new Regex(@"(\d+)%"); + // Create outside of loop for better performance + Regex r = new Regex(@"(\d+)%"); - if (pStartInfo.RedirectStandardOutput) - { using (Process p = Process.Start(pStartInfo)) { using (StreamReader reader = p.StandardOutput) @@ -773,7 +773,7 @@ namespace BrawlBuilder if (!p.HasExited) { p.Kill(); - p.WaitForExit(5000); + p.WaitForExit(); } break; @@ -793,7 +793,7 @@ namespace BrawlBuilder if (!p.HasExited) { p.Kill(); - p.WaitForExit(5000); + p.WaitForExit(); } // Didn't finish working, delete ssbb.d @@ -806,9 +806,54 @@ namespace BrawlBuilder } } + string error = ""; + using (StreamReader s = p.StandardError) + { + error = s.ReadToEnd(); + } + // Check wit exit code if (p.ExitCode != 0) - StopWorker("Wit closed unexpectedly with exit code " + p.ExitCode + ", stopping build..."); + { + StopWorker("Wit closed unexpectedly with exit code " + p.ExitCode + ", stopping build..." + (error.Length > 0 ? "\n\nWit error messages:\n\n" + error : ""), error.Length > 0); + } + // If there were errors, but exit code was fine, notify the user, but let them continue + else if (error.Length > 0) + { + DialogResult result = FlexibleMessageBox.Show("Wit didn't exit with an error code, however it did write to the error output with the following:\n\n" + error + "\n\nDo you still want to continue the build?", "Notice", MessageBoxButtons.YesNo, MessageBoxIcon.Question); + + if (result == DialogResult.No) + buildWorker.CancelAsync(); + } + } + } + else + { + // Check if we want to keep the window open after, and handle that if we do + if (Environment.GetCommandLineArgs().Contains("--show-wit-debug")) + { + ProcessStartInfo newStartInfo = new ProcessStartInfo(); + newStartInfo.FileName = "CMD.exe"; + newStartInfo.Arguments = "/C \"\"" + pStartInfo.FileName + "\" " + pStartInfo.Arguments + " & pause & if errorlevel 1 exit -1\""; + pStartInfo = newStartInfo; + } + + using (Process p = Process.Start(pStartInfo)) + { + p.WaitForExit(); + + if (p.ExitCode != 0) + { + if (Environment.GetCommandLineArgs().Contains("--show-wit-debug")) + { + // The exit code won't be accurate, so just say Wit closed + StopWorker("Wit closed unexpectedly, stopping build..."); + } + else + { + StopWorker("Wit closed unexpectedly with exit code " + p.ExitCode + ", stopping build..."); + } + } } } @@ -843,9 +888,13 @@ namespace BrawlBuilder } } - private void StopWorker(string message) + private void StopWorker(string message, bool flex = false) { - MessageBox.Show(message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + if (flex) + FlexibleMessageBox.Show(message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + else + MessageBox.Show(message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + buildWorker.CancelAsync(); } @@ -859,12 +908,17 @@ namespace BrawlBuilder private void buildWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { - // Clean up temp files + // Clean up files File.Delete(@".\Resources\temp.gct"); if (_exiting) Environment.Exit(1); + // Stop the blinker if it is running + blinker.CancelAsync(); + while (blinker.IsBusy) + Thread.Sleep(100); + // Re-enable controls foreach (Control c in Controls) { @@ -880,8 +934,53 @@ namespace BrawlBuilder Activate(); // Show success if builder actually finished - if (e.Cancelled != true) - MessageBox.Show("Build Completed!", "Success!", MessageBoxButtons.OK, MessageBoxIcon.Information); + if (_state == State.Finish) + { + if (File.Exists(_saveFileName)) + { + MessageBox.Show("Build Completed!", "Success!", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + else + { + MessageBox.Show("BrawlBuilder did not encounter any errors during the build process, but the output image doesn't seem to exist, which indicates that the build did not complete successfully. Sorry about that.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + else if (!e.Cancelled) + { + string message = ""; + switch(_state) + { + case State.Analyze: + message = "Build failed due to an unknown error while patching the GCT file."; + break; + case State.Verify: + message = "Build failed due to an unknown error while verifiying the Brawl image."; + break; + case State.Extract: + message = "Build failed due to an unknown error while extracting the Brawl image."; + break; + case State.DeleteSSE: + message = "Build failed due to an unknown error while deleting Subspace Emissary files."; + break; + case State.CopyModFiles: + message = "Build failed due to an unknown error while copying mod files."; + break; + case State.CopyBanner: + message = "Build failed due to an unknown error while copying the custom banner."; + break; + case State.Patch: + message = "Build failed due to an unknown error while applying the GCT file to the Brawl image."; + break; + case State.Build: + message = "Build failed due to an unkonwn error while building the modded Brawl image."; + break; + default: + message = "Build failed due to an unknown error."; + break; + } + + MessageBox.Show(message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } } private void blinker_DoWork(object sender, DoWorkEventArgs e) @@ -901,7 +1000,7 @@ namespace BrawlBuilder if (blinker.CancellationPending) break; - // 'Sleep' for ~4000ms, but also updates + // 'Sleep' for ~4000ms, but also update & cancel faster for (int i = 0; i < 40; i++) { float percent = (int)((float)_progress / _progressMax * 100); diff --git a/BrawlBuilder/BrawlBuilder.cs b/BrawlBuilder/BrawlBuilder.cs index 8f2dc06..4cf5d03 100644 --- a/BrawlBuilder/BrawlBuilder.cs +++ b/BrawlBuilder/BrawlBuilder.cs @@ -80,7 +80,7 @@ namespace BrawlBuilder private void brawlIso_lbl_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { - MessageBox.Show("Select your unmodded Brawl disk image. This can be an ISO, CISO, WBFS, WBI, WIA, or WDF file\n\nNote: If there is an ssbb.d folder containing all of Brawl's files in the same folder as this application, then this field is unnecessary.", "Help", MessageBoxButtons.OK, MessageBoxIcon.Information); + MessageBox.Show("Select your unmodded Brawl disk image. This can be an ISO, CISO, WBFS, WBI, WIA, or WDF file\n\nNote: If you have a folder containing all of Brawl's files extracted using wit, then you can also just copy the contents of that folder to an 'ssbb.d' folder in the same directory as BrawlBuilder, and this field will be unnecessary.", "Help", MessageBoxButtons.OK, MessageBoxIcon.Information); } private void brawlIsoBrowse_Click(object sender, EventArgs e) diff --git a/BrawlBuilder/BrawlBuilder.csproj b/BrawlBuilder/BrawlBuilder.csproj index 491d64d..85b278c 100644 --- a/BrawlBuilder/BrawlBuilder.csproj +++ b/BrawlBuilder/BrawlBuilder.csproj @@ -58,6 +58,7 @@ Form + diff --git a/BrawlBuilder/FlexibleMessageBox.cs b/BrawlBuilder/FlexibleMessageBox.cs new file mode 100644 index 0000000..e10e8d1 --- /dev/null +++ b/BrawlBuilder/FlexibleMessageBox.cs @@ -0,0 +1,862 @@ +using System; +using System.Diagnostics; +using System.Drawing; +using System.Globalization; +using System.Linq; +using System.Windows.Forms; + +namespace JR.Utils.GUI.Forms +{ + /* FlexibleMessageBox – A flexible replacement for the .NET MessageBox + * + * Author: Jörg Reichert (public@jreichert.de) + * Contributors: Thanks to: David Hall, Roink + * Version: 1.3 + * Published at: http://www.codeproject.com/Articles/601900/FlexibleMessageBox + * + ************************************************************************************************************ + * Features: + * - It can be simply used instead of MessageBox since all important static "Show"-Functions are supported + * - It is small, only one source file, which could be added easily to each solution + * - It can be resized and the content is correctly word-wrapped + * - It tries to auto-size the width to show the longest text row + * - It never exceeds the current desktop working area + * - It displays a vertical scrollbar when needed + * - It does support hyperlinks in text + * + * Because the interface is identical to MessageBox, you can add this single source file to your project + * and use the FlexibleMessageBox almost everywhere you use a standard MessageBox. + * The goal was NOT to produce as many features as possible but to provide a simple replacement to fit my + * own needs. Feel free to add additional features on your own, but please left my credits in this class. + * + ************************************************************************************************************ + * Usage examples: + * + * FlexibleMessageBox.Show("Just a text"); + * + * FlexibleMessageBox.Show("A text", + * "A caption"); + * + * FlexibleMessageBox.Show("Some text with a link: www.google.com", + * "Some caption", + * MessageBoxButtons.AbortRetryIgnore, + * MessageBoxIcon.Information, + * MessageBoxDefaultButton.Button2); + * + * var dialogResult = FlexibleMessageBox.Show("Do you know the answer to life the universe and everything?", + * "One short question", + * MessageBoxButtons.YesNo); + * + ************************************************************************************************************ + * THE SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS", WITHOUT WARRANTY + * OF ANY KIND, EXPRESS OR IMPLIED. IN NO EVENT SHALL THE AUTHOR BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OF THIS + * SOFTWARE. + * + ************************************************************************************************************ + * History: + * Version 1.3 - 19.Dezember 2014 + * - Added refactoring function GetButtonText() + * - Used CurrentUICulture instead of InstalledUICulture + * - Added more button localizations. Supported languages are now: ENGLISH, GERMAN, SPANISH, ITALIAN + * - Added standard MessageBox handling for "copy to clipboard" with + and + + * - Tab handling is now corrected (only tabbing over the visible buttons) + * - Added standard MessageBox handling for ALT-Keyboard shortcuts + * - SetDialogSizes: Refactored completely: Corrected sizing and added caption driven sizing + * + * Version 1.2 - 10.August 2013 + * - Do not ShowInTaskbar anymore (original MessageBox is also hidden in taskbar) + * - Added handling for Escape-Button + * - Adapted top right close button (red X) to behave like MessageBox (but hidden instead of deactivated) + * + * Version 1.1 - 14.June 2013 + * - Some Refactoring + * - Added internal form class + * - Added missing code comments, etc. + * + * Version 1.0 - 15.April 2013 + * - Initial Version + */ + public class FlexibleMessageBox + { + #region Public statics + + /// + /// Defines the maximum width for all FlexibleMessageBox instances in percent of the working area. + /// + /// Allowed values are 0.2 - 1.0 where: + /// 0.2 means: The FlexibleMessageBox can be at most half as wide as the working area. + /// 1.0 means: The FlexibleMessageBox can be as wide as the working area. + /// + /// Default is: 70% of the working area width. + /// + public static double MAX_WIDTH_FACTOR = 0.7; + + /// + /// Defines the maximum height for all FlexibleMessageBox instances in percent of the working area. + /// + /// Allowed values are 0.2 - 1.0 where: + /// 0.2 means: The FlexibleMessageBox can be at most half as high as the working area. + /// 1.0 means: The FlexibleMessageBox can be as high as the working area. + /// + /// Default is: 90% of the working area height. + /// + public static double MAX_HEIGHT_FACTOR = 0.9; + + /// + /// Defines the font for all FlexibleMessageBox instances. + /// + /// Default is: SystemFonts.MessageBoxFont + /// + public static Font FONT = SystemFonts.MessageBoxFont; + + #endregion + + #region Public show functions + + /// + /// Shows the specified message box. + /// + /// The text. + /// The dialog result. + public static DialogResult Show(string text) + { + return FlexibleMessageBoxForm.Show(null, text, string.Empty, MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1); + } + + /// + /// Shows the specified message box. + /// + /// The owner. + /// The text. + /// The dialog result. + public static DialogResult Show(IWin32Window owner, string text) + { + return FlexibleMessageBoxForm.Show(owner, text, string.Empty, MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1); + } + + /// + /// Shows the specified message box. + /// + /// The text. + /// The caption. + /// The dialog result. + public static DialogResult Show(string text, string caption) + { + return FlexibleMessageBoxForm.Show(null, text, caption, MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1); + } + + /// + /// Shows the specified message box. + /// + /// The owner. + /// The text. + /// The caption. + /// The dialog result. + public static DialogResult Show(IWin32Window owner, string text, string caption) + { + return FlexibleMessageBoxForm.Show(owner, text, caption, MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1); + } + + /// + /// Shows the specified message box. + /// + /// The text. + /// The caption. + /// The buttons. + /// The dialog result. + public static DialogResult Show(string text, string caption, MessageBoxButtons buttons) + { + return FlexibleMessageBoxForm.Show(null, text, caption, buttons, MessageBoxIcon.None, MessageBoxDefaultButton.Button1); + } + + /// + /// Shows the specified message box. + /// + /// The owner. + /// The text. + /// The caption. + /// The buttons. + /// The dialog result. + public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons) + { + return FlexibleMessageBoxForm.Show(owner, text, caption, buttons, MessageBoxIcon.None, MessageBoxDefaultButton.Button1); + } + + /// + /// Shows the specified message box. + /// + /// The text. + /// The caption. + /// The buttons. + /// The icon. + /// + public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon) + { + return FlexibleMessageBoxForm.Show(null, text, caption, buttons, icon, MessageBoxDefaultButton.Button1); + } + + /// + /// Shows the specified message box. + /// + /// The owner. + /// The text. + /// The caption. + /// The buttons. + /// The icon. + /// The dialog result. + public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon) + { + return FlexibleMessageBoxForm.Show(owner, text, caption, buttons, icon, MessageBoxDefaultButton.Button1); + } + + /// + /// Shows the specified message box. + /// + /// The text. + /// The caption. + /// The buttons. + /// The icon. + /// The default button. + /// The dialog result. + public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton) + { + return FlexibleMessageBoxForm.Show(null, text, caption, buttons, icon, defaultButton); + } + + /// + /// Shows the specified message box. + /// + /// The owner. + /// The text. + /// The caption. + /// The buttons. + /// The icon. + /// The default button. + /// The dialog result. + public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton) + { + return FlexibleMessageBoxForm.Show(owner, text, caption, buttons, icon, defaultButton); + } + + #endregion + + #region Internal form class + + /// + /// The form to show the customized message box. + /// It is defined as an internal class to keep the public interface of the FlexibleMessageBox clean. + /// + class FlexibleMessageBoxForm : Form + { + #region Form-Designer generated code + + /// + /// Erforderliche Designervariable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Verwendete Ressourcen bereinigen. + /// + /// True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + /// + /// Erforderliche Methode für die Designerunterstützung. + /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.button1 = new System.Windows.Forms.Button(); + this.richTextBoxMessage = new System.Windows.Forms.RichTextBox(); + this.FlexibleMessageBoxFormBindingSource = new System.Windows.Forms.BindingSource(this.components); + this.panel1 = new System.Windows.Forms.Panel(); + this.pictureBoxForIcon = new System.Windows.Forms.PictureBox(); + this.button2 = new System.Windows.Forms.Button(); + this.button3 = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.FlexibleMessageBoxFormBindingSource)).BeginInit(); + this.panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxForIcon)).BeginInit(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.button1.AutoSize = true; + this.button1.DialogResult = System.Windows.Forms.DialogResult.OK; + this.button1.Location = new System.Drawing.Point(11, 67); + this.button1.MinimumSize = new System.Drawing.Size(0, 24); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 24); + this.button1.TabIndex = 2; + this.button1.Text = "OK"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Visible = false; + // + // richTextBoxMessage + // + this.richTextBoxMessage.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.richTextBoxMessage.BackColor = System.Drawing.Color.White; + this.richTextBoxMessage.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.richTextBoxMessage.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.FlexibleMessageBoxFormBindingSource, "MessageText", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged)); + this.richTextBoxMessage.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.richTextBoxMessage.Location = new System.Drawing.Point(50, 26); + this.richTextBoxMessage.Margin = new System.Windows.Forms.Padding(0); + this.richTextBoxMessage.Name = "richTextBoxMessage"; + this.richTextBoxMessage.ReadOnly = true; + this.richTextBoxMessage.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical; + this.richTextBoxMessage.Size = new System.Drawing.Size(200, 20); + this.richTextBoxMessage.TabIndex = 0; + this.richTextBoxMessage.TabStop = false; + this.richTextBoxMessage.Text = ""; + this.richTextBoxMessage.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.richTextBoxMessage_LinkClicked); + // + // panel1 + // + this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.panel1.BackColor = System.Drawing.Color.White; + this.panel1.Controls.Add(this.pictureBoxForIcon); + this.panel1.Controls.Add(this.richTextBoxMessage); + this.panel1.Location = new System.Drawing.Point(-3, -4); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(268, 59); + this.panel1.TabIndex = 1; + // + // pictureBoxForIcon + // + this.pictureBoxForIcon.BackColor = System.Drawing.Color.Transparent; + this.pictureBoxForIcon.Location = new System.Drawing.Point(15, 19); + this.pictureBoxForIcon.Name = "pictureBoxForIcon"; + this.pictureBoxForIcon.Size = new System.Drawing.Size(32, 32); + this.pictureBoxForIcon.TabIndex = 8; + this.pictureBoxForIcon.TabStop = false; + // + // button2 + // + this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.button2.DialogResult = System.Windows.Forms.DialogResult.OK; + this.button2.Location = new System.Drawing.Point(92, 67); + this.button2.MinimumSize = new System.Drawing.Size(0, 24); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(75, 24); + this.button2.TabIndex = 3; + this.button2.Text = "OK"; + this.button2.UseVisualStyleBackColor = true; + this.button2.Visible = false; + // + // button3 + // + this.button3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.button3.AutoSize = true; + this.button3.DialogResult = System.Windows.Forms.DialogResult.OK; + this.button3.Location = new System.Drawing.Point(173, 67); + this.button3.MinimumSize = new System.Drawing.Size(0, 24); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(75, 24); + this.button3.TabIndex = 0; + this.button3.Text = "OK"; + this.button3.UseVisualStyleBackColor = true; + this.button3.Visible = false; + // + // FlexibleMessageBoxForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(260, 102); + this.Controls.Add(this.button3); + this.Controls.Add(this.button2); + this.Controls.Add(this.panel1); + this.Controls.Add(this.button1); + this.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.FlexibleMessageBoxFormBindingSource, "CaptionText", true)); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(276, 140); + this.Name = "FlexibleMessageBoxForm"; + this.ShowIcon = false; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Show; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = ""; + this.Shown += new System.EventHandler(this.FlexibleMessageBoxForm_Shown); + ((System.ComponentModel.ISupportInitialize)(this.FlexibleMessageBoxFormBindingSource)).EndInit(); + this.panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxForIcon)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + } + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.BindingSource FlexibleMessageBoxFormBindingSource; + private System.Windows.Forms.RichTextBox richTextBoxMessage; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.PictureBox pictureBoxForIcon; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button3; + + #endregion + + #region Private constants + + //These separators are used for the "copy to clipboard" standard operation, triggered by Ctrl + C (behavior and clipboard format is like in a standard MessageBox) + private static readonly String STANDARD_MESSAGEBOX_SEPARATOR_LINES = "---------------------------\n"; + private static readonly String STANDARD_MESSAGEBOX_SEPARATOR_SPACES = " "; + + //These are the possible buttons (in a standard MessageBox) + private enum ButtonID { OK = 0, CANCEL, YES, NO, ABORT, RETRY, IGNORE }; + + //These are the buttons texts for different languages. + //If you want to add a new language, add it here and in the GetButtonText-Function + private enum TwoLetterISOLanguageID { en, de, es, it }; + private static readonly String[] BUTTON_TEXTS_ENGLISH_EN = { "OK", "Cancel", "&Yes", "&No", "&Abort", "&Retry", "&Ignore" }; //Note: This is also the fallback language + private static readonly String[] BUTTON_TEXTS_GERMAN_DE = { "OK", "Abbrechen", "&Ja", "&Nein", "&Abbrechen", "&Wiederholen", "&Ignorieren" }; + private static readonly String[] BUTTON_TEXTS_SPANISH_ES = { "Aceptar", "Cancelar", "&Sí", "&No", "&Abortar", "&Reintentar", "&Ignorar" }; + private static readonly String[] BUTTON_TEXTS_ITALIAN_IT = { "OK", "Annulla", "&Sì", "&No", "&Interrompi", "&Riprova", "&Ignora" }; + + #endregion + + #region Private members + + private MessageBoxDefaultButton defaultButton; + private int visibleButtonsCount; + private TwoLetterISOLanguageID languageID = TwoLetterISOLanguageID.en; + + #endregion + + #region Private constructor + + /// + /// Initializes a new instance of the class. + /// + private FlexibleMessageBoxForm() + { + InitializeComponent(); + + //Try to evaluate the language. If this fails, the fallback language English will be used + Enum.TryParse(CultureInfo.CurrentUICulture.TwoLetterISOLanguageName, out this.languageID); + + this.KeyPreview = true; + this.KeyUp += FlexibleMessageBoxForm_KeyUp; + } + + #endregion + + #region Private helper functions + + /// + /// Gets the string rows. + /// + /// The message. + /// The string rows as 1-dimensional array + private static string[] GetStringRows(string message) + { + if (string.IsNullOrEmpty(message)) return null; + + var messageRows = message.Split(new char[] { '\n' }, StringSplitOptions.None); + return messageRows; + } + + /// + /// Gets the button text for the CurrentUICulture language. + /// Note: The fallback language is English + /// + /// The ID of the button. + /// The button text + private string GetButtonText(ButtonID buttonID) + { + var buttonTextArrayIndex = Convert.ToInt32(buttonID); + + switch (this.languageID) + { + case TwoLetterISOLanguageID.de: return BUTTON_TEXTS_GERMAN_DE[buttonTextArrayIndex]; + case TwoLetterISOLanguageID.es: return BUTTON_TEXTS_SPANISH_ES[buttonTextArrayIndex]; + case TwoLetterISOLanguageID.it: return BUTTON_TEXTS_ITALIAN_IT[buttonTextArrayIndex]; + + default: return BUTTON_TEXTS_ENGLISH_EN[buttonTextArrayIndex]; + } + } + + /// + /// Ensure the given working area factor in the range of 0.2 - 1.0 where: + /// + /// 0.2 means: 20 percent of the working area height or width. + /// 1.0 means: 100 percent of the working area height or width. + /// + /// The given working area factor. + /// The corrected given working area factor. + private static double GetCorrectedWorkingAreaFactor(double workingAreaFactor) + { + const double MIN_FACTOR = 0.2; + const double MAX_FACTOR = 1.0; + + if (workingAreaFactor < MIN_FACTOR) return MIN_FACTOR; + if (workingAreaFactor > MAX_FACTOR) return MAX_FACTOR; + + return workingAreaFactor; + } + + /// + /// Set the dialogs start position when given. + /// Otherwise center the dialog on the current screen. + /// + /// The FlexibleMessageBox dialog. + /// The owner. + private static void SetDialogStartPosition(FlexibleMessageBoxForm flexibleMessageBoxForm, IWin32Window owner) + { + //If no owner given: Center on current screen + if (owner == null) + { + var screen = Screen.FromPoint(Cursor.Position); + flexibleMessageBoxForm.StartPosition = FormStartPosition.Manual; + flexibleMessageBoxForm.Left = screen.Bounds.Left + screen.Bounds.Width / 2 - flexibleMessageBoxForm.Width / 2; + flexibleMessageBoxForm.Top = screen.Bounds.Top + screen.Bounds.Height / 2 - flexibleMessageBoxForm.Height / 2; + } + } + + /// + /// Calculate the dialogs start size (Try to auto-size width to show longest text row). + /// Also set the maximum dialog size. + /// + /// The FlexibleMessageBox dialog. + /// The text (the longest text row is used to calculate the dialog width). + /// The caption (this can also affect the dialog width). + private static void SetDialogSizes(FlexibleMessageBoxForm flexibleMessageBoxForm, string text, string caption) + { + //First set the bounds for the maximum dialog size + flexibleMessageBoxForm.MaximumSize = new Size(Convert.ToInt32(SystemInformation.WorkingArea.Width * FlexibleMessageBoxForm.GetCorrectedWorkingAreaFactor(MAX_WIDTH_FACTOR)), + Convert.ToInt32(SystemInformation.WorkingArea.Height * FlexibleMessageBoxForm.GetCorrectedWorkingAreaFactor(MAX_HEIGHT_FACTOR))); + + //Get rows. Exit if there are no rows to render... + var stringRows = GetStringRows(text); + if (stringRows == null) return; + + //Calculate whole text height + var textHeight = TextRenderer.MeasureText(text, FONT).Height; + + //Calculate width for longest text line + const int SCROLLBAR_WIDTH_OFFSET = 15; + var longestTextRowWidth = stringRows.Max(textForRow => TextRenderer.MeasureText(textForRow, FONT).Width); + var captionWidth = TextRenderer.MeasureText(caption, SystemFonts.CaptionFont).Width; + var textWidth = Math.Max(longestTextRowWidth + SCROLLBAR_WIDTH_OFFSET, captionWidth); + + //Calculate margins + var marginWidth = flexibleMessageBoxForm.Width - flexibleMessageBoxForm.richTextBoxMessage.Width; + var marginHeight = flexibleMessageBoxForm.Height - flexibleMessageBoxForm.richTextBoxMessage.Height; + + //Set calculated dialog size (if the calculated values exceed the maximums, they were cut by windows forms automatically) + flexibleMessageBoxForm.Size = new Size(textWidth + marginWidth, + textHeight + marginHeight); + } + + /// + /// Set the dialogs icon. + /// When no icon is used: Correct placement and width of rich text box. + /// + /// The FlexibleMessageBox dialog. + /// The MessageBoxIcon. + private static void SetDialogIcon(FlexibleMessageBoxForm flexibleMessageBoxForm, MessageBoxIcon icon) + { + switch (icon) + { + case MessageBoxIcon.Information: + flexibleMessageBoxForm.pictureBoxForIcon.Image = SystemIcons.Information.ToBitmap(); + break; + case MessageBoxIcon.Warning: + flexibleMessageBoxForm.pictureBoxForIcon.Image = SystemIcons.Warning.ToBitmap(); + break; + case MessageBoxIcon.Error: + flexibleMessageBoxForm.pictureBoxForIcon.Image = SystemIcons.Error.ToBitmap(); + break; + case MessageBoxIcon.Question: + flexibleMessageBoxForm.pictureBoxForIcon.Image = SystemIcons.Question.ToBitmap(); + break; + default: + //When no icon is used: Correct placement and width of rich text box. + flexibleMessageBoxForm.pictureBoxForIcon.Visible = false; + flexibleMessageBoxForm.richTextBoxMessage.Left -= flexibleMessageBoxForm.pictureBoxForIcon.Width; + flexibleMessageBoxForm.richTextBoxMessage.Width += flexibleMessageBoxForm.pictureBoxForIcon.Width; + break; + } + } + + /// + /// Set dialog buttons visibilities and texts. + /// Also set a default button. + /// + /// The FlexibleMessageBox dialog. + /// The buttons. + /// The default button. + private static void SetDialogButtons(FlexibleMessageBoxForm flexibleMessageBoxForm, MessageBoxButtons buttons, MessageBoxDefaultButton defaultButton) + { + //Set the buttons visibilities and texts + switch (buttons) + { + case MessageBoxButtons.AbortRetryIgnore: + flexibleMessageBoxForm.visibleButtonsCount = 3; + + flexibleMessageBoxForm.button1.Visible = true; + flexibleMessageBoxForm.button1.Text = flexibleMessageBoxForm.GetButtonText(ButtonID.ABORT); + flexibleMessageBoxForm.button1.DialogResult = DialogResult.Abort; + + flexibleMessageBoxForm.button2.Visible = true; + flexibleMessageBoxForm.button2.Text = flexibleMessageBoxForm.GetButtonText(ButtonID.RETRY); + flexibleMessageBoxForm.button2.DialogResult = DialogResult.Retry; + + flexibleMessageBoxForm.button3.Visible = true; + flexibleMessageBoxForm.button3.Text = flexibleMessageBoxForm.GetButtonText(ButtonID.IGNORE); + flexibleMessageBoxForm.button3.DialogResult = DialogResult.Ignore; + + flexibleMessageBoxForm.ControlBox = false; + break; + + case MessageBoxButtons.OKCancel: + flexibleMessageBoxForm.visibleButtonsCount = 2; + + flexibleMessageBoxForm.button2.Visible = true; + flexibleMessageBoxForm.button2.Text = flexibleMessageBoxForm.GetButtonText(ButtonID.OK); + flexibleMessageBoxForm.button2.DialogResult = DialogResult.OK; + + flexibleMessageBoxForm.button3.Visible = true; + flexibleMessageBoxForm.button3.Text = flexibleMessageBoxForm.GetButtonText(ButtonID.CANCEL); + flexibleMessageBoxForm.button3.DialogResult = DialogResult.Cancel; + + flexibleMessageBoxForm.CancelButton = flexibleMessageBoxForm.button3; + break; + + case MessageBoxButtons.RetryCancel: + flexibleMessageBoxForm.visibleButtonsCount = 2; + + flexibleMessageBoxForm.button2.Visible = true; + flexibleMessageBoxForm.button2.Text = flexibleMessageBoxForm.GetButtonText(ButtonID.RETRY); + flexibleMessageBoxForm.button2.DialogResult = DialogResult.Retry; + + flexibleMessageBoxForm.button3.Visible = true; + flexibleMessageBoxForm.button3.Text = flexibleMessageBoxForm.GetButtonText(ButtonID.CANCEL); + flexibleMessageBoxForm.button3.DialogResult = DialogResult.Cancel; + + flexibleMessageBoxForm.CancelButton = flexibleMessageBoxForm.button3; + break; + + case MessageBoxButtons.YesNo: + flexibleMessageBoxForm.visibleButtonsCount = 2; + + flexibleMessageBoxForm.button2.Visible = true; + flexibleMessageBoxForm.button2.Text = flexibleMessageBoxForm.GetButtonText(ButtonID.YES); + flexibleMessageBoxForm.button2.DialogResult = DialogResult.Yes; + + flexibleMessageBoxForm.button3.Visible = true; + flexibleMessageBoxForm.button3.Text = flexibleMessageBoxForm.GetButtonText(ButtonID.NO); + flexibleMessageBoxForm.button3.DialogResult = DialogResult.No; + + flexibleMessageBoxForm.ControlBox = false; + break; + + case MessageBoxButtons.YesNoCancel: + flexibleMessageBoxForm.visibleButtonsCount = 3; + + flexibleMessageBoxForm.button1.Visible = true; + flexibleMessageBoxForm.button1.Text = flexibleMessageBoxForm.GetButtonText(ButtonID.YES); + flexibleMessageBoxForm.button1.DialogResult = DialogResult.Yes; + + flexibleMessageBoxForm.button2.Visible = true; + flexibleMessageBoxForm.button2.Text = flexibleMessageBoxForm.GetButtonText(ButtonID.NO); + flexibleMessageBoxForm.button2.DialogResult = DialogResult.No; + + flexibleMessageBoxForm.button3.Visible = true; + flexibleMessageBoxForm.button3.Text = flexibleMessageBoxForm.GetButtonText(ButtonID.CANCEL); + flexibleMessageBoxForm.button3.DialogResult = DialogResult.Cancel; + + flexibleMessageBoxForm.CancelButton = flexibleMessageBoxForm.button3; + break; + + case MessageBoxButtons.OK: + default: + flexibleMessageBoxForm.visibleButtonsCount = 1; + flexibleMessageBoxForm.button3.Visible = true; + flexibleMessageBoxForm.button3.Text = flexibleMessageBoxForm.GetButtonText(ButtonID.OK); + flexibleMessageBoxForm.button3.DialogResult = DialogResult.OK; + + flexibleMessageBoxForm.CancelButton = flexibleMessageBoxForm.button3; + break; + } + + //Set default button (used in FlexibleMessageBoxForm_Shown) + flexibleMessageBoxForm.defaultButton = defaultButton; + } + + #endregion + + #region Private event handlers + + /// + /// Handles the Shown event of the FlexibleMessageBoxForm control. + /// + /// The source of the event. + /// The instance containing the event data. + private void FlexibleMessageBoxForm_Shown(object sender, EventArgs e) + { + int buttonIndexToFocus = 1; + Button buttonToFocus; + + //Set the default button... + switch (this.defaultButton) + { + case MessageBoxDefaultButton.Button1: + default: + buttonIndexToFocus = 1; + break; + case MessageBoxDefaultButton.Button2: + buttonIndexToFocus = 2; + break; + case MessageBoxDefaultButton.Button3: + buttonIndexToFocus = 3; + break; + } + + if (buttonIndexToFocus > this.visibleButtonsCount) buttonIndexToFocus = this.visibleButtonsCount; + + if (buttonIndexToFocus == 3) + { + buttonToFocus = this.button3; + } + else if (buttonIndexToFocus == 2) + { + buttonToFocus = this.button2; + } + else + { + buttonToFocus = this.button1; + } + + buttonToFocus.Focus(); + } + + /// + /// Handles the LinkClicked event of the richTextBoxMessage control. + /// + /// The source of the event. + /// The instance containing the event data. + private void richTextBoxMessage_LinkClicked(object sender, LinkClickedEventArgs e) + { + try + { + Cursor.Current = Cursors.WaitCursor; + Process.Start(e.LinkText); + } + catch (Exception) + { + //Let the caller of FlexibleMessageBoxForm decide what to do with this exception... + throw; + } + finally + { + Cursor.Current = Cursors.Default; + } + + } + + /// + /// Handles the KeyUp event of the richTextBoxMessage control. + /// + /// The source of the event. + /// The instance containing the event data. + void FlexibleMessageBoxForm_KeyUp(object sender, KeyEventArgs e) + { + //Handle standard key strikes for clipboard copy: "Ctrl + C" and "Ctrl + Insert" + if (e.Control && (e.KeyCode == Keys.C || e.KeyCode == Keys.Insert)) + { + var buttonsTextLine = (this.button1.Visible ? this.button1.Text + STANDARD_MESSAGEBOX_SEPARATOR_SPACES : string.Empty) + + (this.button2.Visible ? this.button2.Text + STANDARD_MESSAGEBOX_SEPARATOR_SPACES : string.Empty) + + (this.button3.Visible ? this.button3.Text + STANDARD_MESSAGEBOX_SEPARATOR_SPACES : string.Empty); + + //Build same clipboard text like the standard .Net MessageBox + var textForClipboard = STANDARD_MESSAGEBOX_SEPARATOR_LINES + + this.Text + Environment.NewLine + + STANDARD_MESSAGEBOX_SEPARATOR_LINES + + this.richTextBoxMessage.Text + Environment.NewLine + + STANDARD_MESSAGEBOX_SEPARATOR_LINES + + buttonsTextLine.Replace("&", string.Empty) + Environment.NewLine + + STANDARD_MESSAGEBOX_SEPARATOR_LINES; + + //Set text in clipboard + Clipboard.SetText(textForClipboard); + } + } + + #endregion + + #region Properties (only used for binding) + + /// + /// The text that is been used for the heading. + /// + public string CaptionText { get; set; } + + /// + /// The text that is been used in the FlexibleMessageBoxForm. + /// + public string MessageText { get; set; } + + #endregion + + #region Public show function + + /// + /// Shows the specified message box. + /// + /// The owner. + /// The text. + /// The caption. + /// The buttons. + /// The icon. + /// The default button. + /// The dialog result. + public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton) + { + //Create a new instance of the FlexibleMessageBox form + var flexibleMessageBoxForm = new FlexibleMessageBoxForm(); + flexibleMessageBoxForm.ShowInTaskbar = false; + + //Bind the caption and the message text + flexibleMessageBoxForm.CaptionText = caption; + flexibleMessageBoxForm.MessageText = text; + flexibleMessageBoxForm.FlexibleMessageBoxFormBindingSource.DataSource = flexibleMessageBoxForm; + + //Set the buttons visibilities and texts. Also set a default button. + SetDialogButtons(flexibleMessageBoxForm, buttons, defaultButton); + + //Set the dialogs icon. When no icon is used: Correct placement and width of rich text box. + SetDialogIcon(flexibleMessageBoxForm, icon); + + //Set the font for all controls + flexibleMessageBoxForm.Font = FONT; + flexibleMessageBoxForm.richTextBoxMessage.Font = FONT; + + //Calculate the dialogs start size (Try to auto-size width to show longest text row). Also set the maximum dialog size. + SetDialogSizes(flexibleMessageBoxForm, text, caption); + + //Set the dialogs start position when given. Otherwise center the dialog on the current screen. + SetDialogStartPosition(flexibleMessageBoxForm, owner); + + //Show the dialog + return flexibleMessageBoxForm.ShowDialog(owner); + } + + #endregion + } //class FlexibleMessageBoxForm + + #endregion + } +} diff --git a/BrawlBuilder/Properties/AssemblyInfo.cs b/BrawlBuilder/Properties/AssemblyInfo.cs index 6dfa7bf..0447188 100644 --- a/BrawlBuilder/Properties/AssemblyInfo.cs +++ b/BrawlBuilder/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyVersion("1.1.0.0")] +[assembly: AssemblyFileVersion("1.1.0.0")] diff --git a/Other/readme.txt b/Other/readme.txt index 0f4139f..afcfb99 100644 --- a/Other/readme.txt +++ b/Other/readme.txt @@ -1,5 +1,5 @@ ------------------------------------/ -------- BRAWLBUILDER v1.0 -------/ +------- BRAWLBUILDER v1.1 -------/ ------------------------------/ "The Ultimate Super Smash Bros Brawl ISO Builder" @@ -31,6 +31,10 @@ There are a couple command line arguments if you want to use them, I will probab '--show-wit' This will show the wit command line windows rather than hiding them and displaying the progress in the UI. +'--show-wit-debug' +This will do the same thing as --show-wit, but it will keep the wit windows open once wit closes, allowing you to +read the output and figure out what is going wrong. + '--no-gct-patch' This will disable patching of the GCT based on the CodePatches.txt file in the Resources folder. Use of this option is not recommended. @@ -77,6 +81,23 @@ into the same directory as the exe file, or else nothing will work. This should if it doesn't, just copy it manually. +--------------------/ +------ Changelog --/ +------------------/ + +1.1: + - Improve error messages, most of them should now actually be somewhat helpful + - Fix "Build Completed" sometimes appearing even if the build did not complete properly + - Add the --show-wit-debug option to show wit windows and keep them open after wit finishes, in order to figure + out what is going wrong + - Modify the help text for the Brawl ISO to clarify how the ssbb.d folder works + - Fix crash if building with no GCT selected + - Other code cleanup and misc. fixes + +1.0: + - Initial release + + ------------------/ ------ Credits --/ ----------------/ @@ -89,5 +110,7 @@ if it doesn't, just copy it manually. - The folder select dialog uses Ookii dialogs, a great little library for nice looking dialogs. +- Detailed wit error messages make use of FlexibleMessageBox by JReichert + - And thanks to the creators of all the ISO builder scripts for Project M and the like, they are what I initially based this off of. diff --git a/README.md b/README.md index 4a99d0d..a353b8e 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,9 @@ Hopefully compatibility will be improved in the future. `--show-wit` This will show the wit command line windows rather than hiding them and displaying the progress in the UI. +`--show-wit-debug` +This will do the same thing as `--show-wit`, but it will keep the wit windows open once wit closes, allowing you to read the output and figure out what is going wrong. + `--no-gct-patch` This will disable patching of the GCT based on the CodePatches.txt file in the Resources folder. Use of this option is not recommended. @@ -35,4 +38,5 @@ This will change the offset that the GCT is applied at (by default 80570000) to - First of all, thanks to Wiimm for his amazing wit tool, which is used to extract, patch, and build the game images. - Secondly, thanks to the Dolphin team for the awesome debug mode of Dolphin, I wouldn't have been able to get alternate stages and the replacement soundbank engine working without that. - The folder select dialog uses Ookii dialogs, a great little library for nice looking dialogs. +- Detailed wit error messages make use of FlexibleMessageBox by JReichert - And thanks to the creators of all the ISO builder scripts for Project M and the like, they are what I initially based this off of. \ No newline at end of file diff --git a/Resources/wit/cyggcc_s-1.dll b/Resources/wit/cyggcc_s-1.dll new file mode 100644 index 0000000000000000000000000000000000000000..d2a2a3164024e34ed9f8d25a895e46b107b85ea1 GIT binary patch literal 109597 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 literal 0 HcmV?d00001 diff --git a/Resources/wit/cygz.dll b/Resources/wit/cygz.dll new file mode 100644 index 0000000000000000000000000000000000000000..b338dc701af109534e92b21180ca19acff06ec70 GIT binary patch literal 84519 zcmdpfdwf*Ywf~&V0E3R4K}H>Flu*YuBhe+0c$Qb)=V#_B29#?D~yq^B=cZ%&@ zJ`XCk+|%EE!u(8Ti{gA`_Cx7yMkY`Rwz&piibL}4~JV44xeqPttGu(d)E=`5&dfPH|VB*Q6b-z z`y47>3Wrb3eLKBPpZm7_kf!K9E6xuP9o)Eg~Ud^&yoDvA8od0?pi%& zwdnP4RDZigY&x>9cfWeuHfHy4eP)QIURF}^2l*g8K3UyZ)XS1Xcg_j|ob zx3gG zRsAvQ@+q&WU9~5blVX)G9~g8fhwP<3Wv6|W$2uSyl;La zUmYTa@U9>4{sGLpL@!bwDm&G#n~wq0Zt*B7q;@Skiso_^ zHgiHbr0i5S#S2PM{m00hr@T)hfAb{LK9cwwX%a~Jm?Q#$fO;qXT=+YMG|EY{CVM$Z zR1OlAqfk--!%nRyX(oX*de~Pi$I6h_qoCtTLJZ+qJ(5Ru#LGv&ul-F8UmC9;qY%4i z85vK@VV*qlCf|=F?VH0lAZ(U|MhOV}GPIGtwWN~zA%}4ta(PgX6Jyb(H~QSM z7uv@Gn@;ll0^^Po>GXQQoLPnjCD?sIX!7|(tBXgqZ>JFd>frjW;rd}L_F)scL$5YnY5?9?{YV)XZSBA

^3JR3Jw4_3!c8dN@M9Y41`Hm7-cV(SSBx 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 Gw82CW75nk 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"c?du#wVKrYuKN4sWNE(Aj7rs2H-QXfq`o- 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