/// <summary>
        /// Helper to make a separator menu item.
        /// </summary>
        /// <returns>A MenuItem that is a separator MenuItem.</returns>
        private static MenuItem MakeSeparatorMenuItem(MenuType menuType)
        {
            //	Instantiate the separator menu item.
            MenuItem separatorMenuItem = new OwnerDrawMenuItem(menuType);

            separatorMenuItem.Text = SEPARATOR_TEXT;
            return(separatorMenuItem);
        }
        /// <summary>
        /// Creates and returns a set of menu items from the child merge menu entries in this merge
        /// menu entry.
        /// </summary>
        /// <param name="mainMenu">The level at which the MenuItems will appear.</param>
        /// <returns>Array of menu items.</returns>
        public MenuItem[] CreateMenuItems(bool mainMenu)
        {
            //	If this merge menu entry has no child merge menu entries, return null.
            if (childMergeMenuEntries.Count == 0)
            {
                return(null);
            }

            //	Construct an array list to hold the menu items being created.
            ArrayList menuItemArrayList = new ArrayList();

            //	Enumerate the child merge menu entries of this merge menu entry.
            foreach (MergeMenuEntry mergeMenuEntry in childMergeMenuEntries.Values)
            {
                //	Get the text of the merge menu entry.
                string text = mergeMenuEntry.Text;

                //	Create the menu item for this child merge menu entry.
                MenuItem menuItem;
                if (mainMenu)
                {
                    menuItem = new OwnerDrawMenuItem();
                }
                else
                {
                    //	If the text of the merge menu entry specifies that a separator menu item
                    //	should appear before it, insert a separator menu item.
                    if (text.StartsWith(SEPARATOR_TEXT))
                    {
                        //	Strip off the SEPARATOR_TEXT.
                        text = text.Substring(1);

                        //	Instantiate the separator menu item.
                        MenuItem separatorMenuItem = new OwnerDrawMenuItem();
                        separatorMenuItem.Text = SEPARATOR_TEXT;

                        //	Add the separator menu item to the array of menu items being returned.
                        menuItemArrayList.Add(separatorMenuItem);
                    }

                    //	Instantiate the menu item.
                    if (mergeMenuEntry.Command == null)
                    {
                        menuItem = new OwnerDrawMenuItem();
                    }
                    else
                    {
                        menuItem = new CommandOwnerDrawMenuItem(mergeMenuEntry.Command);
                    }
                }

                //	Set the menu item text.
                menuItem.Text = text;

                //	If this child merge menu entry has any child merge menu entries, recursively
                //	create their menu items.
                MenuItem[] childMenuItems = mergeMenuEntry.CreateMenuItems(false);
                if (childMenuItems != null)
                {
                    menuItem.MenuItems.AddRange(childMenuItems);
                }

                //	Add the menu item to the array of menu items being returned.
                menuItemArrayList.Add(menuItem);
            }

            //	Done.  Convert the array list into a MenuItem array and return it.
            return((MenuItem[])menuItemArrayList.ToArray(typeof(MenuItem)));
        }
        /// <summary>
        /// Creates and returns a set of menu items from the child merge menu entries in this merge
        /// menu entry.
        /// </summary>
        /// <param name="mainMenu">The level at which the MenuItems will appear.</param>
        /// <returns>Array of menu items.</returns>
        public MenuItem[] CreateMenuItems()
        {
            //	If this merge menu entry has no child merge menu entries, return null.
            if (childMergeMenuEntries.Count == 0)
            {
                return(null);
            }

            //	Construct an array list to hold the menu items being created.
            ArrayList menuItemArrayList = new ArrayList();

            //	Enumerate the child merge menu entries of this merge menu entry.
            foreach (MenuBuilderEntry mergeMenuEntry in childMergeMenuEntries.Values)
            {
                //	Get the text of the merge menu entry.
                string text = mergeMenuEntry.Text;

                //	Create the menu item for this child merge menu entry.
                MenuItem menuItem;
                bool     separatorBefore, separatorAfter;
                if (menuBuilder.MenuType == MenuType.Main && mergeMenuEntry.level == 0)
                {
                    //	Level zero of a main menu.
                    menuItem        = new OwnerDrawMenuItem(menuBuilder.MenuType);
                    separatorBefore = separatorAfter = false;
                }
                else
                {
                    //	Determine whether a separator before and a separator after the menu item
                    //	should be inserted.
                    separatorBefore = text.StartsWith(SEPARATOR_TEXT);
                    separatorAfter  = text.EndsWith(SEPARATOR_TEXT);
                    if (separatorBefore || separatorAfter)
                    {
                        text = text.Replace(SEPARATOR_TEXT, string.Empty);
                    }

                    //	Instantiate the menu item.
                    if (mergeMenuEntry.Command == null)
                    {
                        menuItem = new OwnerDrawMenuItem(menuBuilder.MenuType);
                    }
                    else
                    {
                        menuItem = new CommandOwnerDrawMenuItem(menuBuilder.MenuType, mergeMenuEntry.Command);
                    }
                }

                //	Set the menu item text.
                menuItem.Text = text;

                //	If this child merge menu entry has any child merge menu entries, recursively
                //	create their menu items.
                MenuItem[] childMenuItems = mergeMenuEntry.CreateMenuItems();
                if (childMenuItems != null)
                {
                    menuItem.MenuItems.AddRange(childMenuItems);
                }

                //	Add the separator menu item, as needed.
                if (separatorBefore)
                {
                    menuItemArrayList.Add(MakeSeparatorMenuItem(menuBuilder.MenuType));
                }

                //	Add the menu item to the array of menu items being returned.
                menuItemArrayList.Add(menuItem);

                //	Add the separator menu item, as needed.
                if (separatorAfter)
                {
                    menuItemArrayList.Add(MakeSeparatorMenuItem(menuBuilder.MenuType));
                }
            }

            //	Done.  Convert the array list into a MenuItem array and return it.
            return((MenuItem[])menuItemArrayList.ToArray(typeof(MenuItem)));
        }
 /// <summary>
 /// Helper to make a separator menu item.
 /// </summary>
 /// <returns>A MenuItem that is a separator MenuItem.</returns>
 private static MenuItem MakeSeparatorMenuItem(MenuType menuType)
 {
     //	Instantiate the separator menu item.
     MenuItem separatorMenuItem = new OwnerDrawMenuItem(menuType);
     separatorMenuItem.Text = SEPARATOR_TEXT;
     return separatorMenuItem;
 }
        /// <summary>
        /// Creates and returns a set of menu items from the child merge menu entries in this merge
        /// menu entry.
        /// </summary>
        /// <param name="mainMenu">The level at which the MenuItems will appear.</param>
        /// <returns>Array of menu items.</returns>
        public MenuItem[] CreateMenuItems()
        {
            //	If this merge menu entry has no child merge menu entries, return null.
            if (childMergeMenuEntries.Count == 0)
                return null;

            //	Construct an array list to hold the menu items being created.
            ArrayList menuItemArrayList = new ArrayList();

            //	Enumerate the child merge menu entries of this merge menu entry.
            foreach (MenuBuilderEntry mergeMenuEntry in childMergeMenuEntries.Values)
            {
                //	Get the text of the merge menu entry.
                string text = mergeMenuEntry.Text;

                //	Create the menu item for this child merge menu entry.
                MenuItem menuItem;
                bool separatorBefore, separatorAfter;
                if (menuBuilder.MenuType == MenuType.Main && mergeMenuEntry.level == 0)
                {
                    //	Level zero of a main menu.
                    menuItem = new OwnerDrawMenuItem(menuBuilder.MenuType);
                    separatorBefore = separatorAfter = false;
                }
                else
                {
                    //	Determine whether a separator before and a separator after the menu item
                    //	should be inserted.
                    separatorBefore = text.StartsWith(SEPARATOR_TEXT);
                    separatorAfter = text.EndsWith(SEPARATOR_TEXT);
                    if (separatorBefore || separatorAfter)
                        text = text.Replace(SEPARATOR_TEXT, string.Empty);

                    //	Instantiate the menu item.
                    if (mergeMenuEntry.Command == null)
                        menuItem = new OwnerDrawMenuItem(menuBuilder.MenuType);
                    else
                        menuItem = new CommandOwnerDrawMenuItem(menuBuilder.MenuType, mergeMenuEntry.Command);
                }

                //	Set the menu item text.
                menuItem.Text = text;

                //	If this child merge menu entry has any child merge menu entries, recursively
                //	create their menu items.
                MenuItem[] childMenuItems = mergeMenuEntry.CreateMenuItems();
                if (childMenuItems != null)
                    menuItem.MenuItems.AddRange(childMenuItems);

                //	Add the separator menu item, as needed.
                if (separatorBefore)
                    menuItemArrayList.Add(MakeSeparatorMenuItem(menuBuilder.MenuType));

                //	Add the menu item to the array of menu items being returned.
                menuItemArrayList.Add(menuItem);

                //	Add the separator menu item, as needed.
                if (separatorAfter)
                    menuItemArrayList.Add(MakeSeparatorMenuItem(menuBuilder.MenuType));
            }

            //	Done.  Convert the array list into a MenuItem array and return it.
            return (MenuItem[])menuItemArrayList.ToArray(typeof(MenuItem));
        }
        /// <summary>
        /// Creates and returns a set of menu items from the child merge menu entries in this merge
        /// menu entry.
        /// </summary>
        /// <param name="mainMenu">The level at which the MenuItems will appear.</param>
        /// <returns>Array of menu items.</returns>
        public MenuItem[] CreateMenuItems(bool mainMenu)
        {
            //	If this merge menu entry has no child merge menu entries, return null.
            if (childMergeMenuEntries.Count == 0)
                return null;

            //	Construct an array list to hold the menu items being created.
            ArrayList menuItemArrayList = new ArrayList();

            //	Enumerate the child merge menu entries of this merge menu entry.
            foreach (MergeMenuEntry mergeMenuEntry in childMergeMenuEntries.Values)
            {
                //	Get the text of the merge menu entry.
                string text = mergeMenuEntry.Text;

                //	Create the menu item for this child merge menu entry.
                MenuItem menuItem;
                if (mainMenu)
                    menuItem = new OwnerDrawMenuItem();
                else
                {
                    //	If the text of the merge menu entry specifies that a separator menu item
                    //	should appear before it, insert a separator menu item.
                    if (text.StartsWith(SEPARATOR_TEXT))
                    {
                        //	Strip off the SEPARATOR_TEXT.
                        text = text.Substring(1);

                        //	Instantiate the separator menu item.
                        MenuItem separatorMenuItem = new OwnerDrawMenuItem();
                        separatorMenuItem.Text = SEPARATOR_TEXT;

                        //	Add the separator menu item to the array of menu items being returned.
                        menuItemArrayList.Add(separatorMenuItem);
                    }

                    //	Instantiate the menu item.
                    if (mergeMenuEntry.Command == null)
                        menuItem = new OwnerDrawMenuItem();
                    else
                        menuItem = new CommandOwnerDrawMenuItem(mergeMenuEntry.Command);
                }

                //	Set the menu item text.
                menuItem.Text = text;

                //	If this child merge menu entry has any child merge menu entries, recursively
                //	create their menu items.
                MenuItem[] childMenuItems = mergeMenuEntry.CreateMenuItems(false);
                if (childMenuItems != null)
                    menuItem.MenuItems.AddRange(childMenuItems);

                //	Add the menu item to the array of menu items being returned.
                menuItemArrayList.Add(menuItem);
            }

            //	Done.  Convert the array list into a MenuItem array and return it.
            return (MenuItem[])menuItemArrayList.ToArray(typeof(MenuItem));
        }