winamp/Src/Plugins/Library/ml_devices/gen_deviceprovider/deviceView.cpp
2024-09-24 14:54:57 +02:00

994 lines
22 KiB
C++

#include "main.h"
#include "./deviceView.h"
#include <wincodec.h>
#include <commctrl.h>
#include <strsafe.h>
#include <vector>
#include <algorithm>
#define DEVICEVIEW_PROP L"NullsoftDevicesViewProp"
static ATOM DEVICEVIEW_ATOM = 0;
typedef struct DeviceView
{
Device *device;
} DeviceView;
typedef std::vector<DeviceIconInfo*> DeviceIconInfoList;
static INT_PTR
DeviceView_DialogProc(HWND hwnd, unsigned int uMsg, WPARAM wParam, LPARAM lParam);
#define DEVICEVIEW(_hwnd) ((DeviceView*)GetPropW((_hwnd), MAKEINTATOM(DEVICEVIEW_ATOM)))
#define DEVICEVIEW_RET_VOID(_view, _hwnd) { (_view) = DEVICEVIEW((_hwnd)); if (NULL == (_view)) return; }
#define DEVICEVIEW_RET_VAL(_view, _hwnd, _error) { (_view) = DEVICEVIEW((_hwnd)); if (NULL == (_view)) return (_error); }
static HBITMAP
DeviceView_HBitmapFromWicSource(IWICBitmapSource *wicSource)
{
HRESULT hr;
HBITMAP bitmap;
BITMAPINFO bitmapInfo;
unsigned int width, height;
void *pixelData = NULL;
HDC windowDC;
unsigned int strideSize, imageSize;
if (NULL == wicSource)
return NULL;
hr = wicSource->GetSize(&width, &height);
if (FAILED(hr))
return NULL;
ZeroMemory(&bitmapInfo, sizeof(bitmapInfo));
bitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bitmapInfo.bmiHeader.biWidth = width;
bitmapInfo.bmiHeader.biHeight = -(LONG)height;
bitmapInfo.bmiHeader.biPlanes = 1;
bitmapInfo.bmiHeader.biBitCount = 32;
bitmapInfo.bmiHeader.biCompression = BI_RGB;
windowDC = GetDCEx(NULL, NULL, DCX_WINDOW | DCX_CACHE);
bitmap = CreateDIBSection(windowDC, &bitmapInfo, DIB_RGB_COLORS, &pixelData, NULL, 0);
if (NULL != windowDC)
ReleaseDC(NULL, windowDC);
if (NULL == bitmap)
return NULL;
hr = UIntMult(width, sizeof(DWORD), &strideSize);
if (SUCCEEDED(hr))
{
hr = UIntMult(strideSize, height, &imageSize);
if (SUCCEEDED(hr))
hr = wicSource->CopyPixels(NULL, strideSize, imageSize, (BYTE*)pixelData);
}
if (FAILED(hr))
{
DeleteObject(bitmap);
bitmap = NULL;
}
return bitmap;
}
static HBITMAP
DeviceView_LoadIcon(const wchar_t *path)
{
IWICImagingFactory *wicFactory;
IWICBitmapDecoder *wicDecoder;
HRESULT hr;
HBITMAP bitmap;
hr = CoCreateInstance(CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&wicFactory));
if (FAILED(hr))
return NULL;
bitmap = NULL;
hr = wicFactory->CreateDecoderFromFilename(path, NULL, GENERIC_READ,
WICDecodeMetadataCacheOnDemand, &wicDecoder);
if (SUCCEEDED(hr))
{
IWICBitmapFrameDecode *wicFrame;
hr = wicDecoder->GetFrame(0, &wicFrame);
if(SUCCEEDED(hr))
{
IWICBitmapSource *wicSource;
hr = wicFrame->QueryInterface(IID_IWICBitmapSource,
reinterpret_cast<void **>(&wicSource));
if (SUCCEEDED(hr))
{
WICPixelFormatGUID pixelFormat;
hr = wicSource->GetPixelFormat(&pixelFormat);
if (FAILED(hr) ||
(GUID_WICPixelFormat32bppPBGRA != pixelFormat &&
GUID_WICPixelFormat32bppBGR != pixelFormat &&
GUID_WICPixelFormat32bppBGRA != pixelFormat &&
GUID_WICPixelFormat32bppRGBA != pixelFormat &&
GUID_WICPixelFormat32bppPRGBA != pixelFormat))
{
// try to convert
IWICFormatConverter *wicConverter;
hr = wicFactory->CreateFormatConverter(&wicConverter);
if (SUCCEEDED(hr))
{
hr = wicConverter->Initialize(wicSource, GUID_WICPixelFormat32bppPBGRA,
WICBitmapDitherTypeNone, NULL, 0.f, WICBitmapPaletteTypeCustom);
if (SUCCEEDED(hr))
{
IWICBitmapSource *wicConvertedSource;
hr = wicConverter->QueryInterface(IID_IWICBitmapSource,
reinterpret_cast<void **>(&wicConvertedSource));
if (SUCCEEDED(hr))
{
wicSource->Release();
wicSource = wicConvertedSource;
}
}
wicConverter->Release();
}
}
if (SUCCEEDED(hr))
bitmap = DeviceView_HBitmapFromWicSource(wicSource);
wicSource->Release();
}
wicFrame->Release();
}
wicDecoder->Release();
}
wicFactory->Release();
return bitmap;
}
HWND
DeviceView_CreateWindow(HWND parentWindow, Device *device)
{
HWND hwnd;
if (NULL == device)
return NULL;
if (0 == DEVICEVIEW_ATOM)
{
DEVICEVIEW_ATOM = GlobalAddAtom(DEVICEVIEW_PROP);
if (0 == DEVICEVIEW_ATOM)
return NULL;
}
hwnd = WASABI_API_CREATEDIALOGPARAMW((INT_PTR)IDD_DEVICE_VIEW, parentWindow,
DeviceView_DialogProc, (LPARAM)device);
return hwnd;
}
static void
DeviceView_InitCapacity(HWND hwnd)
{
DeviceView *self;
HWND controlWindow;
uint64_t totalSpace, usedSpace;
DEVICEVIEW_RET_VOID(self, hwnd);
if (NULL != self->device)
{
if (FAILED(self->device->GetTotalSpace(&totalSpace)))
totalSpace = 0;
if (FAILED(self->device->GetUsedSpace(&usedSpace)))
usedSpace = 0;
}
else
{
totalSpace = 0;
usedSpace = 0;
}
controlWindow = GetDlgItem(hwnd, IDC_SPIN_TOTALSPACE);
if (NULL != controlWindow)
{
SendMessage(controlWindow, UDM_SETRANGE32, (WPARAM)0, (LPARAM)0xFFFFFF);
SendMessage(controlWindow, UDM_SETPOS32, (WPARAM)0, (LPARAM)totalSpace);
}
controlWindow = GetDlgItem(hwnd, IDC_SPIN_USEDSPACE);
if (NULL != controlWindow)
{
SendMessage(controlWindow, UDM_SETRANGE32, (WPARAM)0, (LPARAM)totalSpace);
SendMessage(controlWindow, UDM_SETPOS32, (WPARAM)0, (LPARAM)usedSpace);
}
}
static int
DeviceView_CompareDeviceIconInfo(const void *elem1, const void *elem2)
{
DeviceIconInfo *info1;
DeviceIconInfo *info2;
info1 = *((DeviceIconInfo**)elem1);
info2 = *((DeviceIconInfo**)elem2);
if (NULL == info1 || NULL == info2)
return (int)(info1 - info2);
if (info1->width != info2->width)
return (int)(info1->width - info2->width);
if (info1->height != info2->height)
return (int)(info1->height - info2->height);
if (NULL == info1->path || NULL == info2->path)
return (int)(info1->path - info2->path);
return CompareString(CSTR_INVARIANT, NORM_IGNORECASE, info1->path, -1, info2->path, -1) - 2;
}
static int
DeviceView_CompareDeviceIconInfo_V2(const void* elem1, const void* elem2)
{
return DeviceView_CompareDeviceIconInfo(elem1, elem2) < 0;
}
static BOOL
DeviceView_EnumerateIcons(const wchar_t *path, unsigned int width, unsigned int height, void *user)
{
DeviceIconInfo *info;
DeviceIconInfoList *list = (DeviceIconInfoList*)user;
if( NULL == list)
return FALSE;
info = (DeviceIconInfo*)malloc(sizeof(DeviceIconInfo));
if (NULL != info)
{
info->height = height;
info->width = width;
info->path = String_Duplicate(path);
list->push_back(info);
}
return TRUE;
}
static void
DeviceView_DestroyIcons(HWND hwnd)
{
HWND controlWindow;
int count, index;
DeviceIconInfo *info;
controlWindow = GetDlgItem(hwnd, IDC_COMBO_ICONS);
if (NULL == controlWindow)
return;
count = (int)SendMessage(controlWindow, CB_GETCOUNT, 0, 0L);
for(index = 0; index < count; index++)
{
info = (DeviceIconInfo*)SendMessage(controlWindow, CB_GETITEMDATA, index, 0L);
if (CB_ERR != (INT_PTR)info)
{
String_Free(info->path);
free(info);
}
}
SendMessage(controlWindow, CB_RESETCONTENT, 0, 0L);
controlWindow = GetDlgItem(hwnd, IDC_STATIC_PREVIEWICON);
if (NULL != controlWindow)
{
HBITMAP bitmap;
bitmap = (HBITMAP)SendMessage(controlWindow, STM_GETIMAGE, IMAGE_BITMAP, 0L);
if(NULL != bitmap)
DeleteObject(bitmap);
}
}
static void
DeviceView_InitIcons(HWND hwnd, const wchar_t *selectPath)
{
DeviceView *self;
DeviceIconInfoList list;
HWND controlWindow;
wchar_t buffer[2048];
DEVICEVIEW_RET_VOID(self, hwnd);
DeviceView_DestroyIcons(hwnd);
controlWindow = GetDlgItem(hwnd, IDC_COMBO_ICONS);
if (NULL != controlWindow)
{
size_t index, count;
int iItem, iSelect;
DeviceIconInfo *info;
if (NULL != self->device)
{
self->device->EnumerateIcons(DeviceView_EnumerateIcons, &list);
}
count = list.size();
//qsort(list.begin(), count, sizeof(DeviceIconInfo**), DeviceView_CompareDeviceIconInfo);
std::sort(list.begin(), list.end(), DeviceView_CompareDeviceIconInfo_V2);
iSelect = 0;
for(index = 0; index < count; index++)
{
info = list[index];
if (1 == info->width && 1 == info->height)
{
StringCchPrintf(buffer, ARRAYSIZE(buffer), L"%s",
info->path);
}
else
{
StringCchPrintf(buffer, ARRAYSIZE(buffer), L"[%dx%d] - %s",
info->width, info->height, info->path);
}
iItem = (int)SendMessage(controlWindow, CB_ADDSTRING, 0, (LPARAM)buffer);
if (CB_ERR != iItem)
{
if (CB_ERR == (int)SendMessage(controlWindow, CB_SETITEMDATA, index, (LPARAM)info))
{
SendMessage(controlWindow, CB_DELETESTRING, index, 0L);
iItem = CB_ERR;
}
}
if (CB_ERR == iItem)
{
free(info);
}
else if (NULL != selectPath &&
CSTR_EQUAL == CompareString(CSTR_INVARIANT, NORM_IGNORECASE,
info->path, -1, selectPath, -1))
{
iSelect = iItem;
}
}
iItem = (int)SendMessage(controlWindow, CB_GETCOUNT, 0, 0L);
if (CB_ERR == iItem)
iItem = 0;
EnableWindow(GetDlgItem(hwnd, IDC_BUTTON_EDITICON), (0 != iItem));
EnableWindow(GetDlgItem(hwnd, IDC_BUTTON_REMOVEICON),(0 != iItem));
SendMessage(controlWindow, CB_SETCURSEL, iSelect, 0L);
PostMessage(hwnd, WM_COMMAND, MAKEWPARAM(IDC_COMBO_ICONS, CBN_SELENDOK), (LPARAM)controlWindow);
}
}
static void
DeviceView_NewIcon(HWND hwnd)
{
DeviceView *self;
DeviceIconInfo info;
INT_PTR result;
DEVICEVIEW_RET_VOID(self, hwnd);
ZeroMemory(&info, sizeof(info));
result = DeviceIconEditor_Show(hwnd, &info);
if (IDOK == result)
{
if (NULL != self->device &&
SUCCEEDED(self->device->AddIcon(info.path, info.width, info.height)))
{
DeviceView_InitIcons(hwnd, info.path);
}
String_Free(info.path);
}
}
static void
DeviceView_RemoveIcon(HWND hwnd)
{
DeviceView *self;
DeviceIconInfo *info;
int index, count;
HWND controlWindow;
DEVICEVIEW_RET_VOID(self, hwnd);
controlWindow = GetDlgItem(hwnd, IDC_COMBO_ICONS);
if (NULL == controlWindow)
return;
index = (int)SendMessage(controlWindow, CB_GETCURSEL, 0, 0L);
if (CB_ERR == index)
return;
info = (DeviceIconInfo*)SendMessage(controlWindow, CB_GETITEMDATA, index, 0L);
if (CB_ERR != (INT_PTR)info)
{
if (NULL != self->device)
self->device->RemoveIcon(info->width, info->height);
String_Free(info->path);
free(info);
}
SendMessage(controlWindow, CB_DELETESTRING, index, 0L);
count = (int)SendMessage(controlWindow, CB_GETCOUNT, 0, 0L);
if (count > 0)
{
if (index > count)
index = count - 1;
SendMessage(controlWindow, CB_SETCURSEL, index, 0L);
}
else
{
SendMessage(controlWindow, CB_SETCURSEL, -1, 0L);
EnableWindow(GetDlgItem(hwnd, IDC_BUTTON_EDITICON),FALSE);
EnableWindow(GetDlgItem(hwnd, IDC_BUTTON_REMOVEICON),FALSE);
}
PostMessage(hwnd, WM_COMMAND, MAKEWPARAM(IDC_COMBO_ICONS, CBN_SELENDOK), (LPARAM)controlWindow);
UpdateWindow(controlWindow);
}
static void
DeviceView_EditIcon(HWND hwnd)
{
DeviceView *self;
DeviceIconInfo *info;
int index;
unsigned int width, height;
HWND controlWindow;
INT_PTR result;
DEVICEVIEW_RET_VOID(self, hwnd);
controlWindow = GetDlgItem(hwnd, IDC_COMBO_ICONS);
if (NULL == controlWindow)
return;
index = (int)SendMessage(controlWindow, CB_GETCURSEL, 0, 0L);
if (CB_ERR == index)
return;
info = (DeviceIconInfo*)SendMessage(controlWindow, CB_GETITEMDATA, index, 0L);
if (CB_ERR == (INT_PTR)info)
return;
width = info->width;
height = info->height;
result = DeviceIconEditor_Show(hwnd, info);
if (IDOK == result)
{
if (NULL != self->device)
{
self->device->RemoveIcon(width, height);
self->device->AddIcon(info->path, info->width, info->height);
DeviceView_InitIcons(hwnd, info->path);
}
}
UpdateWindow(controlWindow);
}
static void
DeviceView_InitView(HWND hwnd)
{
DeviceView *self;
HWND controlWindow;
wchar_t buffer[1024];
DEVICEVIEW_RET_VOID(self, hwnd);
controlWindow = GetDlgItem(hwnd, IDC_EDIT_NAME);
if (NULL != controlWindow)
{
if (NULL == self->device ||
0 == MultiByteToWideChar(CP_UTF8, 0, self->device->GetName(), -1, buffer, ARRAYSIZE(buffer)))
{
StringCchCopy(buffer, ARRAYSIZE(buffer), L"<unknown>");
}
SetWindowText(controlWindow, buffer);
}
controlWindow = GetDlgItem(hwnd, IDC_EDIT_TITLE);
if (NULL != controlWindow)
{
if (NULL == self->device ||
FAILED(self->device->GetDisplayName(buffer, ARRAYSIZE(buffer))))
{
StringCchCopy(buffer, ARRAYSIZE(buffer), L"<unknown>");
}
SetWindowText(controlWindow, buffer);
}
controlWindow = GetDlgItem(hwnd, IDC_EDIT_TYPE);
if (NULL != controlWindow)
{
buffer[0] = L'\0';
if (NULL != self->device)
{
const char *typeName;
ifc_devicetype *type;
typeName = self->device->GetType();
if (NULL != WASABI_API_DEVICES &&
S_OK == WASABI_API_DEVICES->TypeFind(typeName, &type))
{
if (FAILED(type->GetDisplayName(buffer, ARRAYSIZE(buffer))))
buffer[0] = L'\0';
type->Release();
}
if (L'\0' == *buffer)
MultiByteToWideChar(CP_UTF8, 0, typeName, -1, buffer, ARRAYSIZE(buffer));
}
if (L'\0' == *buffer)
StringCchCopy(buffer, ARRAYSIZE(buffer), L"<unknown>");
SetWindowText(controlWindow, buffer);
}
controlWindow = GetDlgItem(hwnd, IDC_EDIT_CONNECTION);
if (NULL != controlWindow)
{
buffer[0] = L'\0';
if (NULL != self->device)
{
const char *connectionName;
ifc_deviceconnection *connection;
connectionName = self->device->GetConnection();
if (NULL != WASABI_API_DEVICES &&
S_OK == WASABI_API_DEVICES->ConnectionFind(connectionName, &connection))
{
if (FAILED(connection->GetDisplayName(buffer, ARRAYSIZE(buffer))))
buffer[0] = L'\0';
connection->Release();
}
if (L'\0' == *buffer)
MultiByteToWideChar(CP_UTF8, 0, connectionName, -1, buffer, ARRAYSIZE(buffer));
}
if (L'\0' == *buffer)
StringCchCopy(buffer, ARRAYSIZE(buffer), L"<unknown>");
SetWindowText(controlWindow, buffer);
}
controlWindow = GetDlgItem(hwnd, IDC_COMBO_ATTACHED);
if (NULL != controlWindow)
{
SendMessage(controlWindow, CB_RESETCONTENT, 0, 0L);
if (NULL != self->device)
{
const wchar_t *searchString;
SendMessage(controlWindow, CB_ADDSTRING, 0, (LPARAM)L"Yes");
SendMessage(controlWindow, CB_ADDSTRING, 0, (LPARAM)L"No");
if (FALSE == self->device->GetAttached())
searchString = L"No";
else
searchString = L"Yes";
SendMessage(controlWindow, CB_SELECTSTRING, -1, (LPARAM)searchString);
}
else
{
SendMessage(controlWindow, CB_ADDSTRING, 0, (LPARAM)L"<unknown>");
SendMessage(controlWindow, CB_SETCURSEL, 0, 0L);
}
}
controlWindow = GetDlgItem(hwnd, IDC_COMBO_VISIBLE);
if (NULL != controlWindow)
{
SendMessage(controlWindow, CB_RESETCONTENT, 0, 0L);
if (NULL != self->device)
{
const wchar_t *searchString;
SendMessage(controlWindow, CB_ADDSTRING, 0, (LPARAM)L"Yes");
SendMessage(controlWindow, CB_ADDSTRING, 0, (LPARAM)L"No");
if (FALSE != self->device->GetHidden())
searchString = L"No";
else
searchString = L"Yes";
SendMessage(controlWindow, CB_SELECTSTRING, -1, (LPARAM)searchString);
}
else
{
SendMessage(controlWindow, CB_ADDSTRING, 0, (LPARAM)L"<unknown>");
SendMessage(controlWindow, CB_SETCURSEL, 0, 0L);
}
}
DeviceView_InitCapacity(hwnd);
DeviceView_InitIcons(hwnd, NULL);
}
static INT_PTR
DeviceView_OnInitDialog(HWND hwnd, HWND focusWindow, LPARAM param)
{
DeviceView *self;
self = (DeviceView*)malloc(sizeof(DeviceView));
if (NULL != self)
{
ZeroMemory(self, sizeof(DeviceView));
if (FALSE == SetProp(hwnd, MAKEINTATOM(DEVICEVIEW_ATOM), self))
{
free(self);
self = NULL;
}
}
if (NULL == self)
{
DestroyWindow(hwnd);
return 0;
}
self->device = (Device*)param;
if (NULL != self->device)
self->device->AddRef();
DeviceView_InitView(hwnd);
SetWindowPos(hwnd, NULL, 0, 0, 0, 0,
SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE | SWP_NOMOVE | SWP_FRAMECHANGED);
return 0;
}
static void
DeviceView_OnDestroy(HWND hwnd)
{
DeviceView *self;
DeviceView_DestroyIcons(hwnd);
self = DEVICEVIEW(hwnd);
RemoveProp(hwnd, MAKEINTATOM(DEVICEVIEW_ATOM));
if (NULL == self)
return;
if (NULL != self->device)
self->device->Release();
free(self);
}
static void
DeviceView_OnTitleEditChanged(HWND hwnd)
{
DeviceView *self;
HWND controlWindow;
wchar_t buffer[1024];
DEVICEVIEW_RET_VOID(self, hwnd);
controlWindow = GetDlgItem(hwnd, IDC_EDIT_TITLE);
if (NULL == controlWindow)
return;
if (NULL == self->device)
return;
GetWindowText(controlWindow, buffer, ARRAYSIZE(buffer));
self->device->SetDisplayName(buffer);
}
static void
DeviceView_OnAttachedComboChanged(HWND hwnd)
{
DeviceView *self;
HWND controlWindow;
wchar_t buffer[1024];
int index;
DEVICEVIEW_RET_VOID(self, hwnd);
controlWindow = GetDlgItem(hwnd, IDC_COMBO_ATTACHED);
if (NULL == controlWindow)
return;
if (NULL == self->device)
return;
index = (int)SendMessage(controlWindow, CB_GETCURSEL, 0, 0);
if (CB_ERR != index &&
CB_ERR != SendMessage(controlWindow, CB_GETLBTEXT, index, (LPARAM)buffer))
{
if (CSTR_EQUAL == CompareString(CSTR_INVARIANT, NORM_IGNORECASE, buffer, -1, L"Yes", -1))
{
self->device->Attach(NULL);
}
else if (CSTR_EQUAL == CompareString(CSTR_INVARIANT, NORM_IGNORECASE, buffer, -1, L"No", -1))
{
self->device->Detach(NULL);
}
}
}
static void
DeviceView_OnVisibleComboChanged(HWND hwnd)
{
DeviceView *self;
HWND controlWindow;
wchar_t buffer[1024];
int index;
DEVICEVIEW_RET_VOID(self, hwnd);
controlWindow = GetDlgItem(hwnd, IDC_COMBO_VISIBLE);
if (NULL == controlWindow)
return;
if (NULL == self->device)
return;
index = (int)SendMessage(controlWindow, CB_GETCURSEL, 0, 0);
if (-1 != index &&
CB_ERR != SendMessage(controlWindow, CB_GETLBTEXT, index, (LPARAM)buffer))
{
if (CSTR_EQUAL == CompareString(CSTR_INVARIANT, NORM_IGNORECASE, buffer, -1, L"Yes", -1))
{
self->device->SetHidden(FALSE);
}
else if (CSTR_EQUAL == CompareString(CSTR_INVARIANT, NORM_IGNORECASE, buffer, -1, L"No", -1))
{
self->device->SetHidden(TRUE);
}
}
}
static void
DeviceView_OnIconsComboChanged(HWND hwnd)
{
DeviceView *self;
HWND controlWindow, pictureWindow;
int index;
HBITMAP bitmap, previousBitmap;
DEVICEVIEW_RET_VOID(self, hwnd);
controlWindow = GetDlgItem(hwnd, IDC_COMBO_ICONS);
if (NULL == controlWindow)
return;
if (NULL == self->device)
return;
pictureWindow = GetDlgItem(hwnd, IDC_STATIC_PREVIEWICON);
if (NULL == pictureWindow)
return;
bitmap = NULL;
index = (int)SendMessage(controlWindow, CB_GETCURSEL, 0, 0);\
if (CB_ERR != index)
{
DeviceIconInfo *info;
info = (DeviceIconInfo*)SendMessage(controlWindow, CB_GETITEMDATA, index, 0L);
if (CB_ERR != (INT_PTR)info && NULL != info->path)
{
bitmap = DeviceView_LoadIcon(info->path);
}
}
previousBitmap = (HBITMAP)SendMessage(pictureWindow, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)bitmap);
if (NULL != previousBitmap)
DeleteObject(previousBitmap);
previousBitmap = (HBITMAP)SendMessage(pictureWindow, STM_GETIMAGE, IMAGE_BITMAP, 0L);
if(previousBitmap != bitmap)
{
if (NULL != bitmap)
DeleteObject(bitmap);
}
}
static void
DeviceView_OnTotalSpaceEditChanged(HWND hwnd)
{
DeviceView *self;
HWND controlWindow;
uint64_t totalSpace;
BOOL error;
DEVICEVIEW_RET_VOID(self, hwnd);
controlWindow = GetDlgItem(hwnd, IDC_SPIN_TOTALSPACE);
if (NULL == controlWindow)
return;
if (NULL == self->device)
return;
totalSpace = (size_t)SendMessage(controlWindow, UDM_GETPOS32, 0, (LPARAM)&error);
if (FALSE != error)
return;
if (FAILED(self->device->SetTotalSpace(totalSpace)))
{
if (FAILED(self->device->GetTotalSpace(&totalSpace)))
totalSpace = 0;
}
controlWindow = GetDlgItem(hwnd, IDC_SPIN_USEDSPACE);
if (NULL != controlWindow)
{
SendMessage(controlWindow, UDM_SETRANGE32, (WPARAM)0, (LPARAM)totalSpace);
}
}
static void
DeviceView_OnUsedSpaceEditChanged(HWND hwnd)
{
DeviceView *self;
HWND controlWindow;
uint64_t usedSpace;
BOOL error;
DEVICEVIEW_RET_VOID(self, hwnd);
controlWindow = GetDlgItem(hwnd, IDC_SPIN_USEDSPACE);
if (NULL == controlWindow)
return;
if (NULL == self->device)
return;
usedSpace = (size_t)SendMessage(controlWindow, UDM_GETPOS32, 0, (LPARAM)&error);
if (FALSE != error)
return;
if (FAILED(self->device->SetUsedSpace(usedSpace)))
{
if (FAILED(self->device->GetTotalSpace(&usedSpace)))
usedSpace = 0;
}
}
static void
DeviceView_OnCommand(HWND hwnd, INT commandId, INT eventId, HWND controlWindow)
{
switch(commandId)
{
case IDC_EDIT_TITLE:
switch(eventId)
{
case EN_CHANGE:
DeviceView_OnTitleEditChanged(hwnd);
break;
}
break;
case IDC_COMBO_ATTACHED:
switch(eventId)
{
case CBN_SELENDOK:
DeviceView_OnAttachedComboChanged(hwnd);
break;
}
break;
case IDC_COMBO_VISIBLE:
switch(eventId)
{
case CBN_SELENDOK:
DeviceView_OnVisibleComboChanged(hwnd);
break;
}
break;
case IDC_COMBO_ICONS:
switch(eventId)
{
case CBN_SELENDOK:
DeviceView_OnIconsComboChanged(hwnd);
break;
}
break;
case IDC_EDIT_TOTALSPACE:
switch(eventId)
{
case EN_CHANGE:
DeviceView_OnTotalSpaceEditChanged(hwnd);
break;
}
break;
case IDC_EDIT_USEDSPACE:
switch(eventId)
{
case EN_CHANGE:
DeviceView_OnUsedSpaceEditChanged(hwnd);
break;
}
break;
case IDC_BUTTON_NEWICON:
switch(eventId)
{
case BN_CLICKED:
DeviceView_NewIcon(hwnd);
break;
}
break;
case IDC_BUTTON_REMOVEICON:
switch(eventId)
{
case BN_CLICKED:
DeviceView_RemoveIcon(hwnd);
break;
}
break;
case IDC_BUTTON_EDITICON:
switch(eventId)
{
case BN_CLICKED:
DeviceView_EditIcon(hwnd);
break;
}
break;
}
}
static INT_PTR
DeviceView_DialogProc(HWND hwnd, unsigned int uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_INITDIALOG: return DeviceView_OnInitDialog(hwnd, (HWND)wParam, lParam);
case WM_DESTROY: DeviceView_OnDestroy(hwnd); return TRUE;
case WM_COMMAND: DeviceView_OnCommand(hwnd, LOWORD(wParam), HIWORD(wParam), (HWND)lParam); return TRUE;
}
return 0;
}