int CGitExtensionsShellEx::PopulateMenu(HMENU hMenu, int id, bool isSubMenu)
{
    CString szShellVisibleMenuItems = GetRegistryValue(HKEY_CURRENT_USER, "SOFTWARE\\GitExtensions\\GitExtensions", "ShellVisibleMenuItems");

    // preset values, if not used
    AddFilesId = -1;
    ApplyPatchId = -1;
    BrowseId = -1;
    CreateBranchId = -1;
    CheckoutBranchId = -1;
    CheckoutRevisionId = -1;
    CloneId = -1;
    CommitId = -1;
    FileHistoryId = -1;
    PullId = -1;
    PushId = -1;
    SettingsId = -1;
    ViewDiffId = -1;
    ResetFileChangesId = -1;

    int pos = 0;

    if (isSubMenu)
    {
        if (IsMenuItemVisible(szShellVisibleMenuItems, 0))
            AddMenuItem(hMenu, "Add files", ++id, AddFilesId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 1))
            AddMenuItem(hMenu, "Apply patch", ++id, ApplyPatchId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 2))
            AddMenuItem(hMenu, "Browse", ++id, BrowseId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 3))
            AddMenuItem(hMenu, "Create branch", ++id, CreateBranchId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 4))
            AddMenuItem(hMenu, "Checkout branch", ++id, CheckoutBranchId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 5))
            AddMenuItem(hMenu, "Checkout revision", ++id, CheckoutRevisionId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 6))
            AddMenuItem(hMenu, "Clone", ++id, CloneId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 7))
            AddMenuItem(hMenu, "Commit", ++id, CommitId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 8))
            AddMenuItem(hMenu, "File history", ++id, FileHistoryId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 9))
            AddMenuItem(hMenu, "Reset file changes", ++id, ResetFileChangesId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 10))
            AddMenuItem(hMenu, "Pull", ++id, PullId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 11))
            AddMenuItem(hMenu, "Push", ++id, PushId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 12))
            AddMenuItem(hMenu, "Settings", ++id, SettingsId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 13))
            AddMenuItem(hMenu, "View diff", ++id, ViewDiffId=pos++);
    }

    else
    {
        if (IsMenuItemVisible(szShellVisibleMenuItems, 0))
            AddMenuItem(hMenu, "GitExtensions Add files", ++id, AddFilesId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 1))
            AddMenuItem(hMenu, "GitExtensions Apply patch", ++id, ApplyPatchId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 2))
            AddMenuItem(hMenu, "GitExtensions Browse", ++id, BrowseId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 3))
            AddMenuItem(hMenu, "GitExtensions Create branch", ++id, CreateBranchId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 4))
            AddMenuItem(hMenu, "GitExtensions Checkout branch", ++id, CheckoutBranchId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 5))
            AddMenuItem(hMenu, "GitExtensions Checkout revision", ++id, CheckoutRevisionId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 6))
            AddMenuItem(hMenu, "GitExtensions Clone", ++id, CloneId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 7))
            AddMenuItem(hMenu, "GitExtensions Commit", ++id, CommitId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 8))
            AddMenuItem(hMenu, "GitExtensions File history", ++id, FileHistoryId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 9))
            AddMenuItem(hMenu, "GitExtensions Reset file changes", ++id, ResetFileChangesId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 10))
            AddMenuItem(hMenu, "GitExtensions Pull", ++id, PullId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 11))
            AddMenuItem(hMenu, "GitExtensions Push", ++id, PushId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 12))
            AddMenuItem(hMenu, "GitExtensions Settings", ++id, SettingsId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 13))
            AddMenuItem(hMenu, "GitExtensions View diff", ++id, ViewDiffId=pos++);
    }

    ++id;
    return id;
}
int CGitExtensionsShellEx::PopulateMenu(HMENU hMenu, int firstId, int id, bool isSubMenu)
{
    CString szShellVisibleMenuItems = GetRegistryValue(HKEY_CURRENT_USER, "SOFTWARE\\GitExtensions\\GitExtensions", "ShellVisibleMenuItems");

    // preset values, if not used
    AddFilesId = -1;
    ApplyPatchId = -1;
    BrowseId = -1;
    CreateBranchId = -1;
    CheckoutBranchId = -1;
    CheckoutRevisionId = -1;
    CloneId = -1;
    CommitId = -1;
    FileHistoryId = -1;
    PullId = -1;
    PushId = -1;
    SettingsId = -1;
    ViewDiffId = -1;
    ResetFileChangesId = -1;

    int pos = 0;

    if (isSubMenu)
    {
        if (IsMenuItemVisible(szShellVisibleMenuItems, 0))
            AddMenuItem(hMenu, "Add files", IDI_ICONADDED, firstId, ++id, AddFilesId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 1))
            AddMenuItem(hMenu, "Apply patch", 0, firstId, ++id, ApplyPatchId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 2))
            AddMenuItem(hMenu, "Browse", IDI_ICONBROWSEFILEEXPLORER, firstId, ++id, BrowseId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 3))
            AddMenuItem(hMenu, "Create branch", IDI_ICONBRANCHCREATE, firstId, ++id, CreateBranchId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 4))
            AddMenuItem(hMenu, "Checkout branch", IDI_ICONBRANCHCHECKOUT, firstId, ++id, CheckoutBranchId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 5))
            AddMenuItem(hMenu, "Checkout revision", IDI_ICONREVISIONCHECKOUT, firstId, ++id, CheckoutRevisionId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 6))
            AddMenuItem(hMenu, "Clone", IDI_ICONCLONEREPOGIT, firstId, ++id, CloneId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 7))
            AddMenuItem(hMenu, "Commit", IDI_ICONCOMMIT, firstId, ++id, CommitId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 8))
            AddMenuItem(hMenu, "File history", IDI_ICONFILEHISTORY, firstId, ++id, FileHistoryId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 9))
            AddMenuItem(hMenu, "Reset file changes", IDI_ICONTRESETFILETO, firstId, ++id, ResetFileChangesId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 10))
            AddMenuItem(hMenu, "Pull", IDI_ICONPULL, firstId, ++id, PullId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 11))
            AddMenuItem(hMenu, "Push", IDI_ICONPUSH, firstId, ++id, PushId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 12))
            AddMenuItem(hMenu, "Settings", IDI_ICONSETTINGS, firstId, ++id, SettingsId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 13))
            AddMenuItem(hMenu, "View diff", IDI_ICONDIFF, firstId, ++id, ViewDiffId=pos++);
    }
    else
    {
        if (IsMenuItemVisible(szShellVisibleMenuItems, 0))
            AddMenuItem(hMenu, "GitEx Add files", IDI_ICONADDED, firstId, ++id, AddFilesId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 1))
            AddMenuItem(hMenu, "GitEx Apply patch", 0, firstId, ++id, ApplyPatchId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 2))
            AddMenuItem(hMenu, "GitEx Browse", IDI_ICONBROWSEFILEEXPLORER, firstId, ++id, BrowseId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 3))
            AddMenuItem(hMenu, "GitEx Create branch", IDI_ICONBRANCHCREATE, firstId, ++id, CreateBranchId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 4))
            AddMenuItem(hMenu, "GitEx Checkout branch", IDI_ICONBRANCHCHECKOUT, firstId, ++id, CheckoutBranchId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 5))
            AddMenuItem(hMenu, "GitEx Checkout revision", IDI_ICONREVISIONCHECKOUT, firstId, ++id, CheckoutRevisionId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 6))
            AddMenuItem(hMenu, "GitEx Clone", IDI_ICONCLONEREPOGIT, firstId, ++id, CloneId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 7))
            AddMenuItem(hMenu, "GitEx Commit", IDI_ICONCOMMIT, firstId, ++id, CommitId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 8))
            AddMenuItem(hMenu, "GitEx File history", IDI_ICONFILEHISTORY, firstId, ++id, FileHistoryId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 9))
            AddMenuItem(hMenu, "GitEx Reset file changes", IDI_ICONTRESETFILETO, firstId, ++id, ResetFileChangesId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 10))
            AddMenuItem(hMenu, "GitEx Pull", IDI_ICONPULL, firstId, ++id, PullId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 11))
            AddMenuItem(hMenu, "GitEx Push", IDI_ICONPUSH, firstId, ++id, PushId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 12))
            AddMenuItem(hMenu, "GitEx Settings", IDI_ICONSETTINGS, firstId, ++id, SettingsId=pos++);

        if (IsMenuItemVisible(szShellVisibleMenuItems, 13))
            AddMenuItem(hMenu, "GitEx View diff", IDI_ICONDIFF, firstId, ++id, ViewDiffId=pos++);
    }

    ++id;
    return id;
}