123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443 |
- #include "main.h"
- #include <strsafe.h>
- #define SYNCDIALOG_PROP L"SyncDialogProp"
- typedef struct SyncDialog
- {
- HWND centerWindow;
- DeviceView *device;
- C_ItemList *libraryList;
- C_ItemList *deviceList;
- BOOL autofillMode;
- } SyncDialog;
- #define SYNCDIALOG(_hwnd) ((SyncDialog*)GetPropW((_hwnd), SYNCDIALOG_PROP))
- static INT_PTR CALLBACK
- SyncDialog_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
- INT_PTR
- SyncDialog_Show(HWND centerWindow, DeviceView *device,
- C_ItemList *libraryList, C_ItemList *deviceList, BOOL autofillMode)
- {
- SyncDialog param;
-
- param.centerWindow = centerWindow;
- param.device = device;
- param.libraryList = libraryList;
- param.deviceList = deviceList;
- param.autofillMode = autofillMode;
- return WASABI_API_DIALOGBOXPARAMW(IDD_SYNC, plugin.hwndLibraryParent, SyncDialog_DialogProc, (LPARAM)¶m);
- }
- static BOOL
- SyncDialog_FormatSongString(wchar_t *buffer, size_t bufferSize,
- const wchar_t *artist, const wchar_t *title, const wchar_t *fileName)
- {
- HRESULT hr;
- if (NULL == buffer)
- return FALSE;
- if (NULL == title || L'\0' == *title)
- {
- if (NULL == fileName || L'\0' == *fileName)
- {
- WASABI_API_LNGSTRINGW_BUF(IDS_UNKNOWN_TRACK, buffer, bufferSize);
- hr = S_OK;
- }
- else
- hr = StringCchCopyEx(buffer, bufferSize, fileName, NULL, NULL, STRSAFE_IGNORE_NULLS);
- }
- else if (NULL == artist || L'\0' == *artist)
- {
- hr = StringCchCopyEx(buffer, bufferSize, title, NULL, NULL, STRSAFE_IGNORE_NULLS);
- }
- else
- {
- hr = StringCchPrintfEx(buffer, bufferSize, NULL, NULL, STRSAFE_IGNORE_NULLS,
- L"%s - %s", artist, title);
- }
-
- return SUCCEEDED(hr);
- }
- static BOOL
- SyncDialog_PopulateTrackLists(HWND hwnd)
- {
- SyncDialog *self;
- HWND hList;
- wchar_t buffer[1024] = {0};
- int index, count;
- self = SYNCDIALOG(hwnd);
- if (NULL == self)
- return FALSE;
- hList = GetDlgItem(hwnd, IDC_LIST_ADD);
- if(NULL != hList)
- {
- SendMessage(hList, WM_SETREDRAW, FALSE, 0L);
- SendMessage(hList, LB_RESETCONTENT, FALSE, 0L);
- count = (NULL != self->libraryList) ? self->libraryList->GetSize() : 0;
- if (0 != count)
- {
- SendMessage(hList, LB_SETCOUNT , (WPARAM)count, 0L);
- for(index = 0; index < count; index++)
- {
- itemRecordW *record = (itemRecordW*)self->libraryList->Get(index);
- if (NULL != record &&
- FALSE != SyncDialog_FormatSongString(buffer, ARRAYSIZE(buffer),
- record->artist, record->title, record->filename))
- {
- SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)buffer);
- }
- }
- }
- SendMessage(hList, WM_SETREDRAW, TRUE, 0L);
- }
- hList = GetDlgItem(hwnd, IDC_LIST_REMOVE);
- if(NULL != hList)
- {
- SendMessage(hList, WM_SETREDRAW, FALSE, 0L);
- SendMessage(hList, LB_RESETCONTENT, FALSE, 0L);
- count = (NULL != self->deviceList) ? self->deviceList->GetSize() : 0;
- if (0 != count)
- {
- Device *device;
- wchar_t artist[256] = {0}, title[256] = {0};
- SendMessage(hList, LB_SETCOUNT , (WPARAM)count, 0L);
- device = self->device->dev;
- for(index = 0; index < count; index++)
- {
- songid_t songId = (songid_t)self->deviceList->Get(index);
- device->getTrackArtist(songId, artist,ARRAYSIZE(artist));
- device->getTrackTitle(songId, title, ARRAYSIZE(title));
- if (FALSE != SyncDialog_FormatSongString(buffer, ARRAYSIZE(buffer),
- artist, title, NULL))
- {
- SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)buffer);
- }
- }
- }
- SendMessage(hList, WM_SETREDRAW, TRUE, 0L);
- }
- return TRUE;
- }
- static BOOL
- SyncDialog_UpdateCaption(HWND hwnd)
- {
- SyncDialog *self;
- HWND captionWindow;
- int resourceId;
- wchar_t buffer[1024] = {0}, format[1024] = {0};
- self = SYNCDIALOG(hwnd);
- if (NULL == self)
- return FALSE;
- captionWindow = GetDlgItem(hwnd, IDC_CAPTION);
- if (NULL == captionWindow)
- return FALSE;
- resourceId = (FALSE == self->autofillMode) ?
- IDS_X_SONGS_WILL_BE_TRANSFERRED_TO_THE_DEVICE :
- IDS_THIS_WILL_ADD_X_SONGS_AND_DELETE_X_SONGS;
-
- WASABI_API_LNGSTRINGW_BUF(resourceId, format, ARRAYSIZE(format));
-
- if (FAILED(StringCchPrintf(buffer, ARRAYSIZE(buffer), format,
- self->libraryList->GetSize(), self->deviceList->GetSize())))
- {
- return FALSE;
- }
-
- SendMessage(captionWindow, WM_SETTEXT, 0, (LPARAM)buffer);
- return TRUE;
- }
- typedef enum DeviceSyncPolicy
- {
- DeviceSyncPolicy_LeaveTracks = 0,
- DeviceSyncPolicy_DeleteTracks = 1,
- DeviceSyncPolicy_CopyTracks = 2,
- } DeviceSyncPolicy;
- static BOOL
- SyncDialog_GetDeviceSyncPolicyEnabled(SyncDialog *self)
- {
- if (NULL != self &&
- FALSE == self->autofillMode &&
- 0 != self->deviceList->GetSize())
- {
- return TRUE;
- }
- return FALSE;
- }
- static DeviceSyncPolicy
- SyncDialog_ReadDeviceSyncPolicy(SyncDialog *self)
- {
- if (FALSE != SyncDialog_GetDeviceSyncPolicyEnabled(self) &&
- NULL != self->device &&
- NULL != self->device->config)
- {
- C_Config *config;
- config = self->device->config;
- return (DeviceSyncPolicy)config->ReadInt(L"TrueSync", (int)DeviceSyncPolicy_LeaveTracks);
- }
- return DeviceSyncPolicy_LeaveTracks;
- }
- static BOOL
- SyncDialog_WriteDeviceSyncPolicy(SyncDialog *self, DeviceSyncPolicy policy)
- {
- if (FALSE != SyncDialog_GetDeviceSyncPolicyEnabled(self) &&
- NULL != self->device &&
- NULL != self->device->config)
- {
- C_Config *config;
- config = self->device->config;
- config->WriteInt(L"TrueSync", (int)policy);
- return TRUE;
- }
- return FALSE;
- }
- static BOOL
- SyncDialog_SelectDeviceSyncPolicy(HWND hwnd, DeviceSyncPolicy policy)
- {
- SyncDialog *self;
- HWND hControl;
- size_t index;
- int policyControl;
- int checkMode;
- int labelText;
- BOOL enableControls;
- const int controls[] =
- {
- IDC_TRUESYNC_LEAVE,
- IDC_TRUESYNC_DELETE,
- IDC_TRUESYNC_COPY
- };
- self = SYNCDIALOG(hwnd);
- if (NULL == self)
- return FALSE;
-
- switch(policy)
- {
- case DeviceSyncPolicy_LeaveTracks:
- policyControl = IDC_TRUESYNC_LEAVE;
- labelText = IDS_SONGS_NOT_IN_MEDIA_LIBRARY;
- break;
- case DeviceSyncPolicy_DeleteTracks:
- policyControl = IDC_TRUESYNC_DELETE;
- labelText = IDS_SONGS_TO_BE_DELETED;
- break;
- case DeviceSyncPolicy_CopyTracks:
- policyControl = IDC_TRUESYNC_COPY;
- labelText = IDS_SONGS_TO_BE_COPIED;
- break;
- default:
- return FALSE;
- }
- enableControls = SyncDialog_GetDeviceSyncPolicyEnabled(self);
- for (index = 0; index < ARRAYSIZE(controls); index++)
- {
- hControl = GetDlgItem(hwnd, controls[index]);
- if (NULL == hControl)
- continue;
- checkMode = (controls[index] == policyControl) ?
- BST_CHECKED :
- BST_UNCHECKED;
- SendMessage(hControl, BM_SETCHECK, (WPARAM)checkMode, 0L);
- EnableWindow(hControl, enableControls);
- }
- hControl = GetDlgItem(hwnd, IDC_REMOVELABEL);
- if (NULL != hControl)
- {
- wchar_t buffer[256] = {0};
- WASABI_API_LNGSTRINGW_BUF(labelText, buffer, ARRAYSIZE(buffer));
- SendMessage(hControl, WM_SETTEXT, 0, (LPARAM)buffer);
- }
- return TRUE;
- }
- static INT_PTR
- SyncDialog_OnInitDialog(HWND hwnd, HWND focusWindow, LPARAM param)
- {
- SyncDialog *self;
- C_Config *config;
-
- self = (SyncDialog*)param;
- if (NULL == self ||
- FALSE == SetProp(hwnd, SYNCDIALOG_PROP, self))
- {
- EndDialog(hwnd, -1);
- return 0;
- }
- config = self->device->config;
-
- SyncDialog_UpdateCaption(hwnd);
- SyncDialog_SelectDeviceSyncPolicy(hwnd, SyncDialog_ReadDeviceSyncPolicy(self));
-
-
- if(config->ReadInt(L"syncOnConnect", self->device->SyncConnectionDefault) == (self->autofillMode ? 2:1))
- CheckDlgButton(hwnd, IDC_SYNCONCONNECT, BST_CHECKED);
-
- SendMessage(hwnd, WM_COMMAND, MAKEWPARAM(IDC_LESS,0), NULL);
-
- if (FALSE != CenterWindow(hwnd, self->centerWindow))
- SendMessage(hwnd, DM_REPOSITION, 0, 0L);
-
- SyncDialog_PopulateTrackLists(hwnd);
- return 0;
- }
- static void
- SyncDialog_OnDestroy(HWND hwnd)
- {
- RemoveProp(hwnd, SYNCDIALOG_PROP);
- }
- static void
- SyncDialog_OnCommand(HWND hwnd, INT commandId, INT eventId, HWND controlWindow)
- {
- SyncDialog *self;
- C_Config *config;
- BOOL enableRadios;
- self = SYNCDIALOG(hwnd);
- if (NULL == self)
- return;
- config = self->device->config;
- enableRadios = ((!self->autofillMode) && self->deviceList->GetSize());
- switch(commandId)
- {
- case IDC_ADD_REMSEL:
- case IDC_REM_REMSEL:
- case IDC_ADD_CROPSEL:
- case IDC_REM_CROPSEL:
- {
- bool rem = (commandId == IDC_ADD_REMSEL || commandId == IDC_REM_REMSEL);
- bool addlist = (commandId == IDC_ADD_REMSEL || commandId == IDC_ADD_CROPSEL);
- HWND box = GetDlgItem(hwnd,addlist?IDC_LIST_ADD:IDC_LIST_REMOVE);
- C_ItemList * list = addlist?self->libraryList:self->deviceList;
- int l=SendMessage(box,LB_GETCOUNT,0,0);
- int current=0;
- for(int i=0; i<l; ++i)
- {
- if((SendMessage(box,LB_GETSEL,current,0)!=0) == rem)
- {
- SendMessage(box,LB_DELETESTRING,current,0);
- list->Del(current);
- }
- else current++;
- }
- SyncDialog_UpdateCaption(hwnd);
- }
- break;
- case IDC_TRUESYNC_DELETE:
- if (BN_CLICKED == eventId)
- SyncDialog_SelectDeviceSyncPolicy(hwnd, DeviceSyncPolicy_DeleteTracks);
- break;
- case IDC_TRUESYNC_COPY:
- if (BN_CLICKED == eventId)
- SyncDialog_SelectDeviceSyncPolicy(hwnd, DeviceSyncPolicy_CopyTracks);
- break;
- case IDC_TRUESYNC_LEAVE:
- if (BN_CLICKED == eventId)
- SyncDialog_SelectDeviceSyncPolicy(hwnd, DeviceSyncPolicy_LeaveTracks);
- break;
- case IDC_MORE:
- case IDC_LESS:
- {
- bool more = commandId == IDC_MORE;
- int show = more?SW_SHOW:SW_HIDE;
- int hide = more?SW_HIDE:SW_SHOW;
- ShowWindow(GetDlgItem(hwnd,IDCANCEL),hide);
- ShowWindow(GetDlgItem(hwnd,IDOK),hide);
- ShowWindow(GetDlgItem(hwnd,IDC_MORE),hide);
- ShowWindow(GetDlgItem(hwnd,IDC_LESS),show);
- ShowWindow(GetDlgItem(hwnd,IDCANCEL2),show);
- ShowWindow(GetDlgItem(hwnd,IDOK2),show);
- ShowWindow(GetDlgItem(hwnd,IDC_ADDLABEL),show);
- ShowWindow(GetDlgItem(hwnd,IDC_REMOVELABEL),show);
- ShowWindow(GetDlgItem(hwnd,IDC_LIST_ADD),show);
- ShowWindow(GetDlgItem(hwnd,IDC_LIST_REMOVE),show);
- RECT r, r1, r2;
- GetWindowRect(hwnd,&r);
- GetWindowRect(GetDlgItem(hwnd,more?IDC_MORE:IDC_LESS),&r1);
- GetWindowRect(GetDlgItem(hwnd,more?IDCANCEL2:IDCANCEL),&r2);
- SetWindowPos(hwnd,HWND_TOP,r.left,r.top,
- r2.right - r.left + (r1.left - r.left),
- r2.bottom - r.top + (r1.left - r.left), 0);
- }
- break;
- case IDOK2:
- case IDOK:
- config->WriteInt(L"syncOnConnect",IsDlgButtonChecked(hwnd,IDC_SYNCONCONNECT)?(self->autofillMode?2:1):0);
- if(enableRadios)
- config->WriteInt(L"TrueSync",IsDlgButtonChecked(hwnd,IDC_TRUESYNC_LEAVE)?0:(IsDlgButtonChecked(hwnd,IDC_TRUESYNC_DELETE)?1:2));
-
- EndDialog(hwnd, IDOK);
- break;
-
- case IDCANCEL2:
- case IDCANCEL:
- EndDialog(hwnd, IDCANCEL);
- break;
- }
- }
- static INT_PTR CALLBACK
- SyncDialog_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- switch(uMsg)
- {
- case WM_INITDIALOG: return SyncDialog_OnInitDialog(hwnd, (HWND)wParam, lParam);
- case WM_DESTROY: SyncDialog_OnDestroy(hwnd); return TRUE;
- case WM_COMMAND: SyncDialog_OnCommand(hwnd, LOWORD(wParam), HIWORD(wParam), (HWND)lParam); return TRUE;
- }
- return FALSE;
- }
|