aboutsummaryrefslogtreecommitdiff
path: root/Src/omBrowser/menu.cpp
blob: ccdc4841767898c5803bba6bf71c530530b6292c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
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;
}