mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-12-29 15:56:06 +00:00
694 lines
19 KiB
C++
694 lines
19 KiB
C++
|
#include "main.h"
|
||
|
#include "./browserUiCommon.h"
|
||
|
#include "./browserUiInternal.h"
|
||
|
|
||
|
#include "./toolbar.h"
|
||
|
#include "./statusbar.h"
|
||
|
#include "./curtain.h"
|
||
|
#include "./browserHost.h"
|
||
|
|
||
|
#include "./obj_ombrowser.h"
|
||
|
#include "./ifc_omservice.h"
|
||
|
#include "./ifc_omservicecommand.h"
|
||
|
#include "./ifc_omtoolbarconfig.h"
|
||
|
#include "./ifc_omstatusbarconfig.h"
|
||
|
|
||
|
#include "./resource.h"
|
||
|
|
||
|
#define IDC_OPERATIONWIDGET 0x1010
|
||
|
|
||
|
static HACCEL commonTable = NULL;
|
||
|
static HACCEL popupTable = NULL;
|
||
|
static BOOL regiterUnload = TRUE;
|
||
|
|
||
|
static void CALLBACK BrowserControl_OnPluginUnload()
|
||
|
{
|
||
|
if (NULL != commonTable)
|
||
|
{
|
||
|
DestroyAcceleratorTable(commonTable);
|
||
|
commonTable = NULL;
|
||
|
}
|
||
|
|
||
|
if (NULL != popupTable)
|
||
|
{
|
||
|
DestroyAcceleratorTable(popupTable);
|
||
|
popupTable = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static HACCEL BrowserControl_LoadCommonAccel()
|
||
|
{
|
||
|
if (NULL != commonTable)
|
||
|
return commonTable;
|
||
|
|
||
|
commonTable = Plugin_LoadAccelerators(MAKEINTRESOURCE(IDR_BROWSERACCEL));
|
||
|
|
||
|
if (FALSE != regiterUnload && NULL != commonTable)
|
||
|
{
|
||
|
Plugin_RegisterUnloadCallback(BrowserControl_OnPluginUnload);
|
||
|
regiterUnload = FALSE;
|
||
|
}
|
||
|
|
||
|
return commonTable;
|
||
|
|
||
|
}
|
||
|
|
||
|
static HACCEL BrowserControl_LoadPoppupAccel()
|
||
|
{
|
||
|
if (NULL != popupTable)
|
||
|
return popupTable;
|
||
|
|
||
|
UINT cCommon, cPopup, cTotal = 0;
|
||
|
|
||
|
HACCEL hCommon = Plugin_LoadAccelerators(MAKEINTRESOURCE(IDR_BROWSERACCEL));
|
||
|
cCommon = (NULL != hCommon) ? CopyAcceleratorTable(hCommon, NULL, 0) : 0;
|
||
|
|
||
|
HACCEL hPopup = Plugin_LoadAccelerators(MAKEINTRESOURCE(IDR_BROWSERPOPUPACCEL));
|
||
|
cPopup = (NULL != hPopup) ? CopyAcceleratorTable(hPopup, NULL, 0) : 0;
|
||
|
|
||
|
cTotal += (cCommon + cPopup);
|
||
|
if (0 != cTotal)
|
||
|
{
|
||
|
ACCEL *pAccel = (ACCEL*)calloc(cTotal, sizeof(ACCEL));
|
||
|
if (NULL != pAccel)
|
||
|
{
|
||
|
UINT copied = 0;
|
||
|
if (NULL != hCommon)
|
||
|
copied += CopyAcceleratorTable(hCommon, pAccel + copied, cTotal - copied);
|
||
|
|
||
|
if (NULL != hPopup)
|
||
|
copied += CopyAcceleratorTable(hPopup, pAccel + copied, cTotal - copied);
|
||
|
|
||
|
if (0 != copied)
|
||
|
popupTable = CreateAcceleratorTable(pAccel, copied);
|
||
|
|
||
|
free(pAccel);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (NULL != hCommon)
|
||
|
DestroyAcceleratorTable(hCommon);
|
||
|
|
||
|
if (NULL != hPopup)
|
||
|
DestroyAcceleratorTable(hPopup);
|
||
|
|
||
|
if (FALSE != regiterUnload && NULL != popupTable)
|
||
|
{
|
||
|
Plugin_RegisterUnloadCallback(BrowserControl_OnPluginUnload);
|
||
|
regiterUnload = FALSE;
|
||
|
}
|
||
|
|
||
|
return popupTable;
|
||
|
|
||
|
}
|
||
|
|
||
|
HACCEL BrowserControl_GetAccelTable(UINT tableType)
|
||
|
{
|
||
|
switch(tableType)
|
||
|
{
|
||
|
case ACCELTABLE_VIEW:
|
||
|
return BrowserControl_LoadCommonAccel();
|
||
|
case ACCELTABLE_POPUP:
|
||
|
return BrowserControl_LoadPoppupAccel();
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
static void BrowserControl_ShowHistoryPopup(HWND hControl)
|
||
|
{
|
||
|
HWND hBrowser = BrowserControl_GetHost(hControl);
|
||
|
if (NULL == hBrowser) return;
|
||
|
|
||
|
UINT flags = TPM_LEFTALIGN;
|
||
|
POINT pt = {0, 0};
|
||
|
|
||
|
BOOL fUseHost = TRUE;;
|
||
|
HWND hToolbar = BrowserControl_GetToolbar(hControl);
|
||
|
DWORD toolbarStyle = (NULL != hToolbar) ? GetWindowStyle(hToolbar) : 0;
|
||
|
|
||
|
if (NULL != hToolbar && 0 != (WS_VISIBLE & toolbarStyle))
|
||
|
{
|
||
|
fUseHost = FALSE;
|
||
|
RECT toolbarRect;
|
||
|
GetWindowRect(hToolbar, &toolbarRect);
|
||
|
pt.x = toolbarRect.left + 2;
|
||
|
if (0 != (TBS_BOTTOMDOCK & toolbarStyle))
|
||
|
{
|
||
|
pt.y = toolbarRect.top + 1;
|
||
|
flags |= TPM_VERNEGANIMATION | TPM_BOTTOMALIGN;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pt.y = toolbarRect.bottom - 1;
|
||
|
flags |= TPM_VERPOSANIMATION | TPM_TOPALIGN;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (FALSE != fUseHost)
|
||
|
{
|
||
|
RECT windowRect;
|
||
|
GetClientRect(hControl, &windowRect);
|
||
|
pt.x = windowRect.left;
|
||
|
pt.y = windowRect.top;
|
||
|
MapWindowPoints(hControl, HWND_DESKTOP, &pt, 1);
|
||
|
flags |= TPM_VERPOSANIMATION | TPM_TOPALIGN;
|
||
|
}
|
||
|
|
||
|
if (NULL != hToolbar && 0 != (TBS_AUTOHIDE & toolbarStyle))
|
||
|
SetWindowLongPtr(hToolbar, GWL_STYLE, toolbarStyle & ~TBS_AUTOHIDE);
|
||
|
|
||
|
HWND hStatusbar = BrowserControl_GetStatusbar(hControl);
|
||
|
DWORD statusStyle = (NULL != hStatusbar) ? GetWindowStyle(hStatusbar) : 0;
|
||
|
if (NULL != hStatusbar && 0 == (WS_DISABLED & statusStyle))
|
||
|
SetWindowLongPtr(hStatusbar, GWL_STYLE, WS_DISABLED | statusStyle);
|
||
|
|
||
|
SendMessage(hBrowser, NBHM_SHOWHISTORYPOPUP, (WPARAM)flags, MAKELPARAM(pt.x, pt.y));
|
||
|
|
||
|
if (NULL != hToolbar && 0 != (TBS_AUTOHIDE & toolbarStyle))
|
||
|
{
|
||
|
SetWindowLongPtr(hToolbar, GWL_STYLE, toolbarStyle);
|
||
|
TRACKMOUSEEVENT tm;
|
||
|
tm.cbSize = sizeof(TRACKMOUSEEVENT);
|
||
|
tm.dwFlags = TME_LEAVE;
|
||
|
tm.hwndTrack = hToolbar;
|
||
|
TrackMouseEvent(&tm);
|
||
|
}
|
||
|
|
||
|
if (NULL != hStatusbar && 0 == (WS_DISABLED & statusStyle))
|
||
|
SetWindowLongPtr(hStatusbar, GWL_STYLE, statusStyle);
|
||
|
}
|
||
|
|
||
|
static BOOL BrowserControl_ExecServiceCommand(HWND hControl, ifc_omservicecommand *command, const GUID *group, UINT id, ULONG_PTR arg)
|
||
|
{
|
||
|
if (NULL == command) return FALSE;
|
||
|
|
||
|
HRESULT state = command->QueryState(hControl, group, id);
|
||
|
if (CMDSTATE_ENABLED == state)
|
||
|
{
|
||
|
command->Exec(hControl, group, id, arg);
|
||
|
return TRUE;
|
||
|
}
|
||
|
return (CMDSTATE_DISABLED == state) ? TRUE : FALSE;
|
||
|
}
|
||
|
|
||
|
BOOL BrowserControl_ProcessCommonCommand(HWND hControl, INT commandId)
|
||
|
{
|
||
|
if (NULL == hControl)
|
||
|
return FALSE;
|
||
|
|
||
|
UINT controlStyle = GetWindowStyle(hControl);
|
||
|
ifc_omservice *service;
|
||
|
if (0 != (NBCS_NOSERVICECOMMANDS & controlStyle) ||
|
||
|
FALSE == BrowserControl_GetService(hControl, &service))
|
||
|
{
|
||
|
service = NULL;
|
||
|
}
|
||
|
|
||
|
ifc_omservicecommand *serviceCommand;
|
||
|
if (NULL == service ||
|
||
|
FAILED(service->QueryInterface(IFC_OmServiceCommand, (void**)&serviceCommand)))
|
||
|
{
|
||
|
serviceCommand = NULL;
|
||
|
}
|
||
|
|
||
|
BOOL fProcessed = FALSE;
|
||
|
|
||
|
switch(commandId)
|
||
|
{
|
||
|
case ID_NAVIGATION_HOME:
|
||
|
if (FALSE == BrowserControl_ExecServiceCommand(hControl, serviceCommand, &CMDGROUP_NAVIGATION, NAVCOMMAND_HOME, 0))
|
||
|
BrowserControl_Navigate(hControl, NAVIGATE_HOME, 0L);
|
||
|
fProcessed = TRUE;
|
||
|
break;
|
||
|
|
||
|
case ID_NAVIGATION_BACK:
|
||
|
if (FALSE == BrowserControl_ExecServiceCommand(hControl, serviceCommand, &CMDGROUP_NAVIGATION, NAVCOMMAND_BACKFORWARD, FALSE))
|
||
|
BrowserControl_Navigate(hControl, NAVIGATE_BACK, 0L);
|
||
|
fProcessed = TRUE;
|
||
|
break;
|
||
|
|
||
|
case ID_NAVIGATION_FORWARD:
|
||
|
if (FALSE == BrowserControl_ExecServiceCommand(hControl, serviceCommand, &CMDGROUP_NAVIGATION, NAVCOMMAND_BACKFORWARD, TRUE))
|
||
|
BrowserControl_Navigate(hControl, NAVIGATE_FORWARD, 0L);
|
||
|
fProcessed = TRUE;
|
||
|
break;
|
||
|
|
||
|
case ID_NAVIGATION_REFRESH:
|
||
|
if (FALSE == BrowserControl_ExecServiceCommand(hControl, serviceCommand, &CMDGROUP_NAVIGATION, NAVCOMMAND_REFRESH, FALSE))
|
||
|
BrowserControl_Navigate(hControl, NAVIGATE_REFRESH, 0L);
|
||
|
fProcessed = TRUE;
|
||
|
break;
|
||
|
|
||
|
case ID_NAVIGATION_REFRESH_COMPLETELY:
|
||
|
if (FALSE == BrowserControl_ExecServiceCommand(hControl, serviceCommand, &CMDGROUP_NAVIGATION, NAVCOMMAND_REFRESH, TRUE))
|
||
|
BrowserControl_Navigate(hControl, NAVIGATE_REFRESH_COMPLETELY, 0L);
|
||
|
fProcessed = TRUE;
|
||
|
break;
|
||
|
|
||
|
case ID_NAVIGATION_STOP:
|
||
|
if (FALSE == BrowserControl_ExecServiceCommand(hControl, serviceCommand, &CMDGROUP_NAVIGATION, NAVCOMMAND_STOP, 0L))
|
||
|
BrowserControl_Navigate(hControl, NAVIGATE_STOP, 0L);
|
||
|
fProcessed = TRUE;
|
||
|
break;
|
||
|
|
||
|
case ID_NAVIGATION_HISTORY:
|
||
|
if (FALSE == BrowserControl_ExecServiceCommand(hControl, serviceCommand, &CMDGROUP_NAVIGATION, NAVCOMMAND_HISTORY, 0L))
|
||
|
BrowserControl_ShowHistoryPopup(hControl);
|
||
|
fProcessed = TRUE;
|
||
|
break;
|
||
|
|
||
|
case ID_SERVICE_GETINFO:
|
||
|
BrowserControl_ExecServiceCommand(hControl, serviceCommand, &CMDGROUP_SERVICE, SVCCOMMAND_SHOWINFO, 0);
|
||
|
fProcessed = TRUE;
|
||
|
break;
|
||
|
|
||
|
case ID_SERVICE_REPORT:
|
||
|
BrowserControl_ExecServiceCommand(hControl, serviceCommand, &CMDGROUP_SERVICE, SVCCOMMAND_REPORT, 0);
|
||
|
fProcessed = TRUE;
|
||
|
break;
|
||
|
|
||
|
case ID_SERVICE_UNSUBSCRIBE:
|
||
|
BrowserControl_ExecServiceCommand(hControl, serviceCommand, &CMDGROUP_SERVICE, SVCCOMMAND_UNSUBSCRIBE, 0);
|
||
|
fProcessed = TRUE;
|
||
|
break;
|
||
|
|
||
|
case ID_RATING_VALUE_1:
|
||
|
BrowserControl_ExecServiceCommand(hControl, serviceCommand, &CMDGROUP_SERVICE, SVCCOMMAND_RATE, 1);
|
||
|
fProcessed = TRUE;
|
||
|
break;
|
||
|
|
||
|
case ID_RATING_VALUE_2:
|
||
|
BrowserControl_ExecServiceCommand(hControl, serviceCommand, &CMDGROUP_SERVICE, SVCCOMMAND_RATE, 2);
|
||
|
fProcessed = TRUE;
|
||
|
break;
|
||
|
|
||
|
case ID_RATING_VALUE_3:
|
||
|
BrowserControl_ExecServiceCommand(hControl, serviceCommand, &CMDGROUP_SERVICE, SVCCOMMAND_RATE, 3);
|
||
|
fProcessed = TRUE;
|
||
|
break;
|
||
|
|
||
|
case ID_RATING_VALUE_4:
|
||
|
BrowserControl_ExecServiceCommand(hControl, serviceCommand, &CMDGROUP_SERVICE, SVCCOMMAND_RATE, 4);
|
||
|
fProcessed = TRUE;
|
||
|
break;
|
||
|
|
||
|
case ID_RATING_VALUE_5:
|
||
|
BrowserControl_ExecServiceCommand(hControl, serviceCommand, &CMDGROUP_SERVICE, SVCCOMMAND_RATE, 5);
|
||
|
fProcessed = TRUE;
|
||
|
break;
|
||
|
|
||
|
case ID_WINDOW_CLOSE:
|
||
|
if (FALSE != BrowserControl_ExecServiceCommand(hControl, serviceCommand, &CMDGROUP_WINDOW, WNDCOMMAND_CLOSE, 0))
|
||
|
fProcessed = TRUE;
|
||
|
break;
|
||
|
|
||
|
case ID_WINDOW_FULLSCREEN:
|
||
|
if (FALSE != BrowserControl_ExecServiceCommand(hControl, serviceCommand, &CMDGROUP_WINDOW, WNDCOMMAND_FULLSCREEN, 0))
|
||
|
fProcessed = TRUE;
|
||
|
break;
|
||
|
case ID_ADDRESSBAR_ACTIVATE:
|
||
|
{
|
||
|
HWND hToolbar = BrowserControl_GetToolbar(hControl);
|
||
|
if(NULL != hToolbar)
|
||
|
{
|
||
|
Toolbar_NextItem(hToolbar, TOOLITEM_ADDRESSBAR, TRUE);
|
||
|
}
|
||
|
}
|
||
|
fProcessed = TRUE;
|
||
|
break;
|
||
|
case ID_ADDRESSBAR_CHANGED:
|
||
|
{
|
||
|
HWND hToolbar = BrowserControl_GetToolbar(hControl);
|
||
|
if(NULL != hToolbar)
|
||
|
{
|
||
|
INT itemId = Toolbar_FindItem(hToolbar, TOOLITEM_ADDRESSBAR);
|
||
|
if (ITEM_ERR != itemId)
|
||
|
{
|
||
|
size_t cchBufferMax;
|
||
|
if (FALSE == Toolbar_GetTextLength(hToolbar, MAKEINTRESOURCE(itemId), &cchBufferMax))
|
||
|
cchBufferMax = 8192;
|
||
|
|
||
|
cchBufferMax++;
|
||
|
LPWSTR pszBuffer = Plugin_MallocString(cchBufferMax);
|
||
|
if (NULL != pszBuffer)
|
||
|
{
|
||
|
TBITEMINFO itemInfo;
|
||
|
ZeroMemory(&itemInfo, sizeof(itemInfo));
|
||
|
|
||
|
|
||
|
itemInfo.pszText = pszBuffer;
|
||
|
itemInfo.cchText = (INT)cchBufferMax;
|
||
|
if (FALSE != Toolbar_GetItemInfo(hToolbar, MAKEINTRESOURCE(itemId), &itemInfo))
|
||
|
{
|
||
|
if (FALSE == BrowserControl_ExecServiceCommand(hControl, serviceCommand,
|
||
|
&CMDGROUP_ADDRESSBAR, ADDRESSCOMMAND_EXECUTE, (ULONG_PTR)itemInfo.pszText))
|
||
|
{
|
||
|
BrowserControl_Navigate(hControl, NAVIGATE_STOP, 0L);
|
||
|
BrowserControl_Navigate(hControl, itemInfo.pszText, 0L);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Plugin_FreeString(pszBuffer);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
fProcessed = TRUE;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (NULL != serviceCommand)
|
||
|
serviceCommand->Release();
|
||
|
|
||
|
if (NULL != service)
|
||
|
service->Release();
|
||
|
|
||
|
return fProcessed;
|
||
|
}
|
||
|
|
||
|
BOOL BrowserControl_ProcessStatusbarCommand(HWND hControl, INT commandId)
|
||
|
{
|
||
|
HWND hStatusbar = BrowserControl_GetStatusbar(hControl);
|
||
|
if (NULL == hStatusbar) return FALSE;
|
||
|
|
||
|
BOOL fProcessed = FALSE;
|
||
|
obj_ombrowser *browserManager;
|
||
|
if (FALSE != BrowserControl_GetBrowserObject(hControl, &browserManager) && NULL != browserManager)
|
||
|
{
|
||
|
ifc_omstatusbarconfig *statusbarConfig;
|
||
|
|
||
|
if (SUCCEEDED(browserManager->GetConfig(&IFC_OmStatusbarConfig, (void**)&statusbarConfig)))
|
||
|
{
|
||
|
UINT statusbarStyle = GetWindowStyle(hStatusbar);
|
||
|
switch(commandId)
|
||
|
{
|
||
|
case SBN_ENABLECHANGED:
|
||
|
statusbarConfig->EnableStatusbar(0 == (WS_DISABLED & statusbarStyle));
|
||
|
fProcessed = TRUE;
|
||
|
break;
|
||
|
}
|
||
|
statusbarConfig->Release();
|
||
|
}
|
||
|
browserManager->Release();
|
||
|
}
|
||
|
return fProcessed;
|
||
|
}
|
||
|
|
||
|
BOOL BrowserControl_ProcessToolbarCommand(HWND hControl, INT commandId)
|
||
|
{
|
||
|
HWND hToolbar = BrowserControl_GetToolbar(hControl);
|
||
|
if (NULL == hToolbar) return FALSE;
|
||
|
|
||
|
BOOL fProcessed = FALSE;
|
||
|
obj_ombrowser *browserManager;
|
||
|
if (FALSE != BrowserControl_GetBrowserObject(hControl, &browserManager) && NULL != browserManager)
|
||
|
{
|
||
|
ifc_omtoolbarconfig *toolbarConfig;
|
||
|
|
||
|
if (SUCCEEDED(browserManager->GetConfig(&IFC_OmToolbarConfig, (void**)&toolbarConfig)))
|
||
|
{
|
||
|
UINT toolbarStyle = GetWindowStyle(hToolbar);
|
||
|
switch(commandId)
|
||
|
{
|
||
|
case TBN_DOCKCHANGED:
|
||
|
toolbarConfig->EnableBottomDock(0 != (TBS_BOTTOMDOCK & toolbarStyle));
|
||
|
fProcessed = TRUE;
|
||
|
break;
|
||
|
case TBN_AUTOHIDECHANGED:
|
||
|
toolbarConfig->EnableAutoHide(0 != (TBS_AUTOHIDE & toolbarStyle));
|
||
|
fProcessed = TRUE;
|
||
|
break;
|
||
|
case TBN_TABSTOPCHANGED:
|
||
|
toolbarConfig->EnableTabStop(0 != (TBS_TABSTOP & toolbarStyle));
|
||
|
fProcessed = TRUE;
|
||
|
break;
|
||
|
}
|
||
|
toolbarConfig->Release();
|
||
|
}
|
||
|
browserManager->Release();
|
||
|
}
|
||
|
return fProcessed;
|
||
|
}
|
||
|
|
||
|
BOOL BrowserControl_ProcessAppCommand(HWND hControl, INT commandId)
|
||
|
{
|
||
|
if (NULL == hControl)
|
||
|
return FALSE;
|
||
|
|
||
|
switch(commandId)
|
||
|
{
|
||
|
case APPCOMMAND_BROWSER_BACKWARD: BrowserControl_ProcessCommonCommand(hControl, ID_NAVIGATION_BACK); return TRUE;
|
||
|
case APPCOMMAND_BROWSER_FORWARD: BrowserControl_ProcessCommonCommand(hControl, ID_NAVIGATION_FORWARD); return TRUE;
|
||
|
case APPCOMMAND_BROWSER_HOME: BrowserControl_ProcessCommonCommand(hControl, ID_NAVIGATION_HOME); return TRUE;
|
||
|
case APPCOMMAND_BROWSER_REFRESH: BrowserControl_ProcessCommonCommand(hControl, ID_NAVIGATION_REFRESH); return TRUE;
|
||
|
case APPCOMMAND_BROWSER_STOP: BrowserControl_ProcessCommonCommand(hControl, ID_NAVIGATION_STOP); return TRUE;
|
||
|
case APPCOMMAND_BROWSER_FAVORITES: return TRUE;
|
||
|
case APPCOMMAND_BROWSER_SEARCH: return TRUE;
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
HWND BrowserControl_GetOperationWidget(HWND hControl)
|
||
|
{
|
||
|
return GetDlgItem(hControl, IDC_OPERATIONWIDGET);
|
||
|
}
|
||
|
|
||
|
HWND BrowserControl_CreateOperationWidget(HWND hControl)
|
||
|
{
|
||
|
if (FALSE == Curtain_RegisterClass(Plugin_GetInstance()))
|
||
|
return NULL;
|
||
|
|
||
|
RECT rc;
|
||
|
HWND hTarget = BrowserControl_GetHost(hControl);
|
||
|
if (NULL == hTarget) hTarget = hControl;
|
||
|
|
||
|
if (FALSE == GetWindowRect(hTarget, &rc))
|
||
|
return NULL;
|
||
|
|
||
|
MapWindowPoints(HWND_DESKTOP, hControl, (POINT*)&rc, 2);
|
||
|
|
||
|
|
||
|
HWND hWidget = CreateWindowEx(WS_EX_NOPARENTNOTIFY | WS_EX_CONTROLPARENT,
|
||
|
NWC_ONLINEMEDIACURTAIN, NULL, WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS /*| WS_VISIBLE*/,
|
||
|
rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, hControl,
|
||
|
(HMENU)IDC_OPERATIONWIDGET, Plugin_GetInstance(), NULL);
|
||
|
|
||
|
|
||
|
return hWidget;
|
||
|
|
||
|
}
|
||
|
|
||
|
BOOL BrowserControl_OnShowOperation(HWND hControl, OPERATIONINFO *poi)
|
||
|
{
|
||
|
if (NULL == poi) return FALSE;
|
||
|
if (poi->cbSize != sizeof(OPERATIONINFO))
|
||
|
return FALSE;
|
||
|
|
||
|
BOOL updateSkin = FALSE;
|
||
|
HWND hWidget = BrowserControl_GetOperationWidget(hControl);
|
||
|
|
||
|
if (0 != (NBCOM_FLAGS & poi->mask))
|
||
|
{
|
||
|
if (0 != (NBCOF_SHOWWIDGET & poi->flags))
|
||
|
{
|
||
|
if (NULL == hWidget)
|
||
|
{
|
||
|
hWidget = BrowserControl_CreateOperationWidget(hControl);
|
||
|
if (NULL != hWidget)
|
||
|
updateSkin = TRUE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (0 != (NBCOF_HIDEWIDGET & poi->flags))
|
||
|
{
|
||
|
if (NULL != hWidget)
|
||
|
{
|
||
|
DestroyWindow(hWidget);
|
||
|
hWidget = NULL;
|
||
|
|
||
|
SetWindowPos(hControl, NULL, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE | SWP_NOMOVE |
|
||
|
SWP_FRAMECHANGED | SWP_ASYNCWINDOWPOS | SWP_DEFERERASE);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
if (0 != (NBCOM_TITLE & poi->mask))
|
||
|
{
|
||
|
if (NULL != hWidget)
|
||
|
SetWindowText(hWidget, poi->title);
|
||
|
}
|
||
|
|
||
|
if (0 != (NBCOM_TEXT & poi->mask))
|
||
|
{
|
||
|
if (NULL != hWidget)
|
||
|
Curtain_SetOperationText(hWidget, poi->text);
|
||
|
}
|
||
|
|
||
|
if (NULL != hWidget && 0 != (NBCOM_FLAGS & poi->mask) && 0 != (NBCOF_SHOWWIDGET & poi->flags))
|
||
|
{
|
||
|
if (FALSE != updateSkin)
|
||
|
{
|
||
|
PostMessage(hWidget, CWM_UPDATESKIN, 0, 0L);
|
||
|
SetWindowPos(hControl, NULL, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE | SWP_NOMOVE |
|
||
|
SWP_FRAMECHANGED | SWP_ASYNCWINDOWPOS | SWP_DEFERERASE);
|
||
|
}
|
||
|
|
||
|
ShowWindowAsync(hWidget, SW_SHOWNA);
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL BrowserControl_UpdateLayout(HWND hControl, BOOL fRedraw, BOOL fFrame, HRGN updateRegion, const POINT *updateOffset)
|
||
|
{
|
||
|
RECT clientRect;
|
||
|
if (!GetClientRect(hControl, &clientRect))
|
||
|
return FALSE;
|
||
|
|
||
|
UINT uFlags = SWP_NOZORDER | SWP_NOACTIVATE;
|
||
|
if (FALSE == fRedraw) uFlags |= SWP_NOREDRAW;
|
||
|
if (FALSE != fFrame) uFlags |= SWP_FRAMECHANGED;
|
||
|
|
||
|
HWND hToolbar, hBrowser, hStatusbar, hWidget;
|
||
|
|
||
|
BOOL toolbarSet = FALSE;
|
||
|
TOOLBARLAYOUT layout;
|
||
|
layout.prcParent = &clientRect;
|
||
|
|
||
|
HDWP hdwp = BeginDeferWindowPos(2);
|
||
|
if (NULL == hdwp) return FALSE;
|
||
|
|
||
|
if (NULL != (hToolbar = BrowserControl_GetToolbar(hControl)))
|
||
|
{
|
||
|
if (Toolbar_Layout(hToolbar, &layout))
|
||
|
{
|
||
|
toolbarSet = TRUE;
|
||
|
hdwp = DeferWindowPos(hdwp, hToolbar, layout.insertAfter, layout.toolbarRect.left, layout.toolbarRect.top,
|
||
|
layout.toolbarRect.right - layout.toolbarRect.left,
|
||
|
layout.toolbarRect.bottom - layout.toolbarRect.top, uFlags & ~SWP_NOZORDER);
|
||
|
if (NULL == hdwp) return FALSE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (FALSE == toolbarSet)
|
||
|
CopyRect(&layout.clientRect, layout.prcParent);
|
||
|
|
||
|
if (NULL != (hBrowser = BrowserControl_GetHost(hControl)))
|
||
|
{
|
||
|
if (0 != (NBHS_BROWSERREADY & GetWindowStyle(hBrowser)))
|
||
|
{
|
||
|
SetWindowPos(hBrowser, NULL, layout.clientRect.left, layout.clientRect.top,
|
||
|
layout.clientRect.right - layout.clientRect.left, layout.clientRect.bottom - layout.clientRect.top,
|
||
|
uFlags | SWP_ASYNCWINDOWPOS | SWP_DEFERERASE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (NULL != (hWidget = BrowserControl_GetOperationWidget(hControl)))
|
||
|
{
|
||
|
HWND hInsertAfter;
|
||
|
if (NULL != hBrowser) hInsertAfter = GetWindow(hBrowser, GW_HWNDPREV);
|
||
|
else if( NULL != hToolbar) hInsertAfter = GetWindow(hBrowser, GW_HWNDPREV);
|
||
|
else hInsertAfter = HWND_TOP;
|
||
|
|
||
|
UINT flags;
|
||
|
flags = uFlags;
|
||
|
if (hInsertAfter != hWidget)
|
||
|
flags &= ~SWP_NOZORDER;
|
||
|
|
||
|
hdwp = DeferWindowPos(hdwp, hWidget, hInsertAfter, layout.clientRect.left, layout.clientRect.top,
|
||
|
layout.clientRect.right - layout.clientRect.left, layout.clientRect.bottom - layout.clientRect.top, flags);
|
||
|
|
||
|
if (NULL == hdwp) return FALSE;
|
||
|
}
|
||
|
|
||
|
EndDeferWindowPos(hdwp);
|
||
|
|
||
|
|
||
|
if (NULL != (hStatusbar = BrowserControl_GetStatusbar(hControl)))
|
||
|
Statusbar_SetParentRect(hStatusbar, &layout.clientRect);
|
||
|
|
||
|
////////////////////////////////////
|
||
|
|
||
|
if (NULL != updateRegion)
|
||
|
{
|
||
|
RECT rect;
|
||
|
HRGN rgnValid = NULL;
|
||
|
|
||
|
if (NULL != hBrowser && 0 != (WS_VISIBLE & GetWindowStyle(hBrowser)) &&
|
||
|
FALSE != GetWindowRect(hBrowser, &rect))
|
||
|
{
|
||
|
MapWindowPoints(HWND_DESKTOP, hControl, (POINT*)&rect, 2);
|
||
|
rgnValid = CreateRectRgnIndirect(&rect);
|
||
|
}
|
||
|
|
||
|
if (NULL != rgnValid)
|
||
|
{
|
||
|
HRGN rgn = NULL;
|
||
|
HWND szControls[] = {hToolbar, hStatusbar, hWidget};
|
||
|
for (INT i = 0; i < ARRAYSIZE(szControls); i++)
|
||
|
{
|
||
|
if (NULL != szControls[i] && 0 != (WS_VISIBLE & GetWindowStyle(szControls[i])) &&
|
||
|
FALSE != GetWindowRect(szControls[i], &rect))
|
||
|
{
|
||
|
MapWindowPoints(HWND_DESKTOP, hControl, (POINT*)&rect, 2);
|
||
|
if (NULL == rgn) rgn = CreateRectRgnIndirect(&rect);
|
||
|
else SetRectRgn(rgn, rect.left, rect.top, rect.right, rect.bottom);
|
||
|
|
||
|
if (NULL != rgn)
|
||
|
CombineRgn(rgnValid, rgnValid, rgn, RGN_DIFF);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (NULL != updateOffset)
|
||
|
OffsetRgn(rgnValid, -updateOffset->x, -updateOffset->y);
|
||
|
|
||
|
CombineRgn(updateRegion, updateRegion, rgnValid, RGN_DIFF);
|
||
|
if (NULL != rgn) DeleteObject(rgn);
|
||
|
DeleteObject(rgnValid);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
BOOL BrowserControl_EnableChildren(HWND hControl, BOOL fEnable)
|
||
|
{
|
||
|
HWND hChild;
|
||
|
if (NULL != (hChild = BrowserControl_GetHost(hControl)))
|
||
|
PostMessage(hChild, NBHM_ENABLEWINDOW, 0, fEnable);
|
||
|
|
||
|
if (NULL != (hChild = BrowserControl_GetToolbar(hControl)))
|
||
|
EnableWindow(hChild, fEnable);
|
||
|
|
||
|
if (NULL != (hChild = BrowserControl_GetStatusbar(hControl)))
|
||
|
EnableWindow(hChild, fEnable);
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
BOOL BrowserControl_SetBlockedState(HWND hControl, BOOL fBlocked)
|
||
|
{
|
||
|
if (NULL == hControl)
|
||
|
return FALSE;
|
||
|
|
||
|
UINT prevStyle = BrowserControl_SetExtendedStyle(hControl, NBCS_EX_BLOCKNAVIGATION, (FALSE != fBlocked) ? NBCS_EX_BLOCKNAVIGATION : 0);
|
||
|
if (FALSE != fBlocked)
|
||
|
{
|
||
|
if (0 == (NBCS_EX_BLOCKNAVIGATION & prevStyle))
|
||
|
{
|
||
|
BrowserControl_EnableChildren(hControl, FALSE);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (0 != (NBCS_EX_BLOCKNAVIGATION & prevStyle))
|
||
|
{
|
||
|
BrowserControl_EnableChildren(hControl, TRUE);
|
||
|
}
|
||
|
BrowserControl_NavigateStoredUrl(hControl);
|
||
|
}
|
||
|
return TRUE;
|
||
|
}
|