public void PopulateMenu(ProjectItemBase item)
        {
            if (item == null)
            {
                return;
            }

            MenuItems.Clear();
            MenuItemBase parentMenuItem = null;

            foreach (var command in item.OptionCommands)
            {
                MenuItemBase newMenuItem = null;

                // fake command definition
                if (command.CommandDefinition is FakeCommandDefinition)
                {
                    // reset parent
                    if (string.IsNullOrEmpty(command.CommandDefinition.Name))
                    {
                        parentMenuItem = null;
                    }
                    // fake to add separator
                    else if (command.CommandDefinition.Name == "|")
                    {
                        newMenuItem = new MenuItemSeparator();
                    }
                    // fake to set parent
                    else if (command.CommandDefinition.Name.Contains('|'))
                    {
                        // extract ancestors
                        var parentNames = command.CommandDefinition.Name.Trim().Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);

                        // reset parent
                        if (parentNames.Length == 0)
                        {
                            parentMenuItem = null;
                        }
                        // find parent
                        else
                        {
                            parentMenuItem = MenuItems.OfType <StandardMenuItem>().FirstOrDefault(p => p.Text == parentNames[0]);
                            if (parentMenuItem == null)
                            {
                                parentMenuItem = new DisplayMenuItem(parentNames[0]);
                                MenuItems.Add(parentMenuItem);
                            }

                            for (var i = 1; i < parentNames.Length; i++)
                            {
                                var nextMenuItem = parentMenuItem.Children.OfType <StandardMenuItem>().FirstOrDefault(p => p.Text == parentNames[i]);
                                if (nextMenuItem == null)
                                {
                                    nextMenuItem = new DisplayMenuItem(parentNames[i]);
                                    parentMenuItem.Children.Add(nextMenuItem);
                                }
                                parentMenuItem = nextMenuItem;
                            }
                        }
                    }
                }
                else
                {
                    newMenuItem = new Idealde.Modules.MainMenu.Models.CommandMenuItem(command);
                    command.Tag = item;
                }

                if (newMenuItem == null)
                {
                    continue;
                }

                if (parentMenuItem != null)
                {
                    parentMenuItem.Children.Add(newMenuItem);
                }
                else
                {
                    MenuItems.Add(newMenuItem);
                }
            }
        }
        private void BuildMenu()
        {
            //< File menu
            var fileMenu = new Menu("File", Resources.FileMenuText);

            MainMenu.AddMenu(fileMenu);

            var fileNewMenu    = new DisplayMenuItem("File.New", Resources.FileNewMenuText);
            var fileOpenMenu   = new DisplayMenuItem("File.Open", Resources.FileOpenMenuText);
            var fileCloseMenu  = new CommandMenuItem <CloseFileCommandDefinition>("File.Close");
            var fileSaveMenu   = new CommandMenuItem <SaveFileCommandDefinition>("File.Save");
            var fileSaveAsMenu = new CommandMenuItem <SaveFileAsCommandDefinition>("File.SaveAs");
            var fileExitMenu   = new CommandMenuItem <ExitCommandDefinition>("File.Exit");

            MainMenu.AddMenuItem(fileMenu,
                                 fileNewMenu, fileOpenMenu,
                                 new MenuItemSeparator("File.S1"),
                                 fileCloseMenu,
                                 new MenuItemSeparator("File.S2"),
                                 fileSaveMenu, fileSaveAsMenu,
                                 new MenuItemSeparator("File.S3"),
                                 fileExitMenu);

            //< File.New menu
            var fileNewCppProjectMenu = new CommandMenuItem <NewCppProjectCommandDefinition>("File.New.CppProject");
            var fileNewCppHeaderMenu  = new CommandMenuItem <NewCppHeaderCommandDefinition>("File.New.CppHeader");
            var fileNewCppSourceMenu  = new CommandMenuItem <NewCppSourceCommandDefinition>("File.New.CppSource");

            MainMenu.AddMenuItem(fileNewMenu,
                                 fileNewCppProjectMenu,
                                 new MenuItemSeparator("File.New.S1"),
                                 fileNewCppHeaderMenu,
                                 fileNewCppSourceMenu);
            //> File.New menu

            //< File.Open menu
            var fileOpenProjectMenu = new CommandMenuItem <OpenProjectCommandDefinition>("File.Open.Project");
            var fileOpenFileMenu    = new CommandMenuItem <OpenFileCommandDefinition>("File.Open.File");

            MainMenu.AddMenuItem(fileOpenMenu, fileOpenFileMenu, fileOpenProjectMenu);
            //> File.Open menu

            //> File menu

            //< Edit menu
            var editMenu = new Menu("Edit", Resources.EditMenuText);

            MainMenu.AddMenu(editMenu);

            var editUndoMenu           = new CommandMenuItem <UndoCommandDefinition>("Edit.Undo");
            var editRedoMenu           = new CommandMenuItem <RedoCommandDefinition>("Edit.Redo");
            var editCutMenu            = new DisplayMenuItem("Edit.Cut", Resources.EditCutCommandText);
            var editCopyMenu           = new DisplayMenuItem("Edit.Copy", Resources.EditCopyCommandText);
            var editPasteMenu          = new DisplayMenuItem("Edit.Paste", Resources.EditPasteCommandText);
            var editSelectAllMenu      = new DisplayMenuItem("Edit.SelectAll", Resources.EditSelectAllCommandText);
            var editGotoMenu           = new DisplayMenuItem("Edit.Goto", Resources.EditGotoCommadText);
            var editFindAndReplaceMenu = new DisplayMenuItem("Edit.FindAndReplace",
                                                             Resources.EditFindAndReplaceCommandText);

            MainMenu.AddMenuItem(editMenu,
                                 editUndoMenu,
                                 editRedoMenu,
                                 new MenuItemSeparator("Edit.S1"),
                                 editCutMenu,
                                 editCopyMenu,
                                 editPasteMenu,
                                 new MenuItemSeparator("Edit.S2"),
                                 editSelectAllMenu,
                                 new MenuItemSeparator("Edit.S3"),
                                 editGotoMenu,
                                 editFindAndReplaceMenu);
            //> Edit menu

            //< View menu
            var viewMenu = new Menu("View", Resources.ViewMenuText);

            MainMenu.AddMenu(viewMenu);

            var viewProjectExplorer = new CommandMenuItem <ViewProjectExplorerCommandDefinition>("View.ProjectExplorer");
            var viewOutputMenu      = new CommandMenuItem <ViewOutputCommandDefinition>("View.Output");
            var viewErrorListMenu   =
                new CommandMenuItem <ViewErrorListCommandDefinition>("View.ErrorList");

            MainMenu.AddMenuItem(viewMenu, viewProjectExplorer, viewOutputMenu, viewErrorListMenu);
            //> View menu

            //< Run menu
            var runMenu = new Menu("Run", Resources.RunMenuText);

            MainMenu.AddMenu(runMenu);

            var runCompileSingleFileMenu =
                new CommandMenuItem <CompileSingleFileCommandDefinition>("Run.CompileSingleFile");
            var runRunSingleFileMenu =
                new CommandMenuItem <RunSingleFileCommandDefinition>("Run.RunSingleFile");
            var runCompileAndRunSingleFileMenu =
                new CommandMenuItem <CompileAndRunSingleFileCommandDefinition>("Run.CompileAndRunSingleFile");
            var runCompileProjectMenu = new CommandMenuItem <CompileProjectCommandDefinition>("Run.CompileProject");
            var runRunProjectMenu     = new CommandMenuItem <RunProjectCommandDefinition>("Run.RunProject");

            MainMenu.AddMenuItem(runMenu,
                                 runCompileSingleFileMenu,
                                 runRunSingleFileMenu,
                                 runCompileAndRunSingleFileMenu,
                                 new MenuItemSeparator("Run.S1"),
                                 runCompileProjectMenu,
                                 runRunProjectMenu);
            //> Run menu

            //< Tools menu
            var toolsMenu = new Menu("Tool", Resources.ToolsMenuText);

            MainMenu.AddMenu(toolsMenu);

            var toolsSettingsMenu = new CommandMenuItem <OpenSettingsCommandDefinition>("Tool.Settings");

            MainMenu.AddMenuItem(toolsMenu, toolsSettingsMenu);
            //> Tools menu
        }