internal static ToolStripItem[] BuildMenuFrom(string configDir, string invokeArguments) { var menus = new List <ToolStripItem>(); var dirsToProcess = new Queue <BuildItem>(); dirsToProcess.Enqueue(new BuildItem { AddItem = menus.Add, dir = configDir }); while (dirsToProcess.Any()) { BuildItem current = dirsToProcess.Dequeue(); if (!Directory.Exists(current.dir)) { continue; } var items = Directory.GetFiles(current.dir) .Concat(Directory.GetDirectories(current.dir)) .OrderBy(Path.GetFileName); foreach (var item in items) { if (item.IsDir()) { var parentMenu = new ToolStripMenuItem { Text = item.ToDirMenuText(), Image = LookupImageFor(item) }; current.AddItem(parentMenu); dirsToProcess.Enqueue(new BuildItem { AddItem = x => parentMenu.DropDownItems.Add(x), dir = item }); } else { if (item.EndsWithAny(".separator")) { current.AddItem(new ToolStripSeparator()); } else if (item.EndsWithAny(".cmd", ".bat")) { var menu = new ToolStripMenuItem { Text = item.ToFileMenuText(), Image = LookupImageFor(item) }; menu.Click += (s, e) => { bool showConsole = item.EndsWithAny(".c.cmd", ".c.bat"); try { var p = new Process(); if (showConsole) { p.StartInfo.FileName = item; p.StartInfo.Arguments = invokeArguments; // code below works very well and produces less noise // though it unconditionally waits. Thus an orthodox execution as // above is adequate particularly because it lets user to pose (with 'pause') // in the batch file or path through to the exit. // p.StartInfo.FileName = "cmd.exe"; // p.StartInfo.Arguments = $"/K \"\"{item}\" {invokeArguments}"; } else { p.StartInfo.FileName = item; p.StartInfo.Arguments = invokeArguments; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.CreateNoWindow = true; } p.Start(); } catch (Exception ex) { MessageBox.Show($"Error: {ex}", App.Name); }; }; current.AddItem(menu); } } } } return(menus.ToArray()); }
internal static ToolStripItem[] BuildMenuFrom(string configDir, string invokeArguments) { var menus = new List <ToolStripItem>(); var dirsToProcess = new Queue <BuildItem>(); dirsToProcess.Enqueue(new BuildItem { AddItem = menus.Add, dir = configDir }); while (dirsToProcess.Any()) { BuildItem current = dirsToProcess.Dequeue(); if (!Directory.Exists(current.dir)) { continue; } var items = Directory.GetFiles(current.dir) .Concat(Directory.GetDirectories(current.dir)) .OrderBy(Path.GetFileName); foreach (var item in items) { if (item.IsDir()) { var parentMenu = new ToolStripMenuItem { Text = item.ToDirMenuText(), Image = LookupImageFor(item) }; current.AddItem(parentMenu); dirsToProcess.Enqueue(new BuildItem { AddItem = x => parentMenu.DropDownItems.Add(x), dir = item }); } else { if (item.EndsWithAny(".separator")) { current.AddItem(new ToolStripSeparator()); } else if (item.EndsWithAny(".cmd", ".bat", ".ps1")) { var menu = new ToolStripMenuItem { Text = item.ToFileMenuText(), Image = LookupImageFor(item) }; try { menu.Image = menu.Image?.Resize(menu.ContentRectangle.Height, menu.ContentRectangle.Height); } catch { } menu.Click += (s, e) => { Execute(item, invokeArguments); }; current.AddItem(menu); } } } } return(menus.ToArray()); }