mirror of
https://github.com/WinampDesktop/winamp.git
synced 2025-06-10 11:59:58 -05:00
Initial community commit
This commit is contained in:
994
Src/Plugins/Library/ml_devices/gen_deviceprovider/deviceView.cpp
Normal file
994
Src/Plugins/Library/ml_devices/gen_deviceprovider/deviceView.cpp
Normal file
@@ -0,0 +1,994 @@
|
||||
#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;
|
||||
}
|
Reference in New Issue
Block a user