diff options
Diffstat (limited to 'Src/omBrowser/browserUiHook.cpp')
-rw-r--r-- | Src/omBrowser/browserUiHook.cpp | 321 |
1 files changed, 321 insertions, 0 deletions
diff --git a/Src/omBrowser/browserUiHook.cpp b/Src/omBrowser/browserUiHook.cpp new file mode 100644 index 00000000..8d75c45a --- /dev/null +++ b/Src/omBrowser/browserUiHook.cpp @@ -0,0 +1,321 @@ +#include "main.h" +#include "./browserUiHook.h" +#include "./browserUiCommon.h" +#include "./browserUiInternal.h" +#include "./browserPopup.h" +#include "./browserHost.h" + +#include "./ifc_omservice.h" +#include "./ifc_omserviceeventmngr.h" +#include "./ifc_omservicecommand.h" +#include "./ifc_omtoolbarconfig.h" +#include "./ifc_omstatusbarconfig.h" +#include "./ifc_omserviceeditor.h" +#include "./ifc_omconfig.h" +#include "./obj_ombrowser.h" + +#include "./toolbar.h" +#include "./statusbar.h" + +#include "../winamp/IWasabiDispatchable.h" +#include "../winamp/JSAPI_Info.h" + +#include <strsafe.h> + +BrowserUiHook::BrowserUiHook(HWND hTarget, BOOL fPopupMode) + : ref(1), popupMode(fPopupMode), hwnd(hTarget), winampCookie(NULL), configCookie(NULL) +{ +} + +BrowserUiHook::~BrowserUiHook() +{ +} + +HRESULT BrowserUiHook::CreateInstance(HWND hTarget, BOOL fPopupMode, BrowserUiHook **instance) +{ + if (NULL == instance) return E_POINTER; + *instance = NULL; + + if (NULL == hTarget || FALSE == IsWindow(hTarget)) + return E_INVALIDARG; + + *instance = new BrowserUiHook(hTarget, fPopupMode); + if (NULL == *instance) return E_OUTOFMEMORY; + + return S_OK; +} + +size_t BrowserUiHook::AddRef() +{ + return InterlockedIncrement((LONG*)&ref); +} + +size_t BrowserUiHook::Release() +{ + if (0 == ref) + return ref; + + LONG r = InterlockedDecrement((LONG*)&ref); + if (0 == r) + delete(this); + + return r; +} + +int BrowserUiHook::QueryInterface(GUID interface_guid, void **object) +{ + if (NULL == object) return E_POINTER; + + if (IsEqualIID(interface_guid, IFC_WinampHook)) + *object = static_cast<ifc_winamphook*>(this); + else if (IsEqualIID(interface_guid, IFC_OmServiceEvent)) + *object = static_cast<ifc_omserviceevent*>(this); + else if (IsEqualIID(interface_guid, IFC_OmConfigCallback)) + *object = static_cast<ifc_omconfigcallback*>(this); + else + { + *object = NULL; + return E_NOINTERFACE; + } + + if (NULL == *object) + return E_UNEXPECTED; + + AddRef(); + return S_OK; +} + + +HRESULT BrowserUiHook::SkinChanging(void) +{ + if (FALSE != popupMode) + { + BrowserPopup_SkinRefreshing(hwnd); + PostMessage(hwnd, NBPM_SKINREFRESHED, 0, 0L); + } + return S_OK; +} + +HRESULT BrowserUiHook::SkinChanged(const wchar_t *skinName) +{ + PostMessage(hwnd, NBCM_UPDATESKIN, 0, TRUE); + return S_OK; +} + +HRESULT BrowserUiHook::SkinColorChange(const wchar_t *colorTheme) +{ + PostMessage(hwnd, NBCM_UPDATESKIN, 0, TRUE); + return S_OK; +} + +HRESULT BrowserUiHook::ResetFont(void) +{ + PostMessage(hwnd, NBCM_UPDATESKIN, 0, TRUE); + return S_OK; +} + +void BrowserUiHook::ServiceChange(ifc_omservice *service, UINT nModified) +{ + ifc_omservice *windowService; + if (FALSE == (BOOL)SendMessage(hwnd, NBCM_GETSERVICE, 0, (LPARAM)&windowService) || NULL == windowService) + return; + + if (windowService != service) return; + + if (0 != (ifc_omserviceeditor::modifiedName & nModified)) + { + IDispatch *pDispatch; + if (SUCCEEDED(windowService->GetExternal(&pDispatch) && NULL != pDispatch)) + { + IWasabiDispatchable *pWasabi; + if (SUCCEEDED(pDispatch->QueryInterface(IID_IWasabiDispatchable, (void**)&pWasabi))) + { + JSAPI::ifc_info *info = NULL; + if (SUCCEEDED(pWasabi->QueryDispatchable(JSAPI::IID_JSAPI_ifc_info, (Dispatchable**)&info))) + { + WCHAR szName[512] = {0}; + if (FAILED(service->GetName(szName, ARRAYSIZE(szName)))) + StringCchCopy(szName, ARRAYSIZE(szName), L"Unknown"); + + info->SetName(szName); + info->Release(); + } + pWasabi->Release(); + } + pDispatch->Release(); + } + + if (FALSE != popupMode) + PostMessage(hwnd, NBPM_REFRESHTITLE, 0, 0L); + } + + if (0 != (ifc_omserviceeditor::modifiedRating & nModified)) + { + HWND hToolbar = BrowserControl_GetToolbar(hwnd); + if (NULL != hToolbar) + { + UINT rating; + if(SUCCEEDED(service->GetRating(&rating))) + { + Toolbar_SetItemInt(hToolbar, TOOLITEM_USERRATING, rating); + } + } + } + + if (0 != (ifc_omserviceeditor::modifiedGeneration & nModified)) + { + HWND hHost = BrowserControl_GetHost(hwnd); + if (NULL != hHost) PostMessage(hHost, NBHM_UPDATEEXTERNAL, 0 , 0L); + } + +} + +void BrowserUiHook::CommandStateChange(ifc_omservice *service, const GUID *commandGroup, unsigned int commandId) +{ + if (NULL != commandGroup) + { + if (IsEqualGUID(CMDGROUP_SERVICE, *commandGroup)) + { + switch(commandId) + { + case SVCCOMMAND_BLOCKNAV: + CheckBlockedState(service); + break; + + } + + } + } +} + +HRESULT BrowserUiHook::ValueChanged(const GUID *configUid, UINT valueId, ULONG_PTR value) +{ + if (NULL == configUid) + return E_UNEXPECTED; + + if (IsEqualIID(IFC_OmToolbarConfig, *configUid)) + { + HWND hToolbar = (HWND)SendMessage(hwnd, NBCM_GETTOOLBAR, 0, 0L); + if (NULL == hToolbar) return S_FALSE; + + switch(valueId) + { + case CFGID_TOOLBAR_BOTTOMDOCK: Toolbar_EnableBottomDock(hToolbar, (BOOL)value); break; + case CFGID_TOOLBAR_AUTOHIDE: Toolbar_EnableAutoHide(hToolbar, (BOOL)value); break; + case CFGID_TOOLBAR_TABSTOP: Toolbar_EnableTabStop(hToolbar, (BOOL)value); break; + case CFGID_TOOLBAR_FORCEADDRESS: Toolbar_EnableForceAddress(hToolbar, (BOOL)value); break; + case CFGID_TOOLBAR_FANCYADDRESS: Toolbar_EnableFancyAddress(hToolbar, (BOOL)value); break; + } + } + else if (IsEqualIID(IFC_OmStatusbarConfig, *configUid)) + { + HWND hStatusbar = (HWND)SendMessage(hwnd, NBCM_GETSTATUSBAR, 0, 0L); + if (NULL == hStatusbar) return S_FALSE; + + switch(valueId) + { + case CFGID_STATUSBAR_ENABLED: Statusbar_Enable(hStatusbar, (BOOL)value); break; + } + } + + return S_OK; +} + +HRESULT BrowserUiHook::Register(obj_ombrowser *browserManager, ifc_omservice *service) +{ + + Plugin_RegisterWinampHook(this, &winampCookie); + + ifc_omconfig *config; + if (NULL != browserManager && SUCCEEDED(browserManager->GetConfig(NULL, (void**)&config))) + { + config->RegisterCallback(this, &configCookie); + config->Release(); + } + + ifc_omserviceeventmngr *eventManager; + if (NULL != service && SUCCEEDED(service->QueryInterface(IFC_OmServiceEventMngr, (void**)&eventManager))) + { + eventManager->RegisterHandler(this); + eventManager->Release(); + } + + return S_OK; +} + +HRESULT BrowserUiHook::Unregister(obj_ombrowser *browserManager, ifc_omservice *service) +{ + if (0 != configCookie) + { + ifc_omconfig *config; + if (NULL != browserManager && SUCCEEDED(browserManager->GetConfig(NULL, (void**)&config))) + { + config->UnregisterCallback(configCookie); + config->Release(); + } + configCookie = 0; + } + + ifc_omserviceeventmngr *eventManager; + if (NULL != service && SUCCEEDED(service->QueryInterface(IFC_OmServiceEventMngr, (void**)&eventManager))) + { + eventManager->UnregisterHandler(this); + eventManager->Release(); + } + + + if (0 != winampCookie) + { + Plugin_UnregisterWinampHook(winampCookie); + winampCookie = 0; + } + + return S_OK; +} + +HRESULT BrowserUiHook::CheckBlockedState(ifc_omservice *service) +{ + if (NULL == service) + return E_INVALIDARG; + + HRESULT hr; + + ifc_omservicecommand *serviceCommand; + hr = service->QueryInterface(IFC_OmServiceCommand, (void**)&serviceCommand); + if (SUCCEEDED(hr)) + { + HRESULT state = serviceCommand->QueryState(hwnd, &CMDGROUP_SERVICE, SVCCOMMAND_BLOCKNAV); + PostMessage(hwnd, NBCM_BLOCK, 0, (CMDSTATE_ENABLED == state)); + serviceCommand->Release(); + } + return hr; +} + +#define CBCLASS BrowserUiHook +START_MULTIPATCH; + START_PATCH(MPIID_WINAMPHOOK) + M_CB(MPIID_WINAMPHOOK, ifc_winamphook, ADDREF, AddRef); + M_CB(MPIID_WINAMPHOOK, ifc_winamphook, RELEASE, Release); + M_CB(MPIID_WINAMPHOOK, ifc_winamphook, QUERYINTERFACE, QueryInterface); + M_CB(MPIID_WINAMPHOOK, ifc_winamphook, API_SKINCHANGING, SkinChanging); + M_CB(MPIID_WINAMPHOOK, ifc_winamphook, API_SKINCHANGED, SkinChanged); + M_CB(MPIID_WINAMPHOOK, ifc_winamphook, API_SKINCOLORCHANGE, SkinColorChange); + M_CB(MPIID_WINAMPHOOK, ifc_winamphook, API_RESETFONT, ResetFont); + NEXT_PATCH(MPIID_SERVICEEVENT) + M_CB(MPIID_SERVICEEVENT, ifc_omserviceevent, ADDREF, AddRef); + M_CB(MPIID_SERVICEEVENT, ifc_omserviceevent, RELEASE, Release); + M_CB(MPIID_SERVICEEVENT, ifc_omserviceevent, QUERYINTERFACE, QueryInterface); + M_VCB(MPIID_SERVICEEVENT, ifc_omserviceevent, API_SERVICECHANGE, ServiceChange); + M_VCB(MPIID_SERVICEEVENT, ifc_omserviceevent, API_COMMANDSTATECHANGE, CommandStateChange); + + NEXT_PATCH(MPIID_CONFIGCALLBACK) + M_CB(MPIID_CONFIGCALLBACK, ifc_omconfigcallback, ADDREF, AddRef); + M_CB(MPIID_CONFIGCALLBACK, ifc_omconfigcallback, RELEASE, Release); + M_CB(MPIID_CONFIGCALLBACK, ifc_omconfigcallback, QUERYINTERFACE, QueryInterface); + M_CB(MPIID_CONFIGCALLBACK, ifc_omconfigcallback, API_VALUECHANGED, ValueChanged); + END_PATCH +END_MULTIPATCH; +#undef CBCLASS + + + |