675 lines
20 KiB
C++
675 lines
20 KiB
C++
|
#include "main.h"
|
||
|
#include <windowsx.h>
|
||
|
#include "resource.h"
|
||
|
#include "../winamp/wa_ipc.h"
|
||
|
#include "../nu/DialogSkinner.h"
|
||
|
#include "../nu/menushortcuts.h"
|
||
|
#include "./commandbar.h"
|
||
|
#include "./copyfiles.h"
|
||
|
#include "./settings.h"
|
||
|
#include <shlwapi.h>
|
||
|
#include <strsafe.h>
|
||
|
|
||
|
|
||
|
#define IDT_NOTIFYINFO 1985
|
||
|
#define IDT_UPDATESTATUS 1986
|
||
|
#define DELAY_NOTIFYINFO 200
|
||
|
#define DELAY_UPDATESTATUS 5
|
||
|
|
||
|
#define IDC_FILEVIEW 10000
|
||
|
|
||
|
#define DATAVIEW_PROPW L"DATAVIEW"
|
||
|
|
||
|
#define STRCOMP_INVARIANT MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT)
|
||
|
|
||
|
typedef struct _DATAVIEW
|
||
|
{
|
||
|
CHAR cLetter;
|
||
|
WCHAR szSongInfoCache[MAX_PATH];
|
||
|
} DATAVIEW;
|
||
|
|
||
|
|
||
|
static INT_PTR WINAPI DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||
|
INT_PTR WINAPI DataCmdBar_DialogProc(HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||
|
static void CALLBACK DataViewTimer_OnNotifyInfoElapsed(HWND hdlg, UINT uMsg, UINT_PTR idEvent, DWORD dwTime);
|
||
|
static void CALLBACK DataViewTimer_OnStatusUpdateElapsed(HWND hdlg, UINT uMsg, UINT_PTR idEvent, DWORD dwTime);
|
||
|
|
||
|
HWND CreateCdDataViewWindow(HWND hwndParent, CHAR cLetter)
|
||
|
{
|
||
|
return WASABI_API_CREATEDIALOGPARAMW(IDD_VIEW_CDROM_DATA, hwndParent, DlgProc, (LPARAM)cLetter);
|
||
|
}
|
||
|
|
||
|
#define GetDataView(__hwnd) ((DATAVIEW*)GetPropW(__hwnd, DATAVIEW_PROPW))
|
||
|
|
||
|
static void DataView_NotifyInfoWindow(HWND hdlg, INT iFile, BOOL bForceRefresh)
|
||
|
{
|
||
|
DATAVIEW *pdv = GetDataView(hdlg);
|
||
|
|
||
|
HWND hParent = GetParent(hdlg);
|
||
|
if (hParent)
|
||
|
{
|
||
|
wchar_t szPath[MAX_PATH], *pszPath;
|
||
|
szPath[0] = L'\0';
|
||
|
if (-1 != iFile)
|
||
|
{
|
||
|
HWND hfv = GetDlgItem(hdlg, IDC_FILEVIEW);
|
||
|
if (hfv)
|
||
|
{
|
||
|
if (FileView_GetCurrentPath(hfv, szPath, ARRAYSIZE(szPath)) &&
|
||
|
S_OK == StringCchCatW(szPath, ARRAYSIZE(szPath), L"\\"))
|
||
|
{
|
||
|
FVITEM item;
|
||
|
item.mask = FVIF_TEXT | FVIF_TYPE;
|
||
|
INT l = lstrlenW(szPath);
|
||
|
pszPath = szPath + l;
|
||
|
item.cchTextMax = l;
|
||
|
item.pszText = pszPath;
|
||
|
item.cchTextMax = ARRAYSIZE(szPath) - item.cchTextMax;
|
||
|
if (!FileView_GetFile(hfv, iFile, &item) || FVFT_AUDIO != item.wType) szPath[0] = L'\0';
|
||
|
else if (item.pszText != szPath) StringCchCopy(szPath, ARRAYSIZE(szPath), item.pszText);
|
||
|
}
|
||
|
else szPath[0] = L'\0';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (pdv && !bForceRefresh &&
|
||
|
CSTR_EQUAL == CompareString(STRCOMP_INVARIANT, NORM_IGNORECASE, pdv->szSongInfoCache, -1, szPath, -1))
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
SendMessageW(hParent, WM_SHOWFILEINFO, (WPARAM)((bForceRefresh) ? WISF_FORCE : WISF_NORMAL), (LPARAM)szPath);
|
||
|
if (pdv) StringCchPrintfW(pdv->szSongInfoCache, sizeof(pdv->szSongInfoCache)/sizeof(pdv->szSongInfoCache[0]), szPath);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static void DataViewStatus_UpdateText(HWND hdlg)
|
||
|
{
|
||
|
WCHAR szStatus[256] = {0};
|
||
|
|
||
|
HWND hFileView = GetDlgItem(hdlg, IDC_FILEVIEW);
|
||
|
|
||
|
HWND hbar = ViewContainer_GetCmdBar(GetParent(hdlg));
|
||
|
if (!hbar) return;
|
||
|
|
||
|
if (hFileView)
|
||
|
FileView_GetStatusText(hFileView, szStatus, sizeof(szStatus)/sizeof(szStatus[0]));
|
||
|
DataView_NotifyInfoWindow(hdlg, -1, FALSE);
|
||
|
SetWindowTextW(hbar, szStatus);
|
||
|
}
|
||
|
typedef struct _COLUMN
|
||
|
{
|
||
|
INT id;
|
||
|
INT width;
|
||
|
} COLUMN;
|
||
|
|
||
|
static COLUMN defaultColumns[] =
|
||
|
{
|
||
|
{ FVCOLUMN_NAME, 200 },
|
||
|
{ FVCOLUMN_SIZE, 82 },
|
||
|
{ FVCOLUMN_TYPE, 64 },
|
||
|
{ FVCOLUMN_MODIFIED, 140 },
|
||
|
{ FVCOLUMN_EXTENSION, 64 },
|
||
|
};
|
||
|
|
||
|
static LPTSTR DataView_ColumnsToStr(LPTSTR pszText, size_t cchTextMax, COLUMN *pColumns, INT count)
|
||
|
{
|
||
|
if (!pszText || cchTextMax < 1) return NULL;
|
||
|
pszText[0] = TEXT('\0');
|
||
|
|
||
|
if (!pColumns) return pszText;
|
||
|
LPTSTR pc = pszText;
|
||
|
for(int i = 0; i < count; i++)
|
||
|
{
|
||
|
HRESULT hr = StringCchPrintfEx(pc, cchTextMax, &pc, &cchTextMax, STRSAFE_IGNORE_NULLS,
|
||
|
TEXT("%c(%d, %d)"), ((0 == i) ? TEXT(' ') : TEXT(',')), pColumns[i].id, pColumns[i].width);
|
||
|
if (S_OK != hr) return NULL;
|
||
|
}
|
||
|
return pszText;
|
||
|
}
|
||
|
|
||
|
static void DataView_LoadFileViewColumns(HWND hdlg)
|
||
|
{
|
||
|
UINT szColumns[256] = {0};
|
||
|
HWND hctrl = GetDlgItem(hdlg, IDC_FILEVIEW);
|
||
|
if (!hctrl) return;
|
||
|
|
||
|
INT count = FileView_GetColumnArray(hctrl, ARRAYSIZE(szColumns), szColumns);
|
||
|
for (int i = count-1; i >= 0; i--) FileView_DeleteColumn(hctrl, szColumns[i]);
|
||
|
TCHAR szColumnList[4096] = {0};
|
||
|
|
||
|
if (S_OK != Settings_ReadValue(C_DATAVIEW, DVF_COLUMNLIST, szColumnList, sizeof(szColumnList)) ||
|
||
|
TEXT('\0') == *szColumnList)
|
||
|
{
|
||
|
DataView_ColumnsToStr(szColumnList, ARRAYSIZE(szColumnList), defaultColumns, ARRAYSIZE(defaultColumns));
|
||
|
}
|
||
|
|
||
|
for (LPCTSTR pc = szColumnList, pBlock = NULL; TEXT('\0') != *pc; pc++)
|
||
|
{
|
||
|
if (TEXT('(') == *pc) pBlock = (pc + 1);
|
||
|
else if (TEXT(')') == *pc)
|
||
|
{
|
||
|
if (pBlock && pBlock != pc)
|
||
|
{
|
||
|
FVCOLUMN fvc;
|
||
|
fvc.mask = 0;
|
||
|
while (TEXT(' ') == *pBlock && pBlock != pc) pBlock++;
|
||
|
if (pBlock != pc)
|
||
|
{
|
||
|
fvc.id = StrToInt(pBlock);
|
||
|
while (TEXT(',') != *pBlock && pBlock != pc) pBlock++;
|
||
|
if (pBlock != pc)
|
||
|
{
|
||
|
while ((TEXT(',') == *pBlock || TEXT(' ') == *pBlock) && pBlock != pc) pBlock++;
|
||
|
if (pBlock != pc)
|
||
|
{
|
||
|
fvc.width = StrToInt(pBlock);
|
||
|
if (fvc.width > 0) fvc.mask |= FVCF_WIDTH;
|
||
|
}
|
||
|
}
|
||
|
FileView_InsertColumn(hctrl, &fvc);
|
||
|
}
|
||
|
}
|
||
|
pBlock = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
INT orderBy, orderAsc;
|
||
|
Settings_GetInt(C_DATAVIEW, DVF_ORDERBY, &orderBy);
|
||
|
Settings_GetBool(C_DATAVIEW, DVF_ORDERASC, &orderAsc);
|
||
|
FileView_SetSort(hctrl, orderBy, orderAsc);
|
||
|
}
|
||
|
|
||
|
static void DataView_SaveFileViewColumns(HWND hdlg)
|
||
|
{
|
||
|
UINT szOrder[256] = {0};
|
||
|
COLUMN szColumns[256] = {0};
|
||
|
TCHAR szBuffer[1024] = {0};
|
||
|
|
||
|
HWND hctrl = GetDlgItem(hdlg, IDC_FILEVIEW);
|
||
|
if (!hctrl) return;
|
||
|
|
||
|
INT count = FileView_GetColumnArray(hctrl, ARRAYSIZE(szOrder), szOrder);
|
||
|
for (int i = 0; i < count; i++)
|
||
|
{
|
||
|
szColumns[i].id = szOrder[i];
|
||
|
szColumns[i].width = FileView_GetColumnWidth(hctrl, szOrder[i]);
|
||
|
}
|
||
|
DataView_ColumnsToStr(szBuffer, ARRAYSIZE(szBuffer), szColumns, count);
|
||
|
Settings_SetString(C_DATAVIEW, DVF_COLUMNLIST, szBuffer);
|
||
|
|
||
|
DWORD sort = FileView_GetSort(hctrl);
|
||
|
Settings_SetInt(C_DATAVIEW, DVF_ORDERBY, LOWORD(sort));
|
||
|
Settings_SetBool(C_DATAVIEW, DVF_ORDERASC, HIWORD(sort));
|
||
|
|
||
|
|
||
|
}
|
||
|
static UINT DataView_ReadFileViewStyle()
|
||
|
{
|
||
|
UINT style = 0;
|
||
|
INT nVal;
|
||
|
|
||
|
style = FVS_DETAILVIEW;
|
||
|
if (S_OK == Settings_GetInt(C_DATAVIEW, DVF_VIEWMODE, &nVal))
|
||
|
{
|
||
|
switch(nVal)
|
||
|
{
|
||
|
case FVS_ICONVIEW:
|
||
|
case FVS_LISTVIEW:
|
||
|
style = nVal;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (S_OK == Settings_GetInt(C_DATAVIEW, DVF_SHOWAUDIO, &nVal) && nVal) style |= FVS_SHOWAUDIO;
|
||
|
if (S_OK == Settings_GetInt(C_DATAVIEW, DVF_SHOWVIDEO, &nVal) && nVal) style |= FVS_SHOWVIDEO;
|
||
|
if (S_OK == Settings_GetInt(C_DATAVIEW, DVF_SHOWPLAYLIST, &nVal) && nVal) style |= FVS_SHOWPLAYLIST;
|
||
|
if (S_OK == Settings_GetInt(C_DATAVIEW, DVF_SHOWUNKNOWN, &nVal) && nVal) style |= FVS_SHOWUNKNOWN;
|
||
|
if (S_OK == Settings_GetInt(C_DATAVIEW, DVF_HIDEEXTENSION, &nVal) && nVal) style |= FVS_HIDEEXTENSION;
|
||
|
if (S_OK == Settings_GetInt(C_DATAVIEW, DVF_IGNOREHIDDEN, &nVal) && nVal) style |= FVS_IGNOREHIDDEN;
|
||
|
if (S_OK == Settings_GetInt(C_GLOBAL, GF_ENQUEUEBYDEFAULT, &nVal) && nVal)
|
||
|
style |= FVS_ENQUEUE;
|
||
|
|
||
|
return style;
|
||
|
}
|
||
|
|
||
|
static void DataView_SaveFileViewStyle(UINT uStyle)
|
||
|
{
|
||
|
Settings_SetInt(C_DATAVIEW, DVF_VIEWMODE, (FVS_VIEWMASK & uStyle));
|
||
|
Settings_SetBool(C_DATAVIEW, DVF_SHOWAUDIO, (FVS_SHOWAUDIO & uStyle));
|
||
|
Settings_SetBool(C_DATAVIEW, DVF_SHOWVIDEO, (FVS_SHOWVIDEO & uStyle));
|
||
|
Settings_SetBool(C_DATAVIEW, DVF_SHOWPLAYLIST, (FVS_SHOWPLAYLIST & uStyle));
|
||
|
Settings_SetBool(C_DATAVIEW, DVF_SHOWUNKNOWN, (FVS_SHOWUNKNOWN & uStyle));
|
||
|
Settings_SetBool(C_DATAVIEW, DVF_HIDEEXTENSION, (FVS_HIDEEXTENSION & uStyle));
|
||
|
Settings_SetBool(C_DATAVIEW, DVF_IGNOREHIDDEN, (FVS_IGNOREHIDDEN & uStyle));
|
||
|
}
|
||
|
|
||
|
static BOOL DataView_OnInitDialog(HWND hdlg, HWND hwndFocus, LPARAM lParam)
|
||
|
{
|
||
|
RECT rc;
|
||
|
HWND hctrl;
|
||
|
|
||
|
DATAVIEW *pdv = (DATAVIEW*)calloc(1, sizeof(DATAVIEW));
|
||
|
if (pdv)
|
||
|
{
|
||
|
pdv->cLetter = (CHAR)lParam;
|
||
|
pdv->szSongInfoCache[0] = L'\0';
|
||
|
SetPropW(hdlg, DATAVIEW_PROPW, pdv);
|
||
|
}
|
||
|
|
||
|
GetClientRect(hdlg, &rc);
|
||
|
|
||
|
MLSkinWindow2(plugin.hwndLibraryParent, hdlg, SKINNEDWND_TYPE_AUTO, SWS_USESKINFONT | SWS_USESKINCOLORS | SWS_USESKINCURSORS);
|
||
|
|
||
|
MLFILEVIEWCREATESTRUCT fvcs;
|
||
|
fvcs.hwndParent = hdlg;
|
||
|
fvcs.hwndInsertAfter = hdlg;
|
||
|
fvcs.fStyle = DataView_ReadFileViewStyle();
|
||
|
fvcs.x = 0;
|
||
|
fvcs.y = 0;
|
||
|
fvcs.cx = rc.right - rc.left;
|
||
|
fvcs.cy = rc.bottom - rc.top - 4;
|
||
|
hctrl = (HWND)SENDMLIPC(plugin.hwndLibraryParent, ML_IPC_CREATEFILEVIEW, (WPARAM)&fvcs);
|
||
|
|
||
|
if (hctrl)
|
||
|
{
|
||
|
wchar_t szRoot[] = L"x:";
|
||
|
if (pdv) szRoot[0] = pdv->cLetter;
|
||
|
//szRoot[0] = L'C';
|
||
|
|
||
|
FileView_SetRoot(hctrl, szRoot);
|
||
|
SetWindowLongPtrW(hctrl, GWLP_ID, IDC_FILEVIEW);
|
||
|
|
||
|
DataView_LoadFileViewColumns(hdlg);
|
||
|
SetWindowLongPtrW(hctrl, GWL_STYLE, GetWindowLongPtrW(hctrl, GWL_STYLE) | WS_VISIBLE);
|
||
|
|
||
|
INT nPos;
|
||
|
if (S_OK == Settings_GetInt(C_DATAVIEW, DVF_DIVIDERPOS, &nPos))
|
||
|
FileView_SetDividerPos(hctrl, nPos, FVRF_NOREDRAW);
|
||
|
}
|
||
|
|
||
|
ViewContainer_CreateCmdBar(GetParent(hdlg), hdlg, IDD_COMMANDBAR_DATA, DataCmdBar_DialogProc, (ULONG_PTR)hctrl);
|
||
|
|
||
|
DataView_NotifyInfoWindow(hdlg, -1, TRUE); // ignore cache
|
||
|
SendMessage(hdlg, WM_COMMAND, MAKEWPARAM(ID_DRIVE_MODE_CHANGED, 0), 0L);
|
||
|
|
||
|
TCHAR szRoot[MAX_PATH] = {0};
|
||
|
if (hctrl && S_OK == Settings_ReadString(C_DATAVIEW, DVF_LASTFOLDER, szRoot, ARRAYSIZE(szRoot)))
|
||
|
FileView_SetCurrentPath(hctrl, szRoot, TRUE);
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
static void DataView_OnDestroy(HWND hdlg)
|
||
|
{
|
||
|
KillTimer(hdlg, IDT_NOTIFYINFO);
|
||
|
DataView_NotifyInfoWindow(hdlg, -1, FALSE);
|
||
|
|
||
|
HWND hView = GetDlgItem(hdlg, IDC_FILEVIEW);
|
||
|
if (hView)
|
||
|
{
|
||
|
WCHAR szRoot[MAX_PATH] = {0};
|
||
|
FileView_GetCurrentPath(hView, szRoot, ARRAYSIZE(szRoot));
|
||
|
Settings_SetString(C_DATAVIEW, DVF_LASTFOLDER, szRoot);
|
||
|
|
||
|
DataView_SaveFileViewColumns(hdlg);
|
||
|
DataView_SaveFileViewStyle(FileView_GetStyle(hView));
|
||
|
|
||
|
Settings_SetInt(C_DATAVIEW, DVF_DIVIDERPOS, FileView_GetDividerPos(hView));
|
||
|
|
||
|
}
|
||
|
DATAVIEW *pdv = GetDataView(hdlg);
|
||
|
if (pdv)
|
||
|
{
|
||
|
RemovePropW(hdlg, DATAVIEW_PROPW);
|
||
|
free(pdv);
|
||
|
}
|
||
|
ViewContainer_DestroyCmdBar(GetParent(hdlg));
|
||
|
}
|
||
|
|
||
|
static void CALLBACK DataViewTimer_OnStatusUpdateElapsed(HWND hdlg, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
|
||
|
{
|
||
|
KillTimer(hdlg, idEvent);
|
||
|
DataViewStatus_UpdateText(hdlg);
|
||
|
|
||
|
BOOL enablePlay = FALSE;
|
||
|
HWND hctrl = GetDlgItem(hdlg, IDC_FILEVIEW);
|
||
|
|
||
|
if (hctrl && FileView_GetSelectedCount(hctrl) > 0)
|
||
|
{
|
||
|
enablePlay = (-1 != FileView_GetNextFile(hctrl, -1, FVNF_PLAYABLE | FVNF_SELECTED));
|
||
|
}
|
||
|
|
||
|
HWND hbar = ViewContainer_GetCmdBar(GetParent(hdlg));
|
||
|
if (hbar)
|
||
|
{
|
||
|
if (NULL != (hctrl = GetDlgItem(hbar, IDC_BTN_PLAYEX))) EnableWindow(hctrl, enablePlay);
|
||
|
if (NULL != (hctrl = GetDlgItem(hbar, IDC_BTN_COPY))) EnableWindow(hctrl, enablePlay);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
static void CALLBACK DataViewTimer_OnNotifyInfoElapsed(HWND hdlg, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
|
||
|
{
|
||
|
KillTimer(hdlg, IDT_NOTIFYINFO);
|
||
|
HWND hFileView = GetDlgItem(hdlg, IDC_FILEVIEW);
|
||
|
|
||
|
INT iFile = -1;
|
||
|
if (hFileView)
|
||
|
{
|
||
|
iFile = FileView_GetSelectedCount(hFileView);
|
||
|
if (1 != iFile) iFile = -1;
|
||
|
else iFile = FileView_GetNextFile(hFileView, -1, FVNF_FOCUSED);
|
||
|
}
|
||
|
|
||
|
DataView_NotifyInfoWindow(hdlg, iFile, FALSE);
|
||
|
}
|
||
|
|
||
|
static void DataView_OnWindowPosChanged(HWND hdlg, WINDOWPOS *pwp)
|
||
|
{
|
||
|
if (0 == (SWP_NOSIZE & pwp->flags))
|
||
|
{
|
||
|
HWND hctrl;
|
||
|
RECT rc, rw;
|
||
|
GetClientRect(hdlg, &rc);
|
||
|
|
||
|
hctrl = GetDlgItem(hdlg, IDC_FILEVIEW);
|
||
|
if (hctrl && GetWindowRect(hctrl, &rw))
|
||
|
{
|
||
|
MapWindowPoints(HWND_DESKTOP, hdlg, (POINT*)&rw, 2);
|
||
|
SetWindowPos(hctrl, NULL, 0, 0, rc.right - rc.left, rc.bottom - rc.top,
|
||
|
SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOMOVE | ((SWP_NOREDRAW | SWP_NOCOPYBITS) & pwp->flags));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
static void DataView_OnCopySelection(HWND hdlg)
|
||
|
{
|
||
|
LPWSTR *ppszFiles = NULL;
|
||
|
ULONGLONG *pFSizes;
|
||
|
INT count, iFile;
|
||
|
size_t cchPath, cchFile;
|
||
|
WCHAR szPath[MAX_PATH] = {0};
|
||
|
FVITEM file = {0};
|
||
|
|
||
|
HWND hctrl = GetDlgItem(hdlg, IDC_FILEVIEW);
|
||
|
if (!hctrl) return;
|
||
|
|
||
|
|
||
|
count = FileView_GetSelectedCount(hctrl);
|
||
|
if (count < 1) return;
|
||
|
|
||
|
if (!FileView_GetCurrentPath(hctrl, szPath, sizeof(szPath)/sizeof(szPath[0])) ||
|
||
|
S_OK != StringCchLengthW(szPath, sizeof(szPath)/sizeof(szPath[0]), &cchPath)) return;
|
||
|
|
||
|
ppszFiles = (LPWSTR*)CoTaskMemAlloc(sizeof(LPWSTR)*count);
|
||
|
pFSizes = (ULONGLONG*)CoTaskMemAlloc(sizeof(ULONGLONG)*count);
|
||
|
if (!ppszFiles || !pFSizes)
|
||
|
{
|
||
|
if (ppszFiles) CoTaskMemFree(ppszFiles);
|
||
|
if (pFSizes) CoTaskMemFree(pFSizes);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
iFile = -1;
|
||
|
count = 0;
|
||
|
file.mask = FVIF_TEXT | FVIF_SIZE;
|
||
|
TCHAR szBuffer[MAX_PATH] = {0};
|
||
|
while (-1 != (iFile = FileView_GetNextFile(hctrl, iFile, FVNF_SELECTED | FVNF_PLAYABLE)))
|
||
|
{
|
||
|
file.pszText = szBuffer;
|
||
|
file.cchTextMax = ARRAYSIZE(szBuffer);
|
||
|
if (FileView_GetFile(hctrl, iFile, &file))
|
||
|
{
|
||
|
cchFile = (file.pszText) ? lstrlenW(file.pszText) : 0;
|
||
|
if (cchFile)
|
||
|
{
|
||
|
pFSizes[count] = (ULONGLONG)(((__int64)file.dwSizeHigh << 32) | file.dwSizeLow);
|
||
|
ppszFiles[count] = (LPWSTR)CoTaskMemAlloc(sizeof(WCHAR)*(cchPath + cchFile + 4));
|
||
|
if (ppszFiles[count])
|
||
|
{
|
||
|
PathCombineW(ppszFiles[count], szPath, file.pszText);
|
||
|
count++;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (!MLDisc_CopyFiles(hdlg, ppszFiles, pFSizes, count))
|
||
|
{
|
||
|
if (ppszFiles)
|
||
|
{
|
||
|
for (int i = 0; i < count; i++) CoTaskMemFree(ppszFiles[i]);
|
||
|
CoTaskMemFree(ppszFiles);
|
||
|
}
|
||
|
if (pFSizes) CoTaskMemFree(pFSizes);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static void DataView_OnDriveModeChanged(HWND hdlg)
|
||
|
{
|
||
|
DATAVIEW *pdv = GetDataView(hdlg);
|
||
|
if (!pdv) return;
|
||
|
|
||
|
HWND hbar;
|
||
|
if (NULL != (hbar = ViewContainer_GetCmdBar(GetParent(hdlg))))
|
||
|
{
|
||
|
HWND hctrl;
|
||
|
if (NULL != (hctrl = GetDlgItem(hbar, IDC_BTN_EJECT)))
|
||
|
{
|
||
|
UINT cMode = DriveManager_GetDriveMode(pdv->cLetter);
|
||
|
EnableWindow(hctrl, (DM_MODE_READY == cMode));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
static void DataView_OnCommand(HWND hdlg, INT eventId, INT ctrlId, HWND hwndCtrl)
|
||
|
{
|
||
|
switch(ctrlId)
|
||
|
{
|
||
|
case ID_COPY_SELECTION:
|
||
|
DataView_OnCopySelection(hdlg);
|
||
|
break;
|
||
|
case ID_DRIVE_MODE_CHANGED:
|
||
|
DataView_OnDriveModeChanged(hdlg);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static void FileView_OnFolderChanged(HWND hdlg, NMHDR *phdr)
|
||
|
{
|
||
|
DataView_NotifyInfoWindow(hdlg, -1, FALSE);
|
||
|
SetTimer(hdlg, IDT_UPDATESTATUS, DELAY_UPDATESTATUS, DataViewTimer_OnStatusUpdateElapsed);
|
||
|
}
|
||
|
|
||
|
static void FileView_OnStatusChanged(HWND hdlg, NMHDR *phdr)
|
||
|
{
|
||
|
SetTimer(hdlg, IDT_UPDATESTATUS, DELAY_UPDATESTATUS, DataViewTimer_OnStatusUpdateElapsed);
|
||
|
}
|
||
|
|
||
|
static void FileView_OnFileStateChanged(HWND hdlg, NMFVSTATECHANGED *pnmsc)
|
||
|
{
|
||
|
SetTimer(hdlg, IDT_UPDATESTATUS, DELAY_UPDATESTATUS, DataViewTimer_OnStatusUpdateElapsed);
|
||
|
SetTimer(hdlg, IDT_NOTIFYINFO, DELAY_NOTIFYINFO, DataViewTimer_OnNotifyInfoElapsed);
|
||
|
}
|
||
|
|
||
|
static void FileView_OnDoubleClick(HWND hdlg, NMFVFILEACTIVATE *pnma)
|
||
|
{
|
||
|
if (-1 == pnma->iFile) return;
|
||
|
|
||
|
HWND hctrl = GetDlgItem(hdlg, IDC_FILEVIEW);
|
||
|
if (!hctrl) return;
|
||
|
|
||
|
SendMessageW(hctrl, WM_COMMAND,
|
||
|
MAKEWPARAM(FileView_GetActionCommand(hctrl, (FVS_ENQUEUE & (FileView_GetStyle(hctrl)) ? FVA_ENQUEUE : FVA_PLAY)), 0), 0L);
|
||
|
}
|
||
|
|
||
|
static void FileView_OnUninitOptionsMenu(HWND hdlg, HMENU hMenu, UINT uCommand)
|
||
|
{
|
||
|
HWND hParent = GetParent(hdlg);
|
||
|
if (!hMenu || !hParent || !ViewContainer_GetMiniInfoEnabled(hParent)) return;
|
||
|
INT index = GetMenuItemCount(hMenu);
|
||
|
|
||
|
MENUITEMINFOW mii = { sizeof(MENUITEMINFOW), };
|
||
|
mii.fMask = MIIM_ID;
|
||
|
while (index--)
|
||
|
{
|
||
|
if (GetMenuItemInfoW(hMenu, index, TRUE, &mii) && ID_MINIINFO_SHOW == mii.wID)
|
||
|
{
|
||
|
if (DeleteMenu(hMenu, index, MF_BYPOSITION))
|
||
|
DeleteMenu(hMenu, --index, MF_BYPOSITION);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static void FileView_OnInitOptionsMenu(HWND hdlg, HMENU hMenu)
|
||
|
{
|
||
|
INT index;
|
||
|
HWND hParent;
|
||
|
|
||
|
hParent = GetParent(hdlg);
|
||
|
if (!hMenu || !hParent || !ViewContainer_GetMiniInfoEnabled(hParent)) return;
|
||
|
|
||
|
MENUITEMINFOW mii = { sizeof(MENUITEMINFOW), };
|
||
|
|
||
|
index = GetMenuItemCount(hMenu);
|
||
|
|
||
|
mii.fMask = MIIM_TYPE;
|
||
|
mii.fType = MFT_SEPARATOR;
|
||
|
|
||
|
if (InsertMenuItemW(hMenu, index, TRUE, &mii))
|
||
|
{
|
||
|
wchar_t szText[1024] = {0};
|
||
|
WASABI_API_LNGSTRINGW_BUF(IDS_SHOW_INFO, szText, sizeof(szText)/sizeof(szText[0]));
|
||
|
|
||
|
if (WASABI_API_APP)
|
||
|
{
|
||
|
HACCEL szAccel[24] = {0};
|
||
|
INT c = WASABI_API_APP->app_getAccelerators(GetParent(hdlg), szAccel, sizeof(szAccel)/sizeof(szAccel[0]), FALSE);
|
||
|
AppendShortcutText(szText, sizeof(szText)/sizeof(szText[0]), ID_MINIINFO_SHOW, szAccel, c, MSF_REPLACE);
|
||
|
}
|
||
|
|
||
|
index++;
|
||
|
mii.fMask = MIIM_STRING | MIIM_STATE | MIIM_ID;
|
||
|
mii.dwTypeData = szText;
|
||
|
mii.wID = ID_MINIINFO_SHOW;
|
||
|
mii.fState = (ViewContainer_GetMiniInfoVisible(hParent)) ? MFS_CHECKED : MFS_UNCHECKED;
|
||
|
|
||
|
InsertMenuItemW(hMenu, index, TRUE, &mii);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static void FileView_OnInitFileContextMenu(HWND hdlg, HMENU hMenu, HWND hView)
|
||
|
{
|
||
|
HWND hbar = ViewContainer_GetCmdBar(GetParent(hdlg));
|
||
|
HWND hButton = (hbar) ? GetDlgItem(hbar, IDC_BTN_COPY) : NULL;
|
||
|
if (!hButton) return;
|
||
|
|
||
|
wchar_t szText[1024] = {0};
|
||
|
GetWindowTextW(hButton, szText, sizeof(szText)/sizeof(szText[0]));
|
||
|
|
||
|
if (WASABI_API_APP)
|
||
|
{
|
||
|
HACCEL szAccel[24] = {0};
|
||
|
INT c = WASABI_API_APP->app_getAccelerators(GetParent(hdlg), szAccel, sizeof(szAccel)/sizeof(szAccel[0]), FALSE);
|
||
|
AppendShortcutText(szText, sizeof(szText)/sizeof(szText[0]), ID_COPY_SELECTION, szAccel, c, MSF_REPLACE);
|
||
|
}
|
||
|
|
||
|
MENUITEMINFOW mii = { sizeof(MENUITEMINFOW), };
|
||
|
mii.fMask = MIIM_STRING | MIIM_STATE | MIIM_ID;
|
||
|
mii.dwTypeData = szText;
|
||
|
mii.wID = ID_COPY_SELECTION; // TODO: make id uniqueue
|
||
|
mii.fState = (IsWindowEnabled(hButton)) ? MFS_ENABLED : MFS_DISABLED;
|
||
|
|
||
|
InsertMenuItemW(hMenu, 2, TRUE, &mii);
|
||
|
}
|
||
|
|
||
|
static BOOL FileView_OnInitMenu(HWND hdlg, NMFVMENU *pnm)
|
||
|
{
|
||
|
switch(pnm->uMenuType)
|
||
|
{
|
||
|
case FVMENU_OPTIONS: FileView_OnInitOptionsMenu(hdlg, pnm->hMenu); break;
|
||
|
case FVMENU_FILEOPCONTEXT: FileView_OnInitFileContextMenu(hdlg, pnm->hMenu, pnm->hdr.hwndFrom); break;
|
||
|
}
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
static void FileView_OnUninitMenu(HWND hdlg, NMFVMENU *pnm)
|
||
|
{
|
||
|
switch(pnm->uMenuType)
|
||
|
{
|
||
|
case FVMENU_OPTIONS: FileView_OnUninitOptionsMenu(hdlg, pnm->hMenu, pnm->uCommand); break;
|
||
|
case FVMENU_FILEOPCONTEXT: DeleteMenu(pnm->hMenu, ID_COPY_SELECTION, MF_BYCOMMAND); break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static BOOL FileView_OnMenuCommand(HWND hdlg, NMFVMENU *pnm)
|
||
|
{
|
||
|
switch(pnm->uCommand)
|
||
|
{
|
||
|
case ID_MINIINFO_SHOW:
|
||
|
SendMessageW(GetParent(hdlg), WM_COMMAND, MAKEWPARAM(ID_MINIINFO_SHOW, 0), 0L);
|
||
|
return TRUE;
|
||
|
case ID_COPY_SELECTION:
|
||
|
SendMessageW(hdlg, WM_COMMAND, MAKEWPARAM(ID_COPY_SELECTION, 0), 0L);
|
||
|
return TRUE;
|
||
|
}
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
static INT_PTR DataView_OnNotify(HWND hdlg, INT ctrlId, NMHDR *phdr)
|
||
|
{
|
||
|
switch(phdr->idFrom)
|
||
|
{
|
||
|
case IDC_FILEVIEW:
|
||
|
switch(phdr->code)
|
||
|
{
|
||
|
case FVN_FOLDERCHANGED: FileView_OnFolderChanged(hdlg, phdr); break;
|
||
|
case FVN_STATECHANGED: FileView_OnFileStateChanged(hdlg, (NMFVSTATECHANGED*)phdr); break;
|
||
|
case FVN_STATUSCHANGED: FileView_OnStatusChanged(hdlg, phdr); break;
|
||
|
case NM_DBLCLK: FileView_OnDoubleClick(hdlg, (NMFVFILEACTIVATE*)phdr); break;
|
||
|
case FVN_INITMENU: return FileView_OnInitMenu(hdlg, (NMFVMENU*)phdr);
|
||
|
case FVN_UNINITMENU: FileView_OnUninitMenu(hdlg, (NMFVMENU*)phdr); break;
|
||
|
case FVN_MENUCOMMAND: return FileView_OnMenuCommand(hdlg, (NMFVMENU*)phdr);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
static void DataView_OnQueryInfo(HWND hdlg)
|
||
|
{
|
||
|
KillTimer(hdlg, IDT_NOTIFYINFO);
|
||
|
DataView_NotifyInfoWindow(hdlg, -1, TRUE);
|
||
|
SetTimer(hdlg, IDT_NOTIFYINFO, DELAY_NOTIFYINFO, DataViewTimer_OnNotifyInfoElapsed);
|
||
|
}
|
||
|
|
||
|
static void DataView_OnDisplayChange(HWND hdlg)
|
||
|
{
|
||
|
HWND hctrl = GetDlgItem(hdlg, IDC_FILEVIEW);
|
||
|
if (!hctrl) return;
|
||
|
BOOL bVal;
|
||
|
Settings_GetBool(C_GLOBAL, GF_ENQUEUEBYDEFAULT, &bVal);
|
||
|
FileView_SetStyle(hctrl, (bVal) ? FVS_ENQUEUE : 0L, FVS_ENQUEUE);
|
||
|
}
|
||
|
|
||
|
static INT_PTR WINAPI DlgProc(HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
switch (uMsg)
|
||
|
{
|
||
|
case WM_INITDIALOG: return DataView_OnInitDialog(hdlg, (HWND)wParam, lParam);
|
||
|
case WM_DESTROY: DataView_OnDestroy(hdlg); break;
|
||
|
case WM_WINDOWPOSCHANGED: DataView_OnWindowPosChanged(hdlg, (WINDOWPOS*)lParam); return TRUE;
|
||
|
case WM_COMMAND: DataView_OnCommand(hdlg, HIWORD(wParam), LOWORD(wParam), (HWND)lParam); break;
|
||
|
case WM_NOTIFY: MSGRESULT(hdlg, DataView_OnNotify(hdlg, (INT)wParam, (LPNMHDR) lParam));
|
||
|
case WM_QUERYFILEINFO: DataView_OnQueryInfo(hdlg); break;
|
||
|
case WM_DISPLAYCHANGE: DataView_OnDisplayChange(hdlg); break;
|
||
|
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|