mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-09-24 15:54:12 +00:00
222 lines
5.4 KiB
C++
222 lines
5.4 KiB
C++
|
#include "main.h"
|
||
|
#include "./local_menu.h"
|
||
|
#include "./wasabi.h"
|
||
|
#include "./resource.h"
|
||
|
#include "./navigation.h"
|
||
|
#include "./import.h"
|
||
|
|
||
|
#include "../../General/gen_ml/ml_ipc_0313.h"
|
||
|
#include "../nu/menuHelpers.h"
|
||
|
#include "./ombrowser/browserView.h"
|
||
|
#include "./ombrowser/toolbar.h"
|
||
|
|
||
|
#include "./serviceHelper.h"
|
||
|
#include <ifc_omservice.h>
|
||
|
|
||
|
#define SUBMENU_VIEW 0
|
||
|
#define SUBMENU_SERVICEMNGR 1
|
||
|
#define SUBMENU_NAVIGATION 2
|
||
|
#define SUBMENU_PLUGIN 3
|
||
|
|
||
|
static INT Menu_AddViewContext(HMENU destMenu, HMENU baseMenu, BOOL viewActive)
|
||
|
{
|
||
|
if (NULL == destMenu) return 0;
|
||
|
|
||
|
HMENU sorceMenu = GetSubMenu(baseMenu, SUBMENU_VIEW);
|
||
|
if (NULL == sorceMenu) return 0;
|
||
|
|
||
|
INT c = GetMenuItemCount(destMenu);
|
||
|
c = MenuHelper_CopyMenu(destMenu, c, sorceMenu);
|
||
|
|
||
|
|
||
|
if (FALSE != viewActive)
|
||
|
{
|
||
|
EnableMenuItem(destMenu, ID_VIEW_OPEN, MF_BYCOMMAND | MF_GRAYED | MF_DISABLED);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
EnableMenuItem(destMenu, ID_VIEW_OPEN, MF_BYCOMMAND | MF_ENABLED);
|
||
|
SetMenuDefaultItem(destMenu, ID_VIEW_OPEN, FALSE);
|
||
|
}
|
||
|
return c;
|
||
|
}
|
||
|
|
||
|
typedef struct __NAVITEMPAIR
|
||
|
{
|
||
|
INT wId;
|
||
|
LPCSTR toolItem;
|
||
|
} NAVITEMPAIR;
|
||
|
|
||
|
static INT Menu_AddNavigationContext(HMENU destMenu, HMENU baseMenu)
|
||
|
{
|
||
|
if (NULL == destMenu) return 0;
|
||
|
|
||
|
HMENU sorceMenu = GetSubMenu(baseMenu, SUBMENU_NAVIGATION);
|
||
|
if (NULL == sorceMenu) return 0;
|
||
|
|
||
|
INT c = GetMenuItemCount(destMenu);
|
||
|
c = MenuHelper_CopyMenu(destMenu, c, sorceMenu);
|
||
|
if (0 == c) return c;
|
||
|
|
||
|
HWND hView = NULL;
|
||
|
|
||
|
Navigation *navigation;
|
||
|
if (SUCCEEDED(Plugin_GetNavigation(&navigation)))
|
||
|
{
|
||
|
hView = navigation->GetActiveView(NULL);
|
||
|
navigation->Release();
|
||
|
}
|
||
|
|
||
|
HWND hToolbar = (NULL != hView) ? BrowserView_GetToolbar(hView) : NULL;
|
||
|
if (NULL != hToolbar)
|
||
|
{
|
||
|
NAVITEMPAIR szItems[] =
|
||
|
{
|
||
|
{ID_NAVIGATION_BACK, TOOLITEM_BUTTON_BACK},
|
||
|
{ID_NAVIGATION_FORWARD, TOOLITEM_BUTTON_FORWARD},
|
||
|
{ID_NAVIGATION_HOME, TOOLITEM_BUTTON_HOME},
|
||
|
{ID_NAVIGATION_STOP, TOOLITEM_BUTTON_STOP},
|
||
|
{ID_NAVIGATION_REFRESH, TOOLITEM_BUTTON_REFRESH},
|
||
|
};
|
||
|
|
||
|
for (INT i = 0; i < ARRAYSIZE(szItems); i++)
|
||
|
{
|
||
|
INT index = Toolbar_FindItem(hToolbar, szItems[i].toolItem);
|
||
|
if (-1 != index)
|
||
|
{
|
||
|
BOOL fDisabled = Toolbar_GetItemStyle(hToolbar, MAKEINTRESOURCE(index), TBIS_DISABLED);
|
||
|
EnableMenuItem(destMenu, szItems[i].wId, MF_BYCOMMAND | (fDisabled) ? (MF_DISABLED | MF_GRAYED) : (MF_ENABLED));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return c;
|
||
|
}
|
||
|
|
||
|
static INT Menu_AddServiceContext(HMENU destMenu, HMENU baseMenu, ifc_omservice *service)
|
||
|
{
|
||
|
if (NULL == destMenu || NULL == service) return 0;
|
||
|
|
||
|
HMENU sorceMenu = GetSubMenu(baseMenu, SUBMENU_SERVICEMNGR);
|
||
|
if (NULL == sorceMenu) return 0;
|
||
|
|
||
|
INT origCount = GetMenuItemCount(destMenu);
|
||
|
INT c = MenuHelper_CopyMenu(destMenu, origCount, sorceMenu);
|
||
|
UINT serviceFlags;
|
||
|
if (FAILED(service->GetFlags(&serviceFlags))) serviceFlags = 0;
|
||
|
|
||
|
if (0 != ((WDSVCF_ROOT | WDSVCF_SPECIAL) & serviceFlags))
|
||
|
{
|
||
|
UINT szDisabled[] = {ID_SERVICE_EDIT, ID_SERVICE_DELETE, ID_SERVICE_RELOAD,
|
||
|
ID_SERVICE_LOCATE, ID_SERVICE_EDITEXTERNAL };
|
||
|
|
||
|
for (INT i = 0; i < ARRAYSIZE(szDisabled); i++)
|
||
|
EnableMenuItem(destMenu, szDisabled[i], MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
|
||
|
}
|
||
|
|
||
|
UINT uEnable;
|
||
|
|
||
|
uEnable = (S_OK == ImportService_GetFileSupported()) ? MF_ENABLED : (MF_DISABLED | MF_GRAYED);
|
||
|
EnableMenuItem(destMenu, ID_SERVICE_IMPORT_FILE, MF_BYCOMMAND | uEnable);
|
||
|
|
||
|
uEnable = (S_OK == ImportService_GetUrlSupported()) ? MF_ENABLED : (MF_DISABLED | MF_GRAYED);
|
||
|
EnableMenuItem(destMenu, ID_SERVICE_IMPORT_URL, MF_BYCOMMAND | uEnable);
|
||
|
|
||
|
return c;
|
||
|
}
|
||
|
|
||
|
static INT Menu_AddPluginContext(HMENU destMenu, HMENU baseMenu, ifc_omservice *service)
|
||
|
{
|
||
|
UINT serviceFlags;
|
||
|
if (NULL == service || FAILED(service->GetFlags(&serviceFlags)))
|
||
|
serviceFlags = 0;
|
||
|
|
||
|
if (NULL == destMenu || NULL == service ||
|
||
|
0 == (WDSVCF_ROOT & serviceFlags))
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
HMENU sorceMenu = GetSubMenu(baseMenu, SUBMENU_PLUGIN);
|
||
|
if (NULL == sorceMenu) return 0;
|
||
|
|
||
|
INT origCount = GetMenuItemCount(destMenu);
|
||
|
INT c = MenuHelper_CopyMenu(destMenu, origCount, sorceMenu);
|
||
|
|
||
|
return c;
|
||
|
}
|
||
|
|
||
|
static HMENU Menu_GetServiceContext(HMENU baseMenu, ifc_omservice *service)
|
||
|
{
|
||
|
HMENU hMenu = CreatePopupMenu();
|
||
|
if(NULL == hMenu) return NULL;
|
||
|
|
||
|
ifc_omservice *activeService = NULL;
|
||
|
Navigation *navigation;
|
||
|
if (SUCCEEDED(Plugin_GetNavigation(&navigation)))
|
||
|
{
|
||
|
navigation->GetActive(&activeService);
|
||
|
navigation->Release();
|
||
|
}
|
||
|
|
||
|
BOOL fActive = (NULL != service && activeService == service);
|
||
|
|
||
|
INT c, total;
|
||
|
total = Menu_AddViewContext(hMenu, baseMenu, fActive);
|
||
|
if (FALSE != fActive)
|
||
|
{
|
||
|
c = Menu_AddNavigationContext(hMenu, baseMenu);
|
||
|
if (0 != c && total > 0 && 0 != MenuHelper_InsertSeparator(hMenu, total))
|
||
|
total++;
|
||
|
|
||
|
total += c;
|
||
|
}
|
||
|
|
||
|
if (NULL != service)
|
||
|
{
|
||
|
c = Menu_AddServiceContext(hMenu, baseMenu, service);
|
||
|
if (0 != c && total > 0 && 0 != MenuHelper_InsertSeparator(hMenu, total))
|
||
|
total++;
|
||
|
|
||
|
total += c;
|
||
|
|
||
|
c = Menu_AddPluginContext(hMenu, baseMenu, service);
|
||
|
if (0 != c && total > 0 && 0 != MenuHelper_InsertSeparator(hMenu, total))
|
||
|
total++;
|
||
|
|
||
|
total += c;
|
||
|
}
|
||
|
|
||
|
|
||
|
if (NULL != activeService)
|
||
|
activeService->Release();
|
||
|
|
||
|
return hMenu;
|
||
|
}
|
||
|
|
||
|
HMENU Menu_GetMenu(UINT menuKind, ifc_omservice *service)
|
||
|
{
|
||
|
HMENU baseMenu = WASABI_API_LOADMENUW(IDR_CONTEXTMENU);
|
||
|
if (NULL == baseMenu)
|
||
|
return NULL;
|
||
|
|
||
|
switch(menuKind)
|
||
|
{
|
||
|
case MENU_SERVICECONTEXT:
|
||
|
return Menu_GetServiceContext(baseMenu, service);
|
||
|
}
|
||
|
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
BOOL Menu_ReleaseMenu(HMENU hMenu, UINT menuKind)
|
||
|
{
|
||
|
if (NULL == hMenu) return FALSE;
|
||
|
|
||
|
switch(menuKind)
|
||
|
{
|
||
|
case MENU_SERVICECONTEXT:
|
||
|
return DestroyMenu(hMenu);
|
||
|
}
|
||
|
return FALSE;
|
||
|
}
|