diff options
Diffstat (limited to 'Src/omBrowser/menu.cpp')
-rw-r--r-- | Src/omBrowser/menu.cpp | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/Src/omBrowser/menu.cpp b/Src/omBrowser/menu.cpp new file mode 100644 index 00000000..ccdc4841 --- /dev/null +++ b/Src/omBrowser/menu.cpp @@ -0,0 +1,160 @@ +#include "main.h" +#include "./menu.h" +#include "./ratingMenu.h" +#include "./ifc_skinhelper.h" +#include "./ifc_skinnedmenu.h" +#include "./ifc_menucustomizer.h" +#include "./resource.h" +#include "../nu/menuHelpers.h" + +#define SUBMENU_RATING 0 +#define SUBMENU_TOOLBAR 1 +#define SUBMENU_ADDRESSBAR 2 + +static HRESULT Menu_GetSkinnedMenu(ifc_skinnedmenu **skinnedMenu) +{ + if (NULL == skinnedMenu) return E_POINTER; + + ifc_skinhelper *skinHelper = NULL; + HRESULT hr = Plugin_GetSkinHelper(&skinHelper); + if (SUCCEEDED(hr) && skinHelper != NULL) + { + hr = skinHelper->QueryInterface(IFC_SkinnedMenu, (void**)skinnedMenu); + skinHelper->Release(); + } + return hr; +} + +static HMENU Menu_CreateRatingMenu(HMENU baseMenu, INT ratingValue) +{ + HMENU menu = GetSubMenu(baseMenu, SUBMENU_RATING); + if (NULL == menu) return NULL; + + menu = MenuHelper_DuplcateMenu(menu); + if (NULL == menu) return NULL; + + if (FALSE == RatingMenu_InitializeMenu(menu, ratingValue)) + { + DestroyMenu(menu); + menu = NULL; + } + + return menu; +} + +static HMENU Menu_GetToolbarContext(HMENU baseMenu, UINT flags) +{ + HMENU hMenu = GetSubMenu(baseMenu, SUBMENU_TOOLBAR); + return hMenu; +} + +static HMENU Menu_GetAddressbarContext(HMENU baseMenu, UINT flags) +{ + HMENU hMenu = GetSubMenu(baseMenu, SUBMENU_ADDRESSBAR); + return hMenu; +} + +void Menu_ConvertRatingMenuStar(HMENU menu, UINT menu_id) +{ + MENUITEMINFOW mi = {sizeof(mi), MIIM_DATA | MIIM_TYPE, MFT_STRING}; + wchar_t rateBuf[32] = {0}, *rateStr = rateBuf; + mi.dwTypeData = rateBuf; + mi.cch = 32; + if(GetMenuItemInfoW(menu, menu_id, FALSE, &mi)) + { + while(rateStr && *rateStr) + { + if(*rateStr == L'*') *rateStr = L'\u2605'; + rateStr=CharNextW(rateStr); + } + SetMenuItemInfoW(menu, menu_id, FALSE, &mi); + } +} + +HMENU Menu_GetMenu(INT menuKind, UINT flags) +{ + HMENU baseMenu = Plugin_LoadMenu(MAKEINTRESOURCE(IDR_CONTEXTMENU)); + if (NULL == baseMenu) + return NULL; + + HMENU rate_hmenu = GetSubMenu(baseMenu,0); + Menu_ConvertRatingMenuStar(rate_hmenu, ID_RATING_VALUE_5); + Menu_ConvertRatingMenuStar(rate_hmenu, ID_RATING_VALUE_4); + Menu_ConvertRatingMenuStar(rate_hmenu, ID_RATING_VALUE_3); + Menu_ConvertRatingMenuStar(rate_hmenu, ID_RATING_VALUE_2); + Menu_ConvertRatingMenuStar(rate_hmenu, ID_RATING_VALUE_1); + + switch(menuKind) + { + case MENU_RATING: + return Menu_CreateRatingMenu(baseMenu, RATINGFROMMCF(flags)); + case MENU_TOOLBAR: + return Menu_GetToolbarContext(baseMenu, flags); + case MENU_ADDRESSBAR: + return Menu_GetAddressbarContext(baseMenu, flags); + } + return NULL; +} + +void Menu_ReleaseMenu(HMENU hMenu, INT menuKind) +{ + if (NULL == hMenu) + return; + + switch(menuKind) + { + case MENU_RATING: + DestroyMenu(hMenu); + break; + case MENU_TOOLBAR: + break; + case MENU_ADDRESSBAR: + break; + } +} + +BOOL Menu_TrackPopup(HMENU hMenu, UINT fuFlags, INT x, INT y, HWND hwnd, LPTPMPARAMS lptpm) +{ + BOOL result = FALSE; + + ifc_skinnedmenu *skinnedMenu = NULL; + if (SUCCEEDED(Menu_GetSkinnedMenu(&skinnedMenu)) && skinnedMenu != NULL) + { + ifc_menucustomizer *customizer = NULL; + if (FAILED(RatingMenu_GetCustomizer(hMenu, &customizer))) + customizer = NULL; + + result = skinnedMenu->TrackPopup(hMenu, fuFlags, x, y, hwnd, lptpm, customizer); + + if (NULL != customizer) + customizer->Release(); + + skinnedMenu->Release(); + } + + return result; +} + +HANDLE Menu_InitializeHook(HWND hwnd, ifc_menucustomizer *customizer) +{ + ifc_skinnedmenu *skinnedMenu = NULL; + HANDLE hook = NULL; + if (SUCCEEDED(Menu_GetSkinnedMenu(&skinnedMenu)) && skinnedMenu != NULL) + { + hook = skinnedMenu->InitPopupHook(hwnd, customizer); + skinnedMenu->Release(); + } + return hook; +} + +HRESULT Menu_RemoveHook(HANDLE menuHook) +{ + ifc_skinnedmenu *skinnedMenu = NULL; + HRESULT hr = Menu_GetSkinnedMenu(&skinnedMenu); + if (SUCCEEDED(hr) && skinnedMenu != NULL) + { + hr = skinnedMenu->RemovePopupHook(menuHook); + skinnedMenu->Release(); + } + return hr; +}
\ No newline at end of file |