567 lines
18 KiB
C++
567 lines
18 KiB
C++
|
#include "main.h"
|
||
|
#include "resource.h"
|
||
|
#include "../nu/DialogSkinner.h"
|
||
|
#include "../nu/ChildSizer.h"
|
||
|
#include "config.h"
|
||
|
#include ".\driveListBox.h"
|
||
|
#include ".\infoBox.h"
|
||
|
#include ".\primosdk_helper.h"
|
||
|
#include <strsafe.h>
|
||
|
|
||
|
static ChildWndResizeItem ripburn_rlist[]=
|
||
|
{
|
||
|
{IDC_LBL_DRIVES, 0x0000},
|
||
|
{IDC_LIST_DRIVES, 0x0001},
|
||
|
{IDC_LBL_INFO_DRIVE, 0x0010},
|
||
|
{IDC_LBL_INFO_MEDIUM, 0x0011},
|
||
|
{IDC_LBL_DRIVE_LETTER_VAL, 0x0010},
|
||
|
{IDC_LBL_DRIVE_DESCRIPTION_VAL,0x0010},
|
||
|
{IDC_LBL_DRIVE_BUS_VAL, 0x0010},
|
||
|
{IDC_LBL_DRIVE_TYPES_VAL, 0x0010},
|
||
|
{IDC_LBL_MEDIUM_UPDATE, 0x0010},
|
||
|
{IDC_LBL_MEDIUM_CAPACITY_VAL, 0x0010},
|
||
|
{IDC_LBL_MEDIUM_TRACKN_VAL, 0x0010},
|
||
|
{IDC_LBL_MEDIUM_ERASEABLE_VAL, 0x0010},
|
||
|
{IDC_LBL_MEDIUM_RECORDABLE_VAL,0x0010},
|
||
|
{IDC_LBL_MEDIUM_FORMAT_VAL, 0x0010},
|
||
|
{IDC_LBL_MEDIUM_ADDINFO_VAL, 0x0010},
|
||
|
{IDC_LBL_MEDIUM_DISC_VAL, 0x0010},
|
||
|
{IDC_BTN_REFRESH, 0x0101},
|
||
|
};
|
||
|
|
||
|
static DriveListBox *driveListBox = NULL;
|
||
|
static MLInfoBox *driveInfo = NULL;
|
||
|
static MLInfoBox *mediumInfo = NULL;
|
||
|
|
||
|
static HBRUSH lblHeaderBrush = NULL;
|
||
|
static HBRUSH lblValueBrush = NULL;
|
||
|
|
||
|
static UINT msgNotify = 0;
|
||
|
static CHAR activeDrive = 0x00;
|
||
|
|
||
|
static void CALLBACK FreeAsyncParam(DM_NOTIFY_PARAM *phdr)
|
||
|
{
|
||
|
DM_UNITINFO_PARAM *pui = NULL;
|
||
|
DM_UNITINFO2_PARAM *pui2 = NULL;
|
||
|
if(!phdr) return;
|
||
|
|
||
|
switch(phdr->opCode)
|
||
|
{
|
||
|
case DMOP_UNITINFO:
|
||
|
pui = (DM_UNITINFO_PARAM*)phdr;
|
||
|
if (pui->pszDesc) free(pui->pszDesc);
|
||
|
break;
|
||
|
case DMOP_UNITINFO2:
|
||
|
pui2 = (DM_UNITINFO2_PARAM*)phdr;
|
||
|
if (pui2->pdwTypes) free(pui2->pdwTypes);
|
||
|
break;
|
||
|
}
|
||
|
free(phdr);
|
||
|
}
|
||
|
|
||
|
static void UpdateDriveInfo(HWND hwndDlg, CHAR cLetter)
|
||
|
{
|
||
|
DM_NOTIFY_PARAM header = {0};
|
||
|
DM_UNITINFO_PARAM *pui = NULL;
|
||
|
DM_UNITINFO2_PARAM *pui2 = NULL;
|
||
|
DM_DISCINFOEX_PARAM *pdi = NULL;
|
||
|
DM_DISCINFO2_PARAM *pdi2 = NULL;
|
||
|
wchar_t message[128] = {0};
|
||
|
|
||
|
activeDrive = cLetter;
|
||
|
|
||
|
if(!PrimoSDKHelper_IsLoaded())
|
||
|
{
|
||
|
WASABI_API_LNGSTRINGW_BUF(IDS_NO_INFO_AVAILABLE,message,128);
|
||
|
}
|
||
|
|
||
|
SetDlgItemTextA(hwndDlg, IDC_LBL_DRIVE_LETTER_VAL, &cLetter);
|
||
|
SetDlgItemText(hwndDlg, IDC_LBL_DRIVE_DESCRIPTION_VAL, message);
|
||
|
SetDlgItemText(hwndDlg, IDC_LBL_DRIVE_BUS_VAL, message);
|
||
|
SetDlgItemText(hwndDlg, IDC_LBL_DRIVE_TYPES_VAL, message);
|
||
|
SetDlgItemTextA(hwndDlg, IDC_LBL_MEDIUM_DISC_VAL, NULL);
|
||
|
SetDlgItemTextA(hwndDlg, IDC_LBL_MEDIUM_CAPACITY_VAL, NULL);
|
||
|
SetDlgItemTextA(hwndDlg, IDC_LBL_MEDIUM_FORMAT_VAL, NULL);
|
||
|
SetDlgItemTextA(hwndDlg, IDC_LBL_MEDIUM_ERASEABLE_VAL, NULL);
|
||
|
SetDlgItemTextA(hwndDlg, IDC_LBL_MEDIUM_RECORDABLE_VAL, NULL);
|
||
|
SetDlgItemTextA(hwndDlg, IDC_LBL_MEDIUM_TRACKN_VAL, NULL);
|
||
|
SetDlgItemTextA(hwndDlg, IDC_LBL_MEDIUM_ADDINFO_VAL, NULL);
|
||
|
|
||
|
if (0 == activeDrive) return;
|
||
|
|
||
|
ZeroMemory(&header, sizeof(DM_NOTIFY_PARAM));
|
||
|
|
||
|
header.callback = (INT_PTR)hwndDlg;
|
||
|
header.uMsg = msgNotify;
|
||
|
header.cLetter = cLetter;
|
||
|
header.fnFree = FreeAsyncParam;
|
||
|
|
||
|
// request unitinfo
|
||
|
pui = (DM_UNITINFO_PARAM*)calloc(1, sizeof(DM_UNITINFO_PARAM));
|
||
|
if (pui)
|
||
|
{
|
||
|
CopyMemory(&pui->header, &header, sizeof(DM_NOTIFY_PARAM));
|
||
|
pui->header.fFlags = DMF_DESCRIPTION;
|
||
|
pui->cchDesc = 128;
|
||
|
pui->pszDesc = (CHAR*)calloc(pui->cchDesc, sizeof(CHAR));
|
||
|
DriveManager_GetUnitInfo(pui);
|
||
|
}
|
||
|
|
||
|
// request unitinfo2
|
||
|
pui2 = (DM_UNITINFO2_PARAM*)calloc(1, sizeof(DM_UNITINFO2_PARAM));
|
||
|
if (pui2)
|
||
|
{
|
||
|
CopyMemory(&pui2->header, &header, sizeof(DM_NOTIFY_PARAM));
|
||
|
pui2->header.fFlags = DMF_TYPES;
|
||
|
pui2->nTypes = 32;
|
||
|
pui2->pdwTypes = (DWORD*)calloc(pui2->nTypes, sizeof(DWORD));
|
||
|
DriveManager_GetUnitInfo2(pui2);
|
||
|
}
|
||
|
|
||
|
// request discinfoex
|
||
|
pdi = (DM_DISCINFOEX_PARAM*)calloc(1, sizeof(DM_DISCINFOEX_PARAM));
|
||
|
if (pdi)
|
||
|
{
|
||
|
CopyMemory(&pdi->header, &header, sizeof(DM_NOTIFY_PARAM));
|
||
|
pdi->header.fFlags = DMF_DRIVEMODE_DAO | DMF_MEDIUMTYPE | DMF_MEDIUMFORMAT | DMF_TRACKS | DMF_USED | DMF_FREE;
|
||
|
DriveManager_GetDiscInfoEx(pdi);
|
||
|
}
|
||
|
|
||
|
// request discinfo2
|
||
|
pdi2 = (DM_DISCINFO2_PARAM*)calloc(1, sizeof(DM_DISCINFO2_PARAM));
|
||
|
if (pdi2)
|
||
|
{
|
||
|
CopyMemory(&pdi2->header, &header, sizeof(DM_NOTIFY_PARAM));
|
||
|
pdi2->header.fFlags = DMF_MEDIUM | DMF_MEDIUMEX;
|
||
|
DriveManager_GetDiscInfo2(pdi2);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static BOOL CALLBACK EnumerateNavItemsCB(HNAVITEM hItem, DRIVE *pDrive, LPARAM param)
|
||
|
{
|
||
|
if (!param) return FALSE;
|
||
|
if (pDrive) PostMessageW((HWND)param, msgNotify, (WPARAM)DMW_DRIVEADDED, (LPARAM)pDrive->cLetter);
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
static void SwitchControlVisible(HWND hwndDlg, INT ctrlId, RECT *prcParent, BOOL hide, BOOL bInvalidate = FALSE)
|
||
|
{
|
||
|
HWND hwndCtrl = GetDlgItem(hwndDlg, ctrlId);
|
||
|
|
||
|
if (hwndCtrl)
|
||
|
{
|
||
|
if (hide) ShowWindow(hwndCtrl, SW_HIDE);
|
||
|
else
|
||
|
{
|
||
|
RECT rc;
|
||
|
GetWindowRect(hwndCtrl, &rc);
|
||
|
|
||
|
BOOL bVisible = ((prcParent->right > rc.right) && (prcParent->bottom > rc.bottom));
|
||
|
if (bVisible != IsWindowVisible(hwndCtrl)) ShowWindow(hwndCtrl, (bVisible) ? SW_SHOWNORMAL : SW_HIDE);
|
||
|
if (bVisible && bInvalidate) InvalidateRect(hwndCtrl, NULL, TRUE);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static void ripburn_OnDisplayChanges(HWND hwndDlg)
|
||
|
{
|
||
|
driveListBox->SetColors(dialogSkinner.Color(WADLG_ITEMBG),
|
||
|
dialogSkinner.Color(WADLG_ITEMBG),
|
||
|
dialogSkinner.Color(WADLG_ITEMFG),
|
||
|
dialogSkinner.Color(WADLG_ITEMFG),
|
||
|
dialogSkinner.Color(WADLG_WNDFG));
|
||
|
driveInfo->SetColors( dialogSkinner.Color(WADLG_ITEMBG),
|
||
|
dialogSkinner.Color(WADLG_LISTHEADER_FONTCOLOR),
|
||
|
dialogSkinner.Color(WADLG_LISTHEADER_BGCOLOR));
|
||
|
mediumInfo->SetColors( dialogSkinner.Color(WADLG_ITEMBG),
|
||
|
dialogSkinner.Color(WADLG_LISTHEADER_FONTCOLOR),
|
||
|
dialogSkinner.Color(WADLG_LISTHEADER_BGCOLOR));
|
||
|
|
||
|
if (lblHeaderBrush) DeleteObject(lblHeaderBrush);
|
||
|
lblHeaderBrush = NULL;
|
||
|
|
||
|
if (lblValueBrush) DeleteObject(lblValueBrush);
|
||
|
lblValueBrush = NULL;
|
||
|
|
||
|
// fixes the view not updating correctly on colour theme changes, etc
|
||
|
// NOTE: ideal would be using a LayoutWindows(..) method which would
|
||
|
// help to resolve this as things can be offloaded to gen_ml...
|
||
|
RECT rc;
|
||
|
GetClientRect(hwndDlg, &rc);
|
||
|
RedrawWindow(hwndDlg, &rc, NULL, RDW_INVALIDATE | RDW_ERASE | RDW_ALLCHILDREN | RDW_ERASENOW | RDW_UPDATENOW);
|
||
|
}
|
||
|
|
||
|
static void ripburn_OnInitDialog(HWND hwndDlg)
|
||
|
{
|
||
|
HWND hwndList = GetDlgItem(hwndDlg, IDC_LIST_DRIVES);
|
||
|
|
||
|
driveListBox = new DriveListBox(IDC_LIST_DRIVES);
|
||
|
driveListBox->SetImages(plugin.hDllInstance, IDB_LISTBOX_BACK, IDB_LISTITEM_CDDRIVE);
|
||
|
driveListBox->Init(hwndList);
|
||
|
|
||
|
driveInfo = new MLInfoBox();
|
||
|
driveInfo->Init(GetDlgItem(hwndDlg, IDC_LBL_INFO_DRIVE));
|
||
|
|
||
|
mediumInfo = new MLInfoBox();
|
||
|
mediumInfo->Init(GetDlgItem(hwndDlg, IDC_LBL_INFO_MEDIUM));
|
||
|
|
||
|
UpdateDriveInfo(hwndDlg, 0);
|
||
|
|
||
|
childSizer.Init(hwndDlg,ripburn_rlist,sizeof(ripburn_rlist)/sizeof(ripburn_rlist[0]));
|
||
|
ripburn_OnDisplayChanges(hwndDlg);
|
||
|
|
||
|
if (!msgNotify) msgNotify = RegisterWindowMessageW(L"ripburn_notify_msg");
|
||
|
|
||
|
Plugin_EnumerateNavItems(EnumerateNavItemsCB, (LPARAM)hwndDlg);
|
||
|
Plugin_RegisterListener(hwndDlg, msgNotify, 0);
|
||
|
}
|
||
|
|
||
|
static void ripburn_OnDestroy(HWND hwndDlg)
|
||
|
{
|
||
|
Plugin_UnregisterListener(hwndDlg);
|
||
|
|
||
|
HWND hwndLB = GetDlgItem(hwndDlg, IDC_LIST_DRIVES);
|
||
|
if (hwndLB)
|
||
|
{
|
||
|
INT index = (int)(INT_PTR)SendMessageW(hwndLB, LB_GETCURSEL, 0,0);
|
||
|
DWORD data = (LB_ERR != index) ? (DWORD)SendMessageW(hwndLB, LB_GETITEMDATA, index, 0) : 0;
|
||
|
if (data) g_config->WriteInt(L"last_drive", (CHAR)(0xFF & data));
|
||
|
}
|
||
|
|
||
|
if (lblHeaderBrush) DeleteObject(lblHeaderBrush);
|
||
|
lblHeaderBrush = NULL;
|
||
|
if (lblValueBrush) DeleteObject(lblValueBrush);
|
||
|
lblValueBrush = NULL;
|
||
|
|
||
|
if (driveListBox) delete(driveListBox);
|
||
|
driveListBox = NULL;
|
||
|
if (driveInfo) delete(driveInfo);
|
||
|
driveInfo = NULL;
|
||
|
if (mediumInfo) delete(mediumInfo);
|
||
|
mediumInfo = NULL;
|
||
|
}
|
||
|
|
||
|
static void ripburn_OnSize(HWND hwndDlg, int cx, int cy)
|
||
|
{
|
||
|
RECT box;
|
||
|
|
||
|
GetWindowRect(GetDlgItem(hwndDlg, IDC_LBL_INFO_DRIVE), &box);
|
||
|
BOOL hide = FALSE;
|
||
|
|
||
|
SwitchControlVisible(hwndDlg, IDC_LBL_DRIVE_LETTER, &box, FALSE);
|
||
|
SwitchControlVisible(hwndDlg, IDC_LBL_DRIVE_DESCRIPTION, &box, FALSE);
|
||
|
SwitchControlVisible(hwndDlg, IDC_LBL_DRIVE_BUS, &box, FALSE);
|
||
|
SwitchControlVisible(hwndDlg, IDC_LBL_DRIVE_TYPES,&box, FALSE);
|
||
|
SwitchControlVisible(hwndDlg, IDC_LBL_DRIVE_LETTER_VAL, &box, hide, TRUE);
|
||
|
SwitchControlVisible(hwndDlg, IDC_LBL_DRIVE_DESCRIPTION_VAL, &box, hide, TRUE);
|
||
|
SwitchControlVisible(hwndDlg, IDC_LBL_DRIVE_BUS_VAL, &box, hide, TRUE);
|
||
|
SwitchControlVisible(hwndDlg, IDC_LBL_DRIVE_TYPES_VAL, &box, hide, TRUE);
|
||
|
|
||
|
GetWindowRect(GetDlgItem(hwndDlg, IDC_LBL_INFO_MEDIUM), &box);
|
||
|
hide = IsWindowVisible(GetDlgItem(hwndDlg, IDC_LBL_MEDIUM_UPDATE));
|
||
|
if (hide) InvalidateRect(GetDlgItem(hwndDlg, IDC_LBL_MEDIUM_UPDATE), NULL, TRUE);
|
||
|
|
||
|
if(PrimoSDKHelper_IsLoaded())
|
||
|
/*{
|
||
|
ShowWindow(GetDlgItem(hwndDlg, IDC_LBL_MEDIUM_UPDATE), SW_SHOW);
|
||
|
}
|
||
|
else*/
|
||
|
{
|
||
|
ShowWindow(GetDlgItem(hwndDlg, IDC_LBL_MEDIUM_UPDATE), SW_HIDE);
|
||
|
SwitchControlVisible(hwndDlg, IDC_LBL_MEDIUM_CAPACITY_VAL, &box, hide, TRUE);
|
||
|
SwitchControlVisible(hwndDlg, IDC_LBL_MEDIUM_FORMAT_VAL, &box, hide, TRUE);
|
||
|
SwitchControlVisible(hwndDlg, IDC_LBL_MEDIUM_ERASEABLE_VAL, &box, hide, TRUE);
|
||
|
SwitchControlVisible(hwndDlg, IDC_LBL_MEDIUM_RECORDABLE_VAL,&box, hide, TRUE);
|
||
|
SwitchControlVisible(hwndDlg, IDC_LBL_MEDIUM_TRACKN_VAL, &box, hide, TRUE);
|
||
|
SwitchControlVisible(hwndDlg, IDC_LBL_MEDIUM_DISC_VAL, &box, hide, TRUE);
|
||
|
SwitchControlVisible(hwndDlg, IDC_LBL_MEDIUM_ADDINFO_VAL, &box, hide, TRUE);
|
||
|
|
||
|
SwitchControlVisible(hwndDlg, IDC_LBL_MEDIUM_TYPE, &box, hide);
|
||
|
SwitchControlVisible(hwndDlg, IDC_LBL_MEDIUM_CAPACITY, &box, hide);
|
||
|
SwitchControlVisible(hwndDlg, IDC_LBL_MEDIUM_FORMAT, &box, hide);
|
||
|
SwitchControlVisible(hwndDlg, IDC_LBL_MEDIUM_ERASEABLE, &box, hide);
|
||
|
SwitchControlVisible(hwndDlg, IDC_LBL_MEDIUM_RECORDABLE, &box, hide);
|
||
|
SwitchControlVisible(hwndDlg, IDC_LBL_MEDIUM_TRACKN, &box, hide);
|
||
|
SwitchControlVisible(hwndDlg, IDC_LBL_MEDIUM_ADDINFO, &box, hide);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static int LabelColoring(HDC hdc, HWND hwndCtrl)
|
||
|
{
|
||
|
switch(GetDlgCtrlID(hwndCtrl))
|
||
|
{
|
||
|
case IDC_LBL_DRIVES:
|
||
|
if(!lblHeaderBrush) lblHeaderBrush = CreateSolidBrush(dialogSkinner.Color(WADLG_LISTHEADER_BGCOLOR));
|
||
|
SetBkMode(hdc, TRANSPARENT);
|
||
|
SetTextColor(hdc, dialogSkinner.Color(WADLG_LISTHEADER_FONTCOLOR));
|
||
|
return (BOOL)(INT_PTR)lblHeaderBrush;
|
||
|
case IDC_LBL_MEDIUM_NOINFO:
|
||
|
case IDC_LBL_MEDIUM_CAPACITY_VAL:
|
||
|
case IDC_LBL_MEDIUM_TRACKN_VAL:
|
||
|
case IDC_LBL_MEDIUM_ERASEABLE_VAL:
|
||
|
case IDC_LBL_MEDIUM_RECORDABLE_VAL:
|
||
|
case IDC_LBL_MEDIUM_FORMAT_VAL:
|
||
|
case IDC_LBL_MEDIUM_DISC_VAL:
|
||
|
case IDC_LBL_MEDIUM_ADDINFO_VAL:
|
||
|
case IDC_LBL_DRIVE_LETTER_VAL:
|
||
|
case IDC_LBL_DRIVE_DESCRIPTION_VAL:
|
||
|
case IDC_LBL_DRIVE_BUS_VAL:
|
||
|
case IDC_LBL_DRIVE_TYPES_VAL:
|
||
|
case IDC_LBL_MEDIUM_UPDATE:
|
||
|
if(!lblValueBrush) lblValueBrush = CreateSolidBrush(dialogSkinner.Color(WADLG_ITEMBG));
|
||
|
SetBkColor(hdc, dialogSkinner.Color(WADLG_ITEMBG));
|
||
|
SetTextColor(hdc, dialogSkinner.Color(WADLG_ITEMFG));
|
||
|
return (BOOL)(INT_PTR)lblValueBrush;
|
||
|
case IDC_LBL_MEDIUM_CAPACITY:
|
||
|
case IDC_LBL_MEDIUM_TRACKN:
|
||
|
case IDC_LBL_MEDIUM_ERASEABLE:
|
||
|
case IDC_LBL_MEDIUM_RECORDABLE:
|
||
|
case IDC_LBL_MEDIUM_FORMAT:
|
||
|
case IDC_LBL_MEDIUM_ADDINFO:
|
||
|
case IDC_LBL_DRIVE_LETTER:
|
||
|
case IDC_LBL_DRIVE_DESCRIPTION:
|
||
|
case IDC_LBL_DRIVE_BUS:
|
||
|
case IDC_LBL_DRIVE_TYPES:
|
||
|
case IDC_LBL_MEDIUM_TYPE:
|
||
|
if(!lblValueBrush) lblValueBrush = CreateSolidBrush(dialogSkinner.Color(WADLG_ITEMBG));
|
||
|
SetBkMode(hdc, TRANSPARENT);
|
||
|
// SetBkColor(hdc, dialogSkinner.Color(WADLG_ITEMBG));
|
||
|
SetTextColor(hdc, dialogSkinner.Color(WADLG_ITEMFG));
|
||
|
return (BOOL)(INT_PTR)lblValueBrush;
|
||
|
}
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
static void Drive_OnAdded(HWND hwndDlg, CHAR cLetter)
|
||
|
{
|
||
|
HWND hwndLB = GetDlgItem(hwndDlg, IDC_LIST_DRIVES);
|
||
|
if (IsWindow(hwndLB))
|
||
|
{
|
||
|
wchar_t str[] = {cLetter, 0x00};
|
||
|
INT index = (INT)SendMessageW(hwndLB, LB_ADDSTRING, 0, (LPARAM)str);
|
||
|
if (LB_ERR != index)
|
||
|
{
|
||
|
SendMessageW(hwndLB, LB_SETITEMDATA, index, (LPARAM)cLetter);
|
||
|
|
||
|
INT idxSelection = (int)(INT_PTR)SendMessageW(hwndLB, LB_GETCURSEL, 0,0);
|
||
|
if (LB_ERR == idxSelection && cLetter == g_config->ReadInt(L"last_drive", cLetter))
|
||
|
{
|
||
|
if (LB_ERR != SendMessageW(hwndLB, LB_SETCURSEL, index, 0L))
|
||
|
{
|
||
|
UpdateDriveInfo(hwndDlg, cLetter);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// request unitinfo
|
||
|
DM_UNITINFO_PARAM *pui = (DM_UNITINFO_PARAM*)calloc(1, sizeof(DM_UNITINFO_PARAM));
|
||
|
if (pui)
|
||
|
{
|
||
|
pui->header.callback = (INT_PTR)hwndDlg;
|
||
|
pui->header.uMsg = msgNotify;
|
||
|
pui->header.cLetter = cLetter;
|
||
|
pui->header.fnFree = FreeAsyncParam;
|
||
|
DriveManager_GetUnitInfo(pui);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static INT GetListBoxIndex(HWND hwndLB, CHAR cLetter)
|
||
|
{
|
||
|
wchar_t str[] = {cLetter, 0x00};
|
||
|
return (cLetter && hwndLB) ? (INT)SendMessageW(hwndLB, LB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)str) : LB_ERR;
|
||
|
}
|
||
|
|
||
|
static void Drive_OnRemoved(HWND hwndDlg, CHAR cLetter)
|
||
|
{
|
||
|
HWND hwndLB = GetDlgItem(hwndDlg, IDC_LIST_DRIVES);
|
||
|
|
||
|
if (IsWindow(hwndLB))
|
||
|
{
|
||
|
INT index = GetListBoxIndex(hwndLB, cLetter);
|
||
|
if (LB_ERR != index) SendMessageW(hwndLB, LB_DELETESTRING, (WPARAM)index, 0L);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static void GetInfo_Completed(HWND hwndDlg, DM_NOTIFY_PARAM *phdr)
|
||
|
{
|
||
|
wchar_t szBuffer[256] = {0};
|
||
|
|
||
|
DM_UNITINFO_PARAM *pui = NULL;
|
||
|
DM_UNITINFO2_PARAM *pui2 = NULL;
|
||
|
DM_DISCINFOEX_PARAM *pdi = NULL;
|
||
|
DM_DISCINFO2_PARAM *pdi2 = NULL;
|
||
|
|
||
|
switch(phdr->opCode)
|
||
|
{
|
||
|
case DMOP_UNITINFO:
|
||
|
pui = (DM_UNITINFO_PARAM*)phdr;
|
||
|
if (0 == phdr->result)
|
||
|
{
|
||
|
HWND hwndLB = GetDlgItem(hwndDlg, IDC_LIST_DRIVES);
|
||
|
if (hwndLB)
|
||
|
{
|
||
|
INT idxLB = GetListBoxIndex(hwndLB, phdr->cLetter);
|
||
|
if (LB_ERR != idxLB)
|
||
|
{
|
||
|
DWORD data = MAKELONG(phdr->cLetter, pui->dwType);
|
||
|
if (data != (DWORD)SendMessage(hwndLB ,LB_GETITEMDATA, idxLB, 0))
|
||
|
{
|
||
|
if (LB_ERR != SendMessageW(hwndLB, LB_SETITEMDATA, idxLB, (LPARAM)data))
|
||
|
{
|
||
|
RECT rc;
|
||
|
SendMessageW(hwndLB, LB_GETITEMRECT, idxLB, (LPARAM)&rc);
|
||
|
InvalidateRect(hwndLB, &rc, FALSE);
|
||
|
UpdateWindow(hwndLB);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (activeDrive == phdr->cLetter && pui->pszDesc) SetDlgItemTextA(hwndDlg, IDC_LBL_DRIVE_DESCRIPTION_VAL, (pui->cchDesc > 0) ? pui->pszDesc : "");
|
||
|
}
|
||
|
break;
|
||
|
case DMOP_UNITINFO2:
|
||
|
pui2 = (DM_UNITINFO2_PARAM*)phdr;
|
||
|
if (0 == phdr->result && activeDrive == phdr->cLetter)
|
||
|
{
|
||
|
SetDlgItemTextW(hwndDlg, IDC_LBL_DRIVE_BUS_VAL, Drive_GetBusTypeString(pui2->dwBusType));
|
||
|
szBuffer[0] = 0x00;
|
||
|
for (int i = 0; i < pui2->nTypes; i++)
|
||
|
{
|
||
|
if (0 != i) StringCchCatW(szBuffer, sizeof(szBuffer)/sizeof(wchar_t), L", ");
|
||
|
StringCchCatW(szBuffer, sizeof(szBuffer)/sizeof(wchar_t), Drive_GetTypeString(pui2->pdwTypes[i]));
|
||
|
}
|
||
|
SetDlgItemTextW(hwndDlg, IDC_LBL_DRIVE_TYPES_VAL, szBuffer);
|
||
|
}
|
||
|
break;
|
||
|
case DMOP_DISCINFO:
|
||
|
pdi = (DM_DISCINFOEX_PARAM*)phdr;
|
||
|
if (0 == phdr->result && activeDrive == phdr->cLetter)
|
||
|
{
|
||
|
StringCchPrintfW(szBuffer, sizeof(szBuffer)/sizeof(wchar_t),
|
||
|
WASABI_API_LNGSTRINGW(IDS_X_OF_X_SECTORS_FREE),
|
||
|
pdi->dwFree, pdi->dwUsed + pdi->dwFree);
|
||
|
SetDlgItemTextW(hwndDlg, IDC_LBL_MEDIUM_CAPACITY_VAL, szBuffer);
|
||
|
SetDlgItemInt(hwndDlg, IDC_LBL_MEDIUM_TRACKN_VAL, pdi->dwTracks, FALSE);
|
||
|
SetDlgItemText(hwndDlg, IDC_LBL_MEDIUM_ERASEABLE_VAL, WASABI_API_LNGSTRINGW((pdi->bErasable) ? IDS_YES : IDS_NO));
|
||
|
SetDlgItemText(hwndDlg, IDC_LBL_MEDIUM_RECORDABLE_VAL, WASABI_API_LNGSTRINGW((Medium_IsRecordableType(pdi->dwMediumType)) ? IDS_YES : IDS_NO));
|
||
|
SetDlgItemText(hwndDlg, IDC_LBL_MEDIUM_ADDINFO_VAL, Medium_GetTypeString(pdi->dwMediumType));
|
||
|
SetDlgItemText(hwndDlg, IDC_LBL_MEDIUM_FORMAT_VAL, Medium_GetFormatString(pdi->dwMediumFormat));
|
||
|
}
|
||
|
break;
|
||
|
case DMOP_DISCINFO2:
|
||
|
pdi2 = (DM_DISCINFO2_PARAM*)phdr;
|
||
|
if (0 == phdr->result && activeDrive == phdr->cLetter)
|
||
|
{
|
||
|
SetDlgItemTextW(hwndDlg, IDC_LBL_MEDIUM_DISC_VAL, Medium_GetPhysicalTypeString(pdi2->dwMediumEx));
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static void View_OnPluginNotify(HWND hwndDlg, WORD wCode, INT_PTR param)
|
||
|
{
|
||
|
switch(wCode)
|
||
|
{
|
||
|
case DMW_DRIVEADDED: Drive_OnAdded(hwndDlg, (CHAR)param); break;
|
||
|
case DMW_DRIVEREMOVED: Drive_OnRemoved(hwndDlg, (CHAR)param); break;
|
||
|
case DMW_MEDIUMARRIVED:
|
||
|
case DMW_MEDIUMREMOVED: if ((CHAR)param == activeDrive) UpdateDriveInfo(hwndDlg, activeDrive); break;
|
||
|
case DMW_OPCOMPLETED:
|
||
|
SendMessage(hwndDlg, WM_SIZE, 0, 0);
|
||
|
GetInfo_Completed(hwndDlg, (DM_NOTIFY_PARAM*)param);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static INT_PTR ListBox_OnKeyPressed(HWND hwndDlg, HWND hwndLB, WORD wKey, INT iCurret)
|
||
|
{
|
||
|
switch(wKey)
|
||
|
{
|
||
|
case VK_F5: DriveManager_Update(TRUE); return -2;
|
||
|
case VK_SPACE:
|
||
|
PostMessageW(hwndDlg, WM_COMMAND, MAKEWPARAM(IDC_LIST_DRIVES,LBN_DBLCLK), (LPARAM)hwndLB);
|
||
|
return -2;
|
||
|
}
|
||
|
if (wKey >= 'A' && wKey <= 'Z')
|
||
|
{
|
||
|
INT index = GetListBoxIndex(hwndLB, (CHAR)wKey);
|
||
|
return (LB_ERR != index) ? index : -2;
|
||
|
}
|
||
|
|
||
|
return -1; // do default
|
||
|
}
|
||
|
|
||
|
INT_PTR CALLBACK view_ripburnDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
|
||
|
{
|
||
|
INT_PTR a;
|
||
|
|
||
|
if (uMsg == WM_CTLCOLORSTATIC )
|
||
|
{
|
||
|
a = LabelColoring((HDC)wParam, (HWND) lParam);
|
||
|
if (a) return a;
|
||
|
}
|
||
|
|
||
|
a = driveListBox->HandleMsgProc(uMsg,wParam,lParam); if (a) return a;
|
||
|
a = dialogSkinner.Handle(hwndDlg,uMsg,wParam,lParam); if (a) return a;
|
||
|
|
||
|
switch(uMsg)
|
||
|
{
|
||
|
case WM_INITDIALOG:
|
||
|
ripburn_OnInitDialog(hwndDlg);
|
||
|
break;
|
||
|
case WM_DISPLAYCHANGE:
|
||
|
ripburn_OnDisplayChanges(hwndDlg);
|
||
|
break;
|
||
|
case WM_SIZE:
|
||
|
if (wParam != SIZE_MINIMIZED)
|
||
|
{
|
||
|
childSizer.Resize(hwndDlg,ripburn_rlist,sizeof(ripburn_rlist)/sizeof(ripburn_rlist[0]));
|
||
|
ripburn_OnSize(hwndDlg, LOWORD(lParam), HIWORD(lParam));
|
||
|
}
|
||
|
break;
|
||
|
case WM_COMMAND:
|
||
|
switch (LOWORD(wParam))
|
||
|
{
|
||
|
case IDC_LIST_DRIVES:
|
||
|
if (HIWORD(wParam) == LBN_SELCHANGE)
|
||
|
{
|
||
|
INT index = (int)(INT_PTR)SendMessage((HWND)lParam, LB_GETCURSEL, 0,0);
|
||
|
DWORD data = (LB_ERR != index) ? (DWORD)SendMessage((HWND)lParam ,LB_GETITEMDATA, index, 0) : 0;
|
||
|
if (data) UpdateDriveInfo(hwndDlg, (CHAR)(0xFF & data));
|
||
|
}
|
||
|
else if (HIWORD(wParam) == LBN_DBLCLK)
|
||
|
{
|
||
|
INT index = (int)(INT_PTR)SendMessage((HWND)lParam, LB_GETCURSEL, 0,0);
|
||
|
DWORD data = (LB_ERR != index) ? (DWORD)SendMessage((HWND)lParam ,LB_GETITEMDATA, index, 0) : 0;
|
||
|
HNAVITEM hItem = (data) ? Plugin_GetNavItemFromLetter((CHAR)(0xFF & data)) : NULL;
|
||
|
if (hItem) MLNavItem_Select(plugin.hwndLibraryParent, hItem);
|
||
|
}
|
||
|
break;
|
||
|
case IDC_BTN_REFRESH:
|
||
|
if (HIWORD(wParam) == BN_CLICKED) DriveManager_Update(TRUE);
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
case WM_PAINT:
|
||
|
{
|
||
|
int tab[] = { IDC_LIST_DRIVES | DCW_SUNKENBORDER,
|
||
|
IDC_LBL_DRIVES | DCW_SUNKENBORDER,
|
||
|
IDC_LBL_INFO_DRIVE | DCW_SUNKENBORDER,
|
||
|
IDC_LBL_INFO_MEDIUM | DCW_SUNKENBORDER};
|
||
|
dialogSkinner.Draw(hwndDlg, tab, 4);
|
||
|
}
|
||
|
return 0;
|
||
|
case WM_DESTROY:
|
||
|
ripburn_OnDestroy(hwndDlg);
|
||
|
break;
|
||
|
case WM_ERASEBKGND:
|
||
|
return 0;
|
||
|
case WM_VKEYTOITEM:
|
||
|
return ListBox_OnKeyPressed(hwndDlg, (HWND)lParam, LOWORD(wParam), HIWORD(wParam));
|
||
|
}
|
||
|
if (msgNotify == uMsg)
|
||
|
View_OnPluginNotify(hwndDlg, (WORD)wParam, (INT_PTR)lParam);
|
||
|
|
||
|
return FALSE;
|
||
|
}
|