mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-12-18 19:35:52 +01:00
994 lines
25 KiB
C++
994 lines
25 KiB
C++
#include "main.h"
|
|
#include "./managerView.h"
|
|
|
|
#define MANAGERVIEW_PROP L"NullsoftDevicesManagerViewProp"
|
|
|
|
#define VIEW_OFFSET_LEFT_PX 0
|
|
#define VIEW_OFFSET_TOP_PX 0
|
|
#define VIEW_OFFSET_RIGHT_PX 2
|
|
#define VIEW_OFFSET_BOTTOM_PX -1
|
|
|
|
#define DISCOVER_BUTTON_MIN_HEIGHT_PX 18
|
|
#define DISCOVER_BUTTON_MIN_WIDTH_PX 72
|
|
#define DISCOVER_BUTTON_EXTRA_SPACE_DLU 8
|
|
#define DISCOVER_BUTTON_SPACING_RIGHT_DLU 6
|
|
|
|
#define ZOOM_SLIDER_SPACING_LEFT_DLU 6
|
|
|
|
#define BOTTOM_BAR_OFFSET_TOP_DLU 2
|
|
|
|
|
|
#define MANAGERVIEW_WIDGET_ID 10000
|
|
#define MANAGERVIEW_STATUSBAR_ID 10001
|
|
|
|
static ATOM MANAGERVIEW_ATOM = 0;
|
|
|
|
|
|
typedef
|
|
enum ManagerViewState
|
|
{
|
|
MANAGERVIEW_STATE_FROZEN_UI = (1 << 0),
|
|
} WelcomeViewState;
|
|
DEFINE_ENUM_FLAG_OPERATORS(ManagerViewState);
|
|
|
|
#define MANAGERVIEW_IS_FROZEN(_view) (0 != (MANAGERVIEW_STATE_FROZEN_UI & (_view)->state))
|
|
#define MANAGERVIEW_FREEZE(_view) (((_view)->state) |= MANAGERVIEW_STATE_FROZEN_UI)
|
|
#define MANAGERVIEW_THAW(_view) (((_view)->state) &= ~MANAGERVIEW_STATE_FROZEN_UI)
|
|
|
|
#define MANAGERVIEW_DLU_TO_HORZ_PX(_view, _dlu) MulDiv((_dlu), (_view)->unitSize.cx, 4)
|
|
#define MANAGERVIEW_DLU_TO_VERT_PX(_view, _dlu) MulDiv((_dlu), (_view)->unitSize.cy, 8)
|
|
|
|
#define MANAGERVIEW_REGISTER_WIDGET(_widgetWindow) (SetWindowLongPtrW((_widgetWindow), GWLP_ID, MANAGERVIEW_WIDGET_ID))
|
|
#define MANAGERVIEW_WIDGET(_viewWindow) (GetDlgItem((_viewWindow), MANAGERVIEW_WIDGET_ID))
|
|
#define MANAGERVIEW_STATUS_BAR(_viewWindow) (GetDlgItem((_viewWindow), MANAGERVIEW_STATUSBAR_ID))
|
|
#define MANAGERVIEW_DISCOVER_BUTTON(_viewWindow) (GetDlgItem((_viewWindow), IDC_BUTTON_DISCOVER))
|
|
#define MANAGERVIEW_ZOOM_SLIDER(_viewWindow) (GetDlgItem((_viewWindow), IDC_SLIDER_ZOOM))
|
|
|
|
typedef struct ManagerView
|
|
{
|
|
ManagerViewState state;
|
|
WidgetStyle widgetStyle;
|
|
HFONT font;
|
|
HFONT systemFont;
|
|
COLORREF backColor;
|
|
COLORREF textColor;
|
|
COLORREF borderColor;
|
|
HBRUSH backBrush;
|
|
SIZE unitSize;
|
|
BOOL devicesPresent;
|
|
size_t deviceHandler;
|
|
HRGN updateRegion;
|
|
POINT updateOffset;
|
|
unsigned int discoveryStatus;
|
|
} ManagerView;
|
|
|
|
#define MANAGERVIEW(_hwnd) ((ManagerView*)GetPropW((_hwnd), MAKEINTATOM(MANAGERVIEW_ATOM)))
|
|
#define MANAGERVIEW_RET_VOID(_view, _hwnd) { (_view) = MANAGERVIEW((_hwnd)); if (NULL == (_view)) return; }
|
|
#define MANAGERVIEW_RET_VAL(_view, _hwnd, _error) { (_view) = MANAGERVIEW((_hwnd)); if (NULL == (_view)) return (_error); }
|
|
|
|
static INT_PTR CALLBACK
|
|
ManagerView_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
|
|
static void CALLBACK
|
|
ManagerView_PluginUnloadCb()
|
|
{
|
|
if (0 != MANAGERVIEW_ATOM)
|
|
{
|
|
GlobalDeleteAtom(MANAGERVIEW_ATOM);
|
|
MANAGERVIEW_ATOM = 0;
|
|
}
|
|
}
|
|
|
|
HWND ManagerView_CreateWindow(HWND parentWindow)
|
|
{
|
|
if (0 == MANAGERVIEW_ATOM)
|
|
{
|
|
MANAGERVIEW_ATOM = GlobalAddAtom(MANAGERVIEW_PROP);
|
|
if (0 == MANAGERVIEW_ATOM)
|
|
return NULL;
|
|
|
|
Plugin_RegisterUnloadCallback(ManagerView_PluginUnloadCb);
|
|
}
|
|
|
|
HWND hwnd = WASABI_API_CREATEDIALOGPARAMW((INT_PTR)IDD_MANAGER_VIEW, parentWindow,
|
|
ManagerView_DialogProc, (LPARAM)0L);
|
|
|
|
return hwnd;
|
|
}
|
|
|
|
static void
|
|
ManagerView_Layout(HWND hwnd, BOOL redraw)
|
|
{
|
|
ManagerView *self = NULL;
|
|
RECT clientRect, elementRect;
|
|
LONG bottomBarHeight = 0, buttonWidth = 0, sliderWidth = 0;
|
|
|
|
MANAGERVIEW_RET_VOID(self, hwnd);
|
|
|
|
GetClientRect(hwnd, &clientRect);
|
|
clientRect.left += VIEW_OFFSET_LEFT_PX;
|
|
clientRect.top += VIEW_OFFSET_TOP_PX;
|
|
clientRect.right -= VIEW_OFFSET_RIGHT_PX;
|
|
clientRect.bottom -= VIEW_OFFSET_BOTTOM_PX;
|
|
|
|
HDWP hdwp = BeginDeferWindowPos(4);
|
|
if (NULL == hdwp)
|
|
return;
|
|
|
|
UINT swpFlags = SWP_NOACTIVATE | SWP_NOZORDER;
|
|
if (FALSE == redraw)
|
|
swpFlags |= SWP_NOREDRAW;
|
|
|
|
HWND buttonWindow = MANAGERVIEW_DISCOVER_BUTTON(hwnd);
|
|
if (NULL != buttonWindow)
|
|
{
|
|
if (FALSE != GetWindowRect(buttonWindow, &elementRect))
|
|
{
|
|
wchar_t buffer[128] = {0};
|
|
GetWindowText(buttonWindow, buffer, ARRAYSIZE(buffer));
|
|
LRESULT idealSize = MLSkinnedButton_GetIdealSize(buttonWindow, buffer);
|
|
|
|
hdwp = DeferWindowPos(hdwp, buttonWindow, NULL, clientRect.left + 1,
|
|
clientRect.bottom - WASABI_API_APP->getScaleY(HIWORD(idealSize)) - WASABI_API_APP->getScaleY(1),
|
|
RECTWIDTH(elementRect), WASABI_API_APP->getScaleY(HIWORD(idealSize)), swpFlags);
|
|
|
|
bottomBarHeight = WASABI_API_APP->getScaleY(HIWORD(idealSize));
|
|
buttonWidth = RECTWIDTH(elementRect);
|
|
}
|
|
}
|
|
|
|
HWND sliderWindow = MANAGERVIEW_ZOOM_SLIDER(hwnd);
|
|
if (NULL != sliderWindow)
|
|
{
|
|
if (0 != (WS_VISIBLE & GetWindowStyle(sliderWindow)) &&
|
|
FALSE != GetWindowRect(sliderWindow, &elementRect))
|
|
{
|
|
hdwp = DeferWindowPos(hdwp, sliderWindow, NULL, clientRect.right - RECTWIDTH(elementRect),
|
|
clientRect.bottom - RECTHEIGHT(elementRect),
|
|
RECTWIDTH(elementRect), RECTHEIGHT(elementRect), swpFlags);
|
|
sliderWidth = RECTWIDTH(elementRect);
|
|
}
|
|
}
|
|
|
|
HWND statusBar = MANAGERVIEW_STATUS_BAR(hwnd);
|
|
if (NULL != statusBar)
|
|
{
|
|
long statusBarHeight = 0;
|
|
CopyRect(&elementRect, &clientRect);
|
|
|
|
if (0 != buttonWidth)
|
|
{
|
|
elementRect.left += buttonWidth;
|
|
elementRect.left += MANAGERVIEW_DLU_TO_HORZ_PX(self, DISCOVER_BUTTON_SPACING_RIGHT_DLU);
|
|
if (elementRect.left > clientRect.right)
|
|
elementRect.left = clientRect.right;
|
|
}
|
|
|
|
if (0 != sliderWidth)
|
|
{
|
|
elementRect.right -= sliderWidth;
|
|
elementRect.right -= MANAGERVIEW_DLU_TO_HORZ_PX(self, ZOOM_SLIDER_SPACING_LEFT_DLU);
|
|
if (elementRect.left > elementRect.right)
|
|
elementRect.right = elementRect.left;
|
|
}
|
|
|
|
statusBarHeight = STATUSBAR_GET_IDEAL_HEIGHT(statusBar);
|
|
if (statusBarHeight > bottomBarHeight)
|
|
statusBarHeight = 0;
|
|
|
|
elementRect.top = elementRect.bottom - statusBarHeight - WASABI_API_APP->getScaleY(3);
|
|
elementRect.bottom = elementRect.top + statusBarHeight;
|
|
|
|
hdwp = DeferWindowPos(hdwp, statusBar, NULL, elementRect.left, elementRect.top,
|
|
RECTWIDTH(elementRect), RECTHEIGHT(elementRect), swpFlags);
|
|
}
|
|
|
|
HWND widgetWindow = MANAGERVIEW_WIDGET(hwnd);
|
|
if (NULL != widgetWindow)
|
|
{
|
|
CopyRect(&elementRect, &clientRect);
|
|
if (0 != bottomBarHeight)
|
|
{
|
|
elementRect.bottom -= (bottomBarHeight + WASABI_API_APP->getScaleY(4));
|
|
}
|
|
|
|
Graphics_ClampRect(&elementRect, &clientRect);
|
|
|
|
if (NULL != hdwp)
|
|
{
|
|
hdwp = DeferWindowPos(hdwp, widgetWindow, NULL, elementRect.left, elementRect.top,
|
|
RECTWIDTH(elementRect), RECTHEIGHT(elementRect), swpFlags);
|
|
}
|
|
}
|
|
|
|
if (NULL != hdwp)
|
|
EndDeferWindowPos(hdwp);
|
|
}
|
|
|
|
static BOOL
|
|
ManagerView_Paint(HWND hwnd, HDC hdc, const RECT *paintRect, BOOL erase)
|
|
{
|
|
ManagerView *self;
|
|
MANAGERVIEW_RET_VAL(self, hwnd, FALSE);
|
|
|
|
if (FALSE != erase)
|
|
{
|
|
HRGN fillRegion;
|
|
fillRegion = CreateRectRgnIndirect(paintRect);
|
|
FillRgn(hdc, fillRegion, self->backBrush);
|
|
DeleteObject(fillRegion);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
static void
|
|
ManagerView_UpdateSkin(HWND hwnd)
|
|
{
|
|
ManagerView *self;
|
|
MANAGERVIEW_RET_VOID(self, hwnd);
|
|
|
|
BOOL styleChanged = FALSE;
|
|
COLORREF color = Graphics_GetSkinColor(WADLG_WNDBG);
|
|
if (color != self->backColor || NULL == self->backBrush)
|
|
{
|
|
self->backColor = color;
|
|
self->backBrush = CreateSolidBrush(self->backColor);
|
|
styleChanged = TRUE;
|
|
}
|
|
|
|
color = Graphics_GetSkinColor(WADLG_WNDFG);
|
|
if (self->textColor != color)
|
|
{
|
|
self->textColor = color;
|
|
styleChanged = TRUE;
|
|
}
|
|
|
|
color = Graphics_GetSkinColor(WADLG_HILITE);
|
|
if (self->borderColor != color)
|
|
{
|
|
self->borderColor = color;
|
|
styleChanged = TRUE;
|
|
}
|
|
|
|
if (FALSE != WidgetStyle_UpdateDefaultColors(&self->widgetStyle))
|
|
styleChanged = TRUE;
|
|
|
|
if (FALSE != styleChanged)
|
|
{
|
|
HWND controlWindow = MANAGERVIEW_WIDGET(hwnd);
|
|
if (NULL != controlWindow)
|
|
{
|
|
WIDGET_STYLE_COLOR_CHANGED(controlWindow);
|
|
InvalidateRect(controlWindow, NULL, TRUE);
|
|
}
|
|
|
|
controlWindow = MANAGERVIEW_STATUS_BAR(hwnd);
|
|
if (NULL != controlWindow)
|
|
{
|
|
STATUSBAR_SET_TEXT_COLOR(controlWindow, self->textColor, FALSE);
|
|
STATUSBAR_SET_BACK_COLOR(controlWindow, self->backColor, FALSE);
|
|
STATUSBAR_SET_BACK_BRUSH(controlWindow, self->backBrush, FALSE);
|
|
}
|
|
}
|
|
}
|
|
|
|
static BOOL
|
|
ManagerView_GetIdealButtonSize(HWND buttonWindow, SIZE *buttonSize)
|
|
{
|
|
if (NULL == buttonWindow || NULL == buttonSize)
|
|
return FALSE;
|
|
|
|
LRESULT skinSize = MLSkinnedButton_GetIdealSize(buttonWindow, NULL);
|
|
if (0 != skinSize)
|
|
{
|
|
buttonSize->cx = LOWORD(skinSize);
|
|
buttonSize->cy = HIWORD(skinSize);
|
|
return TRUE;
|
|
}
|
|
|
|
buttonSize->cx = 0;
|
|
buttonSize->cy = 0;
|
|
if (FALSE != SendMessageW(buttonWindow, BCM_GETIDEALSIZE, 0, (LPARAM)buttonSize))
|
|
return TRUE;
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
static BOOL
|
|
ManagerView_UpdateDiscoverButtonFont(HWND hwnd, HFONT font, SIZE *size)
|
|
{
|
|
ManagerView *self;
|
|
SIZE buttonSize;
|
|
|
|
MANAGERVIEW_RET_VAL(self, hwnd, FALSE);
|
|
|
|
HWND buttonWindow = MANAGERVIEW_DISCOVER_BUTTON(hwnd);
|
|
if (NULL == buttonWindow)
|
|
return FALSE;
|
|
|
|
SendMessage(buttonWindow, WM_SETFONT, (WPARAM)font, MAKELPARAM(0,0));
|
|
|
|
if (FALSE == ManagerView_GetIdealButtonSize(buttonWindow, &buttonSize))
|
|
{
|
|
RECT buttonRect;
|
|
if (FALSE == GetWindowRect(buttonWindow, &buttonRect))
|
|
return FALSE;
|
|
|
|
buttonSize.cx = RECTWIDTH(buttonRect);
|
|
buttonSize.cy = RECTHEIGHT(buttonRect);
|
|
}
|
|
|
|
buttonSize.cx += MANAGERVIEW_DLU_TO_HORZ_PX(self, DISCOVER_BUTTON_EXTRA_SPACE_DLU);
|
|
|
|
if (buttonSize.cx < DISCOVER_BUTTON_MIN_WIDTH_PX)
|
|
buttonSize.cx = DISCOVER_BUTTON_MIN_WIDTH_PX;
|
|
|
|
if (buttonSize.cy < DISCOVER_BUTTON_MIN_HEIGHT_PX)
|
|
buttonSize.cy = DISCOVER_BUTTON_MIN_HEIGHT_PX;
|
|
|
|
BOOL result = SetWindowPos(buttonWindow, NULL, 0, 0, buttonSize.cx, buttonSize.cy,
|
|
SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOMOVE | SWP_NOREDRAW);
|
|
if (FALSE == result)
|
|
return FALSE;
|
|
|
|
if (NULL != size)
|
|
*size = buttonSize;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
static void
|
|
ManagerView_UpdateFont(HWND hwnd, BOOL redraw)
|
|
{
|
|
HWND controlWindow = NULL;
|
|
ManagerView *self = NULL;
|
|
MANAGERVIEW_RET_VOID(self, hwnd);
|
|
|
|
if (FALSE == Graphics_GetWindowBaseUnits(hwnd, &self->unitSize.cx, &self->unitSize.cy))
|
|
{
|
|
self->unitSize.cx = 6;
|
|
self->unitSize.cy = 13;
|
|
}
|
|
|
|
if (FALSE != WidgetStyle_UpdateDefaultFonts(&self->widgetStyle, self->font, self->unitSize.cx, self->unitSize.cy))
|
|
{
|
|
controlWindow = MANAGERVIEW_WIDGET(hwnd);
|
|
if (NULL != controlWindow)
|
|
WIDGET_STYLE_FONT_CHANGED(controlWindow);
|
|
}
|
|
|
|
ManagerView_UpdateDiscoverButtonFont(hwnd, self->font, NULL);
|
|
|
|
controlWindow = MANAGERVIEW_STATUS_BAR(hwnd);
|
|
if (NULL != controlWindow)
|
|
SendMessage(controlWindow, WM_SETFONT, (WPARAM)self->font, 0L);
|
|
|
|
if (NULL != redraw)
|
|
{
|
|
SetWindowPos(hwnd, NULL, 0, 0, 0, 0,
|
|
SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE |SWP_NOMOVE |SWP_FRAMECHANGED | SWP_NOREDRAW);
|
|
|
|
RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN | RDW_ERASE);
|
|
}
|
|
}
|
|
|
|
static void
|
|
ManagerView_UpdateDiscoveryStatus(HWND hwnd, BOOL discoveryActive)
|
|
{
|
|
ManagerView *self;
|
|
MANAGERVIEW_RET_VOID(self, hwnd);
|
|
|
|
HWND statusBar = MANAGERVIEW_STATUS_BAR(hwnd);
|
|
if (NULL == statusBar)
|
|
return;
|
|
|
|
if (FALSE != discoveryActive)
|
|
{
|
|
wchar_t buffer[512] = {0};
|
|
|
|
WASABI_API_LNGSTRINGW_BUF(IDS_STATUS_DISCOVERY_ACTIVE, buffer, ARRAYSIZE(buffer));
|
|
|
|
if (STATUS_ERROR == self->discoveryStatus)
|
|
self->discoveryStatus = STATUSBAR_ADD_STATUS(statusBar, buffer);
|
|
else
|
|
{
|
|
STATUSBAR_SET_STATUS_TEXT(statusBar, self->discoveryStatus, buffer);
|
|
STATUSBAR_MOVE_STATUS(statusBar, self->discoveryStatus, STATUS_MOVE_TOP);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (STATUS_ERROR != self->discoveryStatus)
|
|
{
|
|
STATUSBAR_REMOVE_STATUS(statusBar, self->discoveryStatus);
|
|
self->discoveryStatus = STATUS_ERROR;
|
|
}
|
|
}
|
|
}
|
|
|
|
static HWND
|
|
ManagerView_CreateServiceErrorWidget(HWND hwnd)
|
|
{
|
|
return InfoWidget_CreateWindow(WIDGET_TYPE_SERVICE_ERROR,
|
|
MAKEINTRESOURCE(IDS_INFOWIDGET_TITLE),
|
|
MAKEINTRESOURCE(IDS_DEVICE_SERVICE_NOT_FOUND),
|
|
NULL,
|
|
hwnd, 0, 0, 0, 0, TRUE, 0);
|
|
}
|
|
|
|
static HWND
|
|
ManagerView_CreateViewErrorWidget(HWND hwnd)
|
|
{
|
|
return InfoWidget_CreateWindow(WIDGET_TYPE_VIEW_ERROR,
|
|
MAKEINTRESOURCE(IDS_INFOWIDGET_TITLE),
|
|
MAKEINTRESOURCE(IDS_CREATE_MANAGER_VIEW_FAILED),
|
|
NULL,
|
|
hwnd, 0, 0, 0, 0, TRUE, 0);
|
|
}
|
|
|
|
static HWND
|
|
ManagerView_UpdateWidget(HWND hwnd)
|
|
{
|
|
ManagerView *self;
|
|
unsigned int widgetType, requiredType;
|
|
unsigned int windowStyle;
|
|
|
|
MANAGERVIEW_RET_VAL(self, hwnd, NULL);
|
|
|
|
HWND widgetWindow = MANAGERVIEW_WIDGET(hwnd);
|
|
if (NULL == widgetWindow)
|
|
widgetType = WIDGET_TYPE_UNKNOWN;
|
|
else
|
|
widgetType = WIDGET_GET_TYPE(widgetWindow);
|
|
|
|
if (FALSE != self->devicesPresent)
|
|
requiredType = WIDGET_TYPE_LIST;
|
|
else
|
|
{
|
|
requiredType = (NULL != WASABI_API_DEVICES) ?
|
|
WIDGET_TYPE_WELCOME :
|
|
WIDGET_TYPE_SERVICE_ERROR;
|
|
}
|
|
|
|
if (widgetType == requiredType)
|
|
return widgetWindow;
|
|
|
|
windowStyle = GetWindowStyle(hwnd);
|
|
if (0 != (WS_VISIBLE & windowStyle))
|
|
SetWindowStyle(hwnd, windowStyle & ~WS_VISIBLE);
|
|
|
|
if (NULL != widgetWindow)
|
|
{
|
|
SetWindowLongPtr(widgetWindow, GWLP_ID, 0);
|
|
WIDGET_FREEZE(widgetWindow);
|
|
DestroyWindow(widgetWindow);
|
|
}
|
|
|
|
switch(requiredType)
|
|
{
|
|
case WIDGET_TYPE_SERVICE_ERROR:
|
|
widgetWindow = ManagerView_CreateServiceErrorWidget(hwnd);
|
|
break;
|
|
case WIDGET_TYPE_WELCOME:
|
|
widgetWindow = WelcomeWidget_CreateWindow(hwnd, 0, 0, 0, 0, TRUE, 0);
|
|
break;
|
|
case WIDGET_TYPE_LIST:
|
|
widgetWindow = ListWidget_CreateWindow(hwnd, 0, 0, 0, 0, TRUE, 0);
|
|
break;
|
|
default:
|
|
widgetWindow = NULL;
|
|
break;
|
|
}
|
|
|
|
if (NULL == widgetWindow)
|
|
widgetWindow = ManagerView_CreateViewErrorWidget(hwnd);
|
|
|
|
if (NULL != widgetWindow)
|
|
{
|
|
if (FALSE != MANAGERVIEW_IS_FROZEN(self))
|
|
WIDGET_FREEZE(widgetWindow);
|
|
|
|
MANAGERVIEW_REGISTER_WIDGET(widgetWindow);
|
|
|
|
WIDGET_SET_STYLE(widgetWindow, &self->widgetStyle);
|
|
}
|
|
|
|
SetWindowPos(hwnd, NULL, 0, 0, 0, 0,
|
|
SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOREDRAW | SWP_FRAMECHANGED);
|
|
|
|
if (NULL != widgetWindow)
|
|
{
|
|
ShowWindow(widgetWindow, SW_SHOWNA);
|
|
|
|
SetWindowPos(widgetWindow, HWND_TOP, 0, 0, 0, 0,
|
|
SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
|
|
}
|
|
|
|
if (0 != (WS_VISIBLE & windowStyle))
|
|
{
|
|
windowStyle = GetWindowStyle(hwnd);
|
|
if (0 == (WS_VISIBLE & windowStyle))
|
|
{
|
|
windowStyle |= WS_VISIBLE;
|
|
SetWindowStyle(hwnd, windowStyle);
|
|
}
|
|
}
|
|
|
|
if (0 != (WS_VISIBLE & windowStyle))
|
|
{
|
|
RECT rect;
|
|
GetClientRect(hwnd, &rect);
|
|
|
|
RedrawWindow(hwnd, &rect, NULL,
|
|
RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW | RDW_ERASENOW | RDW_ALLCHILDREN);
|
|
}
|
|
|
|
return widgetWindow;
|
|
}
|
|
|
|
static void
|
|
ManagerView_StartDiscovery(HWND hwnd, BOOL silent)
|
|
{
|
|
Plugin_BeginDiscovery();
|
|
}
|
|
|
|
static BOOL
|
|
ManagerView_CheckDevicesPresent()
|
|
{
|
|
ifc_deviceobjectenum *enumerator = 0;
|
|
ifc_deviceobject *object = 0;
|
|
ifc_device *device = 0;
|
|
|
|
BOOL devicesPresent = FALSE;
|
|
|
|
if (NULL == WASABI_API_DEVICES ||
|
|
FAILED(WASABI_API_DEVICES->DeviceEnumerate(&enumerator)))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
while(S_OK == enumerator->Next(&object, 1, NULL))
|
|
{
|
|
if (SUCCEEDED(object->QueryInterface(IFC_Device, (void**)&device)))
|
|
{
|
|
if(FALSE == device->GetHidden() &&
|
|
// excludes 'cloud' devices from appearing
|
|
lstrcmpiA(device->GetConnection(), "cloud"))
|
|
devicesPresent = TRUE;
|
|
|
|
device->Release();
|
|
}
|
|
object->Release();
|
|
|
|
if (FALSE != devicesPresent)
|
|
break;
|
|
}
|
|
enumerator->Release();
|
|
|
|
return devicesPresent;
|
|
}
|
|
|
|
static void
|
|
ManagerView_AddDevice(HWND hwnd, ifc_device *device)
|
|
{
|
|
ManagerView *self;
|
|
|
|
MANAGERVIEW_RET_VOID(self, hwnd);
|
|
|
|
if (FALSE != self->devicesPresent)
|
|
return;
|
|
|
|
self->devicesPresent = ManagerView_CheckDevicesPresent();
|
|
if (FALSE != self->devicesPresent)
|
|
ManagerView_UpdateWidget(hwnd);
|
|
}
|
|
|
|
static void
|
|
ManagerView_RemoveDevice(HWND hwnd, ifc_device *device)
|
|
{
|
|
ManagerView *self;
|
|
MANAGERVIEW_RET_VOID(self, hwnd);
|
|
|
|
if (FALSE == self->devicesPresent)
|
|
return;
|
|
|
|
self->devicesPresent = ManagerView_CheckDevicesPresent();
|
|
if (FALSE == self->devicesPresent)
|
|
ManagerView_UpdateWidget(hwnd);
|
|
}
|
|
|
|
static void
|
|
ManagerView_DeviceCb(ifc_device *device, DeviceEvent eventId, void *user)
|
|
{
|
|
HWND hwnd = (HWND)user;
|
|
|
|
switch(eventId)
|
|
{
|
|
case Event_DeviceAdded:
|
|
ManagerView_AddDevice(hwnd, device);
|
|
break;
|
|
|
|
case Event_DeviceRemoved:
|
|
ManagerView_RemoveDevice(hwnd, device);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void
|
|
ManagerView_DiscoveryCb(api_devicemanager *manager, DeviceDiscoveryEvent eventId, void *user)
|
|
{
|
|
HWND hwnd = (HWND)user;
|
|
|
|
switch(eventId)
|
|
{
|
|
case Event_DiscoveryStarted:
|
|
ManagerView_UpdateDiscoveryStatus(hwnd, TRUE);
|
|
break;
|
|
|
|
case Event_DiscoveryFinished:
|
|
ManagerView_UpdateDiscoveryStatus(hwnd, FALSE);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static BOOL
|
|
ManagerView_RegisterDeviceHandler(HWND hwnd)
|
|
{
|
|
ManagerView *self;
|
|
DeviceEventCallbacks callbacks;
|
|
|
|
MANAGERVIEW_RET_VAL(self, hwnd, FALSE);
|
|
|
|
if (0 != self->deviceHandler)
|
|
return FALSE;
|
|
|
|
HWND eventRelay = Plugin_GetEventRelayWindow();
|
|
if (NULL == eventRelay)
|
|
return FALSE;
|
|
|
|
ZeroMemory(&callbacks, sizeof(callbacks));
|
|
callbacks.deviceCb = ManagerView_DeviceCb;
|
|
callbacks.discoveryCb = ManagerView_DiscoveryCb;
|
|
|
|
self->deviceHandler = EVENTRELAY_REGISTER_HANDLER(eventRelay, &callbacks, hwnd);
|
|
return (0 != self->deviceHandler);
|
|
}
|
|
|
|
static void
|
|
ManagerView_OnDisplayChanged(HWND hwnd, INT bpp, INT dpi_x, INT dpi_y)
|
|
{
|
|
ManagerView *self = NULL;
|
|
MANAGERVIEW_RET_VOID(self, hwnd);
|
|
|
|
if (FALSE != MANAGERVIEW_IS_FROZEN(self))
|
|
return;
|
|
|
|
ManagerView_UpdateSkin(hwnd);
|
|
|
|
RECT rc;
|
|
GetClientRect(hwnd, &rc);
|
|
RedrawWindow(hwnd, &rc, NULL, RDW_INVALIDATE | RDW_ERASE | RDW_ALLCHILDREN | RDW_ERASENOW | RDW_UPDATENOW);
|
|
|
|
ManagerView_Layout(hwnd, TRUE);
|
|
}
|
|
|
|
static INT_PTR
|
|
ManagerView_OnInitDialog(HWND hwnd, HWND focusWindow, LPARAM param)
|
|
{
|
|
ManagerView *self = (ManagerView*)malloc(sizeof(ManagerView));
|
|
if (NULL != self)
|
|
{
|
|
ZeroMemory(self, sizeof(ManagerView));
|
|
if (FALSE == SetProp(hwnd, MAKEINTATOM(MANAGERVIEW_ATOM), self))
|
|
{
|
|
free(self);
|
|
self = NULL;
|
|
}
|
|
}
|
|
|
|
if (NULL == self)
|
|
{
|
|
DestroyWindow(hwnd);
|
|
return 0;
|
|
}
|
|
|
|
MANAGERVIEW_FREEZE(self);
|
|
|
|
ManagerView_RegisterDeviceHandler(hwnd);
|
|
|
|
self->devicesPresent = ManagerView_CheckDevicesPresent();
|
|
|
|
MLSkinWindow2(Plugin_GetLibraryWindow(), hwnd, SKINNEDWND_TYPE_DIALOG,
|
|
SWS_USESKINFONT | SWS_USESKINCOLORS | SWS_USESKINCURSORS);
|
|
|
|
HWND discoverButton = MANAGERVIEW_DISCOVER_BUTTON(hwnd);
|
|
if (NULL != discoverButton)
|
|
{
|
|
MLSkinWindow2(Plugin_GetLibraryWindow(), discoverButton, SKINNEDWND_TYPE_BUTTON,
|
|
SWS_USESKINFONT | SWS_USESKINCOLORS | SWS_USESKINCURSORS);
|
|
|
|
ShowWindow(discoverButton, SW_SHOW);
|
|
EnableWindow(discoverButton, TRUE);
|
|
}
|
|
|
|
HWND statusBar = StatusBar_CreateWindow(0, NULL, WS_VISIBLE, 0, 0, 0, 0, hwnd, MANAGERVIEW_STATUSBAR_ID);
|
|
if (NULL != statusBar)
|
|
{
|
|
MLSkinWindow2(Plugin_GetLibraryWindow(), statusBar, SKINNEDWND_TYPE_AUTO,
|
|
SWS_USESKINFONT | SWS_USESKINCOLORS | SWS_USESKINCURSORS);
|
|
}
|
|
|
|
self->discoveryStatus = STATUS_ERROR;
|
|
|
|
if (S_OK == WASABI_API_DEVICES->IsDiscoveryActive())
|
|
ManagerView_UpdateDiscoveryStatus(hwnd, TRUE);
|
|
|
|
ManagerView_UpdateFont(hwnd, FALSE);
|
|
ManagerView_UpdateSkin(hwnd);
|
|
|
|
HWND widgetWindow = ManagerView_UpdateWidget(hwnd);
|
|
MANAGERVIEW_THAW(self);
|
|
|
|
if (NULL != widgetWindow)
|
|
WIDGET_THAW(widgetWindow);
|
|
|
|
PostMessage(hwnd, WM_DISPLAYCHANGE, 0, 0);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void
|
|
ManagerView_OnDestroy(HWND hwnd)
|
|
{
|
|
ManagerView *self = MANAGERVIEW(hwnd);
|
|
RemoveProp(hwnd, MAKEINTATOM(MANAGERVIEW_ATOM));
|
|
|
|
if (NULL == self)
|
|
return;
|
|
|
|
MANAGERVIEW_FREEZE(self);
|
|
|
|
if (0 != self->deviceHandler)
|
|
{
|
|
HWND eventRelay = Plugin_GetEventRelayWindow();
|
|
if (NULL != eventRelay)
|
|
{
|
|
EVENTRELAY_UNREGISTER_HANDLER(eventRelay, self->deviceHandler);
|
|
}
|
|
}
|
|
|
|
if (NULL != self->systemFont)
|
|
DeleteObject(self->systemFont);
|
|
|
|
if (NULL != self->backBrush)
|
|
DeleteObject(self->backBrush);
|
|
|
|
WidgetStyle_Free(&self->widgetStyle);
|
|
free(self);
|
|
}
|
|
|
|
static LRESULT
|
|
ManagerView_OnColorDialog(HWND hwnd, HDC hdc)
|
|
{
|
|
ManagerView *self;
|
|
self = MANAGERVIEW(hwnd);
|
|
|
|
if (NULL == self)
|
|
return DefWindowProcW(hwnd, WM_CTLCOLORDLG, (WPARAM)hdc, (LPARAM)hwnd);
|
|
|
|
if (NULL != hdc)
|
|
{
|
|
SetTextColor(hdc, self->textColor);
|
|
SetBkColor(hdc, self->backColor);
|
|
}
|
|
|
|
return (LRESULT)self->backBrush;
|
|
}
|
|
|
|
static void
|
|
ManagerView_OnWindowPosChanged(HWND hwnd, WINDOWPOS *windowPos)
|
|
{
|
|
if ((SWP_NOSIZE | SWP_NOMOVE) != ((SWP_NOSIZE | SWP_NOMOVE) & windowPos->flags) ||
|
|
(SWP_FRAMECHANGED & windowPos->flags))
|
|
{
|
|
ManagerView *self;
|
|
MANAGERVIEW_RET_VOID(self, hwnd);
|
|
|
|
if (FALSE != MANAGERVIEW_IS_FROZEN(self))
|
|
return;
|
|
|
|
ManagerView_Layout(hwnd, !(SWP_NOREDRAW & windowPos->flags));
|
|
}
|
|
}
|
|
|
|
static void
|
|
ManagerView_OnPaint(HWND hwnd)
|
|
{
|
|
PAINTSTRUCT ps;
|
|
|
|
if (NULL != BeginPaint(hwnd, &ps))
|
|
{
|
|
ManagerView_Paint(hwnd, ps.hdc, &ps.rcPaint, ps.fErase);
|
|
EndPaint(hwnd, &ps);
|
|
}
|
|
}
|
|
|
|
static void
|
|
ManagerView_OnPrintClient(HWND hwnd, HDC hdc, UINT options)
|
|
{
|
|
RECT clientRect;
|
|
if (GetClientRect(hwnd, &clientRect))
|
|
{
|
|
ManagerView_Paint(hwnd, hdc, &clientRect, TRUE);
|
|
}
|
|
}
|
|
|
|
static void
|
|
ManagerView_OnSetFont(HWND hwnd, HFONT font, BOOL redraw)
|
|
{
|
|
ManagerView *self = NULL;
|
|
LOGFONTW prevFont = {0}, newFont = {0};
|
|
|
|
MANAGERVIEW_RET_VOID(self, hwnd);
|
|
|
|
if (NULL == self->font ||
|
|
sizeof(LOGFONTW) != GetObjectW(self->font, sizeof(prevFont), &prevFont))
|
|
{
|
|
ZeroMemory(&prevFont, sizeof(prevFont));
|
|
}
|
|
|
|
self->font = font;
|
|
if (NULL == self->font)
|
|
{
|
|
if (NULL == self->systemFont)
|
|
self->systemFont = Graphics_CreateSysFont();
|
|
}
|
|
|
|
if (NULL == self->font ||
|
|
sizeof(newFont) != GetObjectW(self->font, sizeof(newFont), &newFont))
|
|
{
|
|
ZeroMemory(&newFont, sizeof(newFont));
|
|
}
|
|
|
|
if (0 == memcmp(&prevFont, &newFont, sizeof(prevFont)) ||
|
|
FALSE != MANAGERVIEW_IS_FROZEN(self))
|
|
{
|
|
redraw = FALSE;
|
|
}
|
|
|
|
ManagerView_UpdateFont(hwnd, redraw);
|
|
}
|
|
|
|
static HFONT
|
|
ManagerView_OnGetFont(HWND hwnd)
|
|
{
|
|
ManagerView *self;
|
|
MANAGERVIEW_RET_VAL(self, hwnd, NULL);
|
|
|
|
return self->font;
|
|
}
|
|
|
|
static void
|
|
ManagerView_OnCommand(HWND hwnd, INT commandId, INT eventId, HWND controlWindow)
|
|
{
|
|
switch(commandId)
|
|
{
|
|
case IDC_BUTTON_DISCOVER:
|
|
switch(eventId)
|
|
{
|
|
case BN_CLICKED:
|
|
ManagerView_StartDiscovery(hwnd, FALSE);
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void
|
|
ManagerView_OnZoomSliderPosChanging(HWND hwnd, NMTRBTHUMBPOSCHANGING *sliderInfo)
|
|
{
|
|
HWND widgetWindow = MANAGERVIEW_WIDGET(hwnd);
|
|
if (NULL != widgetWindow)
|
|
WIDGET_ZOOM_SLIDER_POS_CHANGING(widgetWindow, sliderInfo);
|
|
}
|
|
|
|
static LRESULT
|
|
ManagerView_OnNotify(HWND hwnd, NMHDR *pnmh)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static void
|
|
ManagerView_OnHorzScroll(HWND hwnd, INT action, INT trackPosition, HWND senderWindow)
|
|
{
|
|
HWND sliderWindow = MANAGERVIEW_ZOOM_SLIDER(hwnd);
|
|
if (NULL != sliderWindow && senderWindow == sliderWindow)
|
|
{
|
|
NMTRBTHUMBPOSCHANGING zoomInfo;
|
|
zoomInfo.hdr.code = TRBN_THUMBPOSCHANGING;
|
|
zoomInfo.hdr.hwndFrom = senderWindow;
|
|
zoomInfo.hdr.idFrom = IDC_SLIDER_ZOOM;
|
|
zoomInfo.nReason = action;
|
|
if (TB_THUMBPOSITION == action ||
|
|
TB_THUMBTRACK == action)
|
|
{
|
|
zoomInfo.dwPos = trackPosition;
|
|
}
|
|
else
|
|
zoomInfo.dwPos = (DWORD)SendMessage(sliderWindow, TBM_GETPOS, 0, 0L);
|
|
|
|
ManagerView_OnZoomSliderPosChanging(hwnd, &zoomInfo);
|
|
}
|
|
}
|
|
|
|
static BOOL
|
|
ManagerView_OnHelp(HWND hwnd, HELPINFO *helpInfo)
|
|
{
|
|
HWND widgetWindow = MANAGERVIEW_WIDGET(hwnd);
|
|
if (NULL != widgetWindow)
|
|
{
|
|
wchar_t buffer[4096] = {0};
|
|
|
|
if (FALSE != WIDGET_GET_HELP_URL(widgetWindow, buffer, ARRAYSIZE(buffer)) &&
|
|
MediaLibrary_ShowHelp(Plugin_GetLibraryWindow(), buffer))
|
|
{
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return Plugin_ShowHelp();
|
|
}
|
|
|
|
static void
|
|
ManagerView_OnSetUpdateRegion(HWND hwnd, HRGN updateRegion, POINTS regionOffset)
|
|
{
|
|
ManagerView *self;
|
|
MANAGERVIEW_RET_VOID(self, hwnd);
|
|
|
|
self->updateRegion = updateRegion;
|
|
self->updateOffset.x = regionOffset.x;
|
|
self->updateOffset.y = regionOffset.y;
|
|
}
|
|
|
|
static HWND
|
|
ManagerView_OnGetZoomSlider(HWND hwnd)
|
|
{
|
|
return MANAGERVIEW_ZOOM_SLIDER(hwnd);
|
|
}
|
|
|
|
static HWND
|
|
ManagerView_OnGetStatusBar(HWND hwnd)
|
|
{
|
|
return MANAGERVIEW_STATUS_BAR(hwnd);
|
|
}
|
|
|
|
static INT_PTR CALLBACK
|
|
ManagerView_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch(uMsg)
|
|
{
|
|
case WM_INITDIALOG: return ManagerView_OnInitDialog(hwnd, (HWND)wParam, lParam);
|
|
case WM_DESTROY: ManagerView_OnDestroy(hwnd); return TRUE;
|
|
case WM_CTLCOLORDLG: return ManagerView_OnColorDialog(hwnd, (HDC)wParam);
|
|
case WM_PAINT: ManagerView_OnPaint(hwnd); return TRUE;
|
|
case WM_PRINTCLIENT: ManagerView_OnPrintClient(hwnd, (HDC)wParam, (UINT)lParam); return TRUE;
|
|
case WM_ERASEBKGND: DIALOG_RESULT(hwnd, 0);
|
|
case WM_WINDOWPOSCHANGED: ManagerView_OnWindowPosChanged(hwnd, (WINDOWPOS*)lParam); return TRUE;
|
|
case WM_DISPLAYCHANGE: ManagerView_OnDisplayChanged(hwnd, (INT)wParam, LOWORD(lParam), HIWORD(lParam)); return TRUE;
|
|
case WM_SETFONT: ManagerView_OnSetFont(hwnd, (HFONT)wParam, LOWORD(lParam)); return TRUE;
|
|
case WM_GETFONT: DIALOG_RESULT(hwnd, ManagerView_OnGetFont(hwnd));
|
|
case WM_COMMAND: ManagerView_OnCommand(hwnd, LOWORD(wParam), HIWORD(wParam), (HWND)lParam); return TRUE;
|
|
case WM_NOTIFY: DIALOG_RESULT(hwnd, ManagerView_OnNotify(hwnd, (NMHDR*)lParam));
|
|
case WM_HSCROLL: ManagerView_OnHorzScroll(hwnd, LOWORD(wParam), (short)HIWORD(wParam), (HWND)lParam); return TRUE;
|
|
case WM_HELP: DIALOG_RESULT(hwnd, ManagerView_OnHelp(hwnd, (HELPINFO*)lParam));
|
|
|
|
// gen_ml flickerless drawing
|
|
case WM_USER + 0x200: DIALOG_RESULT(hwnd, 1);
|
|
case WM_USER + 0x201: ManagerView_OnSetUpdateRegion(hwnd, (HRGN)lParam, MAKEPOINTS(wParam)); return TRUE;
|
|
|
|
case MANAGERVIEW_WM_ZOOMSLIDER: DIALOG_RESULT(hwnd, ManagerView_OnGetZoomSlider(hwnd));
|
|
case MANAGERVIEW_WM_STATUSBAR: DIALOG_RESULT(hwnd, ManagerView_OnGetStatusBar(hwnd));
|
|
}
|
|
return 0;
|
|
} |