Exemple #1
0
    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());
    }
Exemple #2
0
    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());
    }