392 lines
8.2 KiB
C++
392 lines
8.2 KiB
C++
|
#include "main.h"
|
||
|
#include "./listWidgetInternal.h"
|
||
|
|
||
|
#define REQUEST_STRING ((wchar_t*)1)
|
||
|
#define REQUEST_IMAGE ((DeviceImage*)1)
|
||
|
|
||
|
typedef struct ListWidgetCommand
|
||
|
{
|
||
|
char *name;
|
||
|
ListWidgetCommandState state;
|
||
|
wchar_t *title;
|
||
|
wchar_t *description;
|
||
|
DeviceImage *imageLarge;
|
||
|
DeviceImage *imageSmall;
|
||
|
RECT rect;
|
||
|
} ListWidgetCommand;
|
||
|
|
||
|
ListWidgetCommand *
|
||
|
ListWidget_CreateCommand(const char *name, BOOL primary, BOOL disabled)
|
||
|
{
|
||
|
ListWidgetCommand *self;
|
||
|
|
||
|
if (NULL == name)
|
||
|
return NULL;
|
||
|
|
||
|
self = (ListWidgetCommand*)malloc(sizeof(ListWidgetCommand));
|
||
|
if (NULL == self)
|
||
|
return NULL;
|
||
|
|
||
|
ZeroMemory(self, sizeof(ListWidgetCommand));
|
||
|
|
||
|
self->name = AnsiString_Duplicate(name);
|
||
|
self->state = ListWidgetCommandState_Normal;
|
||
|
|
||
|
if (NULL != self->name)
|
||
|
{
|
||
|
if (FALSE != primary)
|
||
|
self->state |= ListWidgetCommandState_Primary;
|
||
|
|
||
|
if (FALSE != disabled)
|
||
|
self->state |= ListWidgetCommandState_Disabled;
|
||
|
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ListWidget_DestroyCommand(self);
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
self->title = REQUEST_STRING;
|
||
|
self->description = REQUEST_STRING;
|
||
|
self->imageLarge = REQUEST_IMAGE;
|
||
|
self->imageSmall = REQUEST_IMAGE;
|
||
|
|
||
|
return self;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
ListWidget_DestroyCommand(ListWidgetCommand *command)
|
||
|
{
|
||
|
if (NULL == command)
|
||
|
return;
|
||
|
|
||
|
AnsiString_Free(command->name);
|
||
|
|
||
|
if (NULL != command->imageLarge && REQUEST_IMAGE != command->imageLarge)
|
||
|
DeviceImage_Release(command->imageLarge);
|
||
|
|
||
|
if (NULL != command->imageSmall && REQUEST_IMAGE != command->imageSmall)
|
||
|
DeviceImage_Release(command->imageSmall);
|
||
|
|
||
|
if (REQUEST_STRING != command->title)
|
||
|
String_Free(command->title);
|
||
|
|
||
|
if (REQUEST_STRING != command->description)
|
||
|
String_Free(command->description);
|
||
|
|
||
|
free(command);
|
||
|
}
|
||
|
|
||
|
size_t
|
||
|
ListWigdet_GetDeviceCommands(ListWidgetCommand **buffer, size_t bufferMax, ifc_device *device)
|
||
|
{
|
||
|
size_t count;
|
||
|
ifc_devicesupportedcommandenum *enumerator;
|
||
|
ifc_devicesupportedcommand *command;
|
||
|
DeviceCommandFlags flags;
|
||
|
ListWidgetCommand *widgetCommand;
|
||
|
BOOL primaryFound;
|
||
|
|
||
|
if (NULL == buffer || bufferMax < 1 || NULL == device)
|
||
|
return 0;
|
||
|
|
||
|
if (FAILED(device->EnumerateCommands(&enumerator, DeviceCommandContext_View)))
|
||
|
return 0;
|
||
|
|
||
|
count = 0;
|
||
|
primaryFound = FALSE;
|
||
|
|
||
|
while(S_OK == enumerator->Next(&command, 1, NULL))
|
||
|
{
|
||
|
if(FAILED(command->GetFlags(&flags)))
|
||
|
flags = DeviceCommandFlag_None;
|
||
|
|
||
|
if (0 == (DeviceCommandFlag_Hidden & flags))
|
||
|
{
|
||
|
widgetCommand = ListWidget_CreateCommand(command->GetName(),
|
||
|
(0 != (DeviceCommandFlag_Primary & flags)),
|
||
|
(0 != (DeviceCommandFlag_Disabled & flags)));
|
||
|
if (NULL != widgetCommand)
|
||
|
{
|
||
|
if (0 != (DeviceCommandFlag_Primary & flags))
|
||
|
{
|
||
|
if (count == bufferMax)
|
||
|
{
|
||
|
ListWidget_DestroyCommand(buffer[count-1]);
|
||
|
count--;
|
||
|
}
|
||
|
|
||
|
if (count > 0)
|
||
|
MoveMemory(&buffer[1], buffer, sizeof(ListWidgetCommand*) * count);
|
||
|
|
||
|
buffer[0] = widgetCommand;
|
||
|
primaryFound = TRUE;
|
||
|
count++;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (count < bufferMax)
|
||
|
{
|
||
|
buffer[count] = widgetCommand;
|
||
|
count++;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
command->Release();
|
||
|
|
||
|
if (count == bufferMax && FALSE != primaryFound)
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
enumerator->Release();
|
||
|
|
||
|
return count;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
ListWidget_DestroyAllCommands(ListWidgetCommand **buffer, size_t bufferMax)
|
||
|
{
|
||
|
if (NULL == buffer)
|
||
|
return;
|
||
|
|
||
|
while(bufferMax--)
|
||
|
ListWidget_DestroyCommand(buffer[bufferMax]);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
const char *
|
||
|
ListWidget_GetCommandName(ListWidgetCommand *command)
|
||
|
{
|
||
|
return (NULL != command) ? command->name : NULL;
|
||
|
}
|
||
|
|
||
|
const wchar_t *
|
||
|
ListWidget_GetCommandTitle(ListWidgetCommand *command)
|
||
|
{
|
||
|
if (NULL == command || NULL == command->title)
|
||
|
return NULL;
|
||
|
|
||
|
if (REQUEST_STRING == command->title)
|
||
|
{
|
||
|
ifc_devicecommand *info;
|
||
|
|
||
|
command->title = NULL;
|
||
|
|
||
|
if (NULL != WASABI_API_DEVICES &&
|
||
|
S_OK == WASABI_API_DEVICES->CommandFind(command->name, &info))
|
||
|
{
|
||
|
wchar_t buffer[512] = {0};
|
||
|
|
||
|
if (SUCCEEDED(info->GetDisplayName(buffer, ARRAYSIZE(buffer))))
|
||
|
command->title = String_Duplicate(buffer);
|
||
|
|
||
|
info->Release();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return command->title;
|
||
|
}
|
||
|
|
||
|
const wchar_t *
|
||
|
ListWidget_GetCommandDescription(ListWidgetCommand *command)
|
||
|
{
|
||
|
if (NULL == command || NULL == command->description)
|
||
|
return NULL;
|
||
|
|
||
|
if (REQUEST_STRING == command->description)
|
||
|
{
|
||
|
ifc_devicecommand *info;
|
||
|
|
||
|
command->description = NULL;
|
||
|
|
||
|
if (NULL != WASABI_API_DEVICES &&
|
||
|
S_OK == WASABI_API_DEVICES->CommandFind(command->name, &info))
|
||
|
{
|
||
|
wchar_t buffer[1024] = {0};
|
||
|
|
||
|
if (SUCCEEDED(info->GetDescription(buffer, ARRAYSIZE(buffer))))
|
||
|
command->description = String_Duplicate(buffer);
|
||
|
|
||
|
info->Release();
|
||
|
}
|
||
|
}
|
||
|
return command->description;
|
||
|
}
|
||
|
|
||
|
HBITMAP
|
||
|
ListWidget_GetCommandLargeBitmap(WidgetStyle *style, ListWidgetCommand *command, int width, int height)
|
||
|
{
|
||
|
if (NULL == style || NULL == command || NULL == command->imageLarge)
|
||
|
return NULL;
|
||
|
|
||
|
if (REQUEST_IMAGE == command->imageLarge)
|
||
|
{
|
||
|
ifc_devicecommand *info;
|
||
|
|
||
|
command->imageLarge = NULL;
|
||
|
|
||
|
if (NULL != WASABI_API_DEVICES &&
|
||
|
S_OK == WASABI_API_DEVICES->CommandFind(command->name, &info))
|
||
|
{
|
||
|
wchar_t buffer[MAX_PATH * 2] = {0};
|
||
|
|
||
|
if (FAILED(info->GetIcon(buffer, ARRAYSIZE(buffer), width, height)))
|
||
|
buffer[0] = L'\0';
|
||
|
|
||
|
info->Release();
|
||
|
|
||
|
if (L'\0' != buffer[0])
|
||
|
{
|
||
|
command->imageLarge = DeviceImageCache_GetImage(Plugin_GetImageCache(), buffer,
|
||
|
width, height, NULL, NULL);
|
||
|
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return DeviceImage_GetBitmap(command->imageLarge, DeviceImage_Normal);
|
||
|
}
|
||
|
|
||
|
HBITMAP
|
||
|
ListWidget_GetCommandSmallBitmap(WidgetStyle *style, ListWidgetCommand *command, int width, int height)
|
||
|
{
|
||
|
if (NULL == style || NULL == command || NULL == command->imageSmall)
|
||
|
return NULL;
|
||
|
|
||
|
if (REQUEST_IMAGE == command->imageSmall)
|
||
|
{
|
||
|
ifc_devicecommand *info;
|
||
|
|
||
|
command->imageSmall = NULL;
|
||
|
|
||
|
if (NULL != WASABI_API_DEVICES &&
|
||
|
S_OK == WASABI_API_DEVICES->CommandFind(command->name, &info))
|
||
|
{
|
||
|
wchar_t buffer[MAX_PATH * 2] = {0};
|
||
|
|
||
|
if (FAILED(info->GetIcon(buffer, ARRAYSIZE(buffer), width, height)))
|
||
|
buffer[0] = L'\0';
|
||
|
|
||
|
info->Release();
|
||
|
|
||
|
if (L'\0' != buffer[0])
|
||
|
{
|
||
|
command->imageSmall = DeviceImageCache_GetImage(Plugin_GetImageCache(), buffer,
|
||
|
width, height, NULL, NULL);
|
||
|
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return DeviceImage_GetBitmap(command->imageSmall, DeviceImage_Normal);
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
ListWidget_ResetCommandImages(ListWidgetCommand *command)
|
||
|
{
|
||
|
if (NULL == command)
|
||
|
return FALSE;
|
||
|
|
||
|
if (REQUEST_IMAGE != command->imageLarge)
|
||
|
{
|
||
|
if (NULL != command->imageLarge)
|
||
|
DeviceImage_Release(command->imageLarge);
|
||
|
command->imageLarge = REQUEST_IMAGE;
|
||
|
}
|
||
|
|
||
|
if (REQUEST_IMAGE != command->imageSmall)
|
||
|
{
|
||
|
if (NULL != command->imageSmall)
|
||
|
DeviceImage_Release(command->imageSmall);
|
||
|
command->imageSmall = REQUEST_IMAGE;
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
ListWidget_GetCommandRect(ListWidgetCommand *command, RECT *rect)
|
||
|
{
|
||
|
if (NULL == command || NULL == rect)
|
||
|
return FALSE;
|
||
|
|
||
|
return CopyRect(rect, &command->rect);
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
ListWidget_SetCommandRect(ListWidgetCommand *command, const RECT *rect)
|
||
|
{
|
||
|
if (NULL == command || NULL == rect)
|
||
|
return FALSE;
|
||
|
|
||
|
return CopyRect(&command->rect, rect);
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
ListWidget_GetCommandRectEqual(ListWidgetCommand *command, const RECT *rect)
|
||
|
{
|
||
|
if (NULL == command || NULL == rect)
|
||
|
return FALSE;
|
||
|
|
||
|
return EqualRect(&command->rect, rect);
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
ListWidget_GetCommandPrimary(ListWidgetCommand *command)
|
||
|
{
|
||
|
return (NULL == command ||
|
||
|
(0 != (ListWidgetCommandState_Primary & command->state)));
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL
|
||
|
ListWidget_GetCommandDisabled(ListWidgetCommand *command)
|
||
|
{
|
||
|
return (NULL == command ||
|
||
|
(0 != (ListWidgetCommandState_Disabled & command->state)));
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL
|
||
|
ListWidget_GetCommandPressed(ListWidgetCommand *command)
|
||
|
{
|
||
|
return (NULL == command ||
|
||
|
(0 != (ListWidgetCommandState_Pressed & command->state)));
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
ListWidget_EnableCommand(ListWidgetCommand *command, BOOL enable)
|
||
|
{
|
||
|
if (NULL == command)
|
||
|
return FALSE;
|
||
|
|
||
|
if ((FALSE == enable) == (0 != (ListWidgetCommandState_Disabled & command->state)))
|
||
|
return FALSE;
|
||
|
|
||
|
if (FALSE == enable)
|
||
|
command->state |= ListWidgetCommandState_Disabled;
|
||
|
else
|
||
|
command->state &= ~ListWidgetCommandState_Disabled;
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
ListWidget_SetCommandPressed(ListWidgetCommand *command, BOOL pressed)
|
||
|
{
|
||
|
if (NULL == command)
|
||
|
return FALSE;
|
||
|
|
||
|
if ((FALSE == pressed) == (0 == (ListWidgetCommandState_Pressed & command->state)))
|
||
|
return FALSE;
|
||
|
|
||
|
if (FALSE == pressed)
|
||
|
command->state &= ~ListWidgetCommandState_Pressed;
|
||
|
else
|
||
|
command->state |= ListWidgetCommandState_Pressed;
|
||
|
|
||
|
return TRUE;
|
||
|
}
|