123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315 |
- /** (c) Nullsoft, Inc. C O N F I D E N T I A L
- ** Filename:
- ** Project:
- ** Description:
- ** Author:
- ** Created:
- **/
- #include "main.h"
- static LRESULT WINAPI jumpDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);
- static LRESULT WINAPI jumpFileDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);
- HWND jump_hwnd, jump_hwnd2;
- int jump_dialog(HWND hwnd)
- {
- if (IsWindow(jump_hwnd)) { SetForegroundWindow(jump_hwnd); return -1; }
- LPCreateDialogW(IDD_JUMPDLG,DIALOG_PARENT(hwnd), jumpDlgProc);
- return 0;
- }
- int jump_file_dialog(HWND hwnd)
- {
- if (IsWindow(jump_hwnd2)) { SetForegroundWindow(jump_hwnd2); return -1; }
- LPCreateDialogW(IDD_JUMPFILEDLG,DIALOG_PARENT(hwnd),jumpFileDlgProc);
- return 0;
- }
- static LRESULT WINAPI jumpDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
- {
- switch (uMsg)
- {
- case WM_INITDIALOG:
- ShowWindow(jump_hwnd=hwndDlg,SW_SHOW);
- {
- char text[128] = {0};
- int len=0;
- if (in_mod) len=in_mod->GetLength()/1000;
- StringCchPrintfA(text,128,"%d:%02d",len/60,len%60);
- if (in_mod) len = in_mod->GetOutputTime()/1000;
- else len=0;
- SetDlgItemTextA(hwndDlg,IDC_TRACKLEN,text);
- StringCchPrintfA(text,128,"%d:%02d",len/60,len%60);
- SetDlgItemTextA(hwndDlg,IDC_MINUTES,text);
- // show jump to time window and restore last position as applicable
- POINT pt = {time_rect.left, time_rect.top};
- if (!windowOffScreen(hwndDlg, pt))
- SetWindowPos(hwndDlg, HWND_TOP, time_rect.left, time_rect.top, 0, 0, SWP_NOSIZE | SWP_NOSENDCHANGING);
- }
- return TRUE;
- case WM_COMMAND:
- switch (LOWORD(wParam))
- {
- case IDOK:
- {
- char text[129] = {0};
- int m=0,s=0,bt=0;
- char *p=text;
- GetDlgItemTextA(hwndDlg,IDC_MINUTES,text,sizeof(text));
- while (p && *p == ' ') p++;
- while (p && *p >= '0' && *p <= '9') {bt=1;s=s*10+*p++-'0';}
- if (p && *p++ == ':')
- {
- m=s;s=0;
- while (p && *p >= '0' && *p <= '9') {bt=1;s=s*10+*p++-'0';}
- }
- if (bt)
- {
- int time=m*60000+s*1000;
- if (time >= 0 && !PlayList_ishidden(PlayList_getPosition()))
- {
- if (in_seek(time) < 0)
- SendMessageW(hMainWindow,WM_WA_MPEG_EOF,0,0);
- else
- {
- ui_drawtime(in_getouttime()/1000,0);
- }
- }
- Sleep(100);
- while (1)
- {
- MSG msg = {0};
- if (!PeekMessage(&msg,hMainWindow,WM_MOUSEFIRST,WM_MOUSELAST,PM_REMOVE))
- break;
- }
- }
- }
- case IDCANCEL:
- GetWindowRect(hwndDlg, &time_rect);
- DestroyWindow(hwndDlg);
- return FALSE;
- }
- return FALSE;
- case WM_DESTROY:
- jump_hwnd=0;
- return 0;
- }
- return 0;
- }
- static void parselist(char *out, const char *in)
- {
- int inquotes=0, neednull=0;
- while (in && *in)
- {
- char c=*in++;
- if (c >= 'A' && c <= 'Z') c+='a'-'A';
- if ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9'))
- {
- neednull=1;
- *out++=c;
- }
- else if (c == '\"')
- {
- inquotes=!inquotes;
- if (!inquotes)
- {
- *out++=0;
- neednull=0;
- }
- }
- else
- {
- if (inquotes) *out++=c;
- else if (neednull)
- {
- *out++=0;
- neednull=0;
- }
- }
- }
- *out++=0;
- *out++=0;
- }
- extern "C"
- {
- static int __cdecl substr_search(const char *bigtext, const char *littletext)
- {
- char littletext_list[128] = {0}, *plist = 0;
- char bigtext_list[MAX_PATH*8] = {0};
- parselist(littletext_list, littletext);
- StringCchCopyA(bigtext_list, MAX_PATH*8, bigtext);
- plist = bigtext_list;
- while (plist && *plist)
- {
- if (*plist >= 'A' && *plist <= 'Z') *plist += 'a'-'A';
- plist++;
- }
- plist = littletext_list;
- while (plist && *plist)
- {
- if (!strstr(bigtext_list, plist)) return 0;
- plist += lstrlenA(plist) + 1;
- }
- return 1;
- }
- static int (__cdecl *jtf_comparator)(const char *, const char *) = substr_search;
- static int (__cdecl *jtf_comparatorW)(const wchar_t *, const wchar_t *) = 0;
- }
- void SetJumpComparator(void *functionPtr)
- {
- if (functionPtr)
- jtf_comparator = (int (__cdecl *)(const char *, const char *))(functionPtr);
- else
- jtf_comparator = substr_search;
- }
- void SetJumpComparatorW(void *functionPtr)
- {
- if (functionPtr)
- jtf_comparatorW = (int (__cdecl *)(const wchar_t *, const wchar_t *))(functionPtr);
- else
- jtf_comparatorW = 0;
- }
- static WNDPROC oldWndProc;
- static LRESULT WINAPI newWndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
- {
- if ((uMsg == WM_KEYDOWN || uMsg == WM_KEYUP) &&
- (wParam == VK_UP || wParam == VK_DOWN || wParam == VK_PRIOR || wParam == VK_NEXT))
- {
- SendMessageW(GetDlgItem(GetParent(hwndDlg),IDC_SELBOX),uMsg,wParam,lParam);
- return 0;
- }
- return CallWindowProc(oldWndProc,hwndDlg,uMsg,wParam,lParam);
- }
- static LRESULT WINAPI jumpFileDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
- {
- switch (uMsg)
- {
- case WM_INITDIALOG:
- ShowWindow(jump_hwnd2=hwndDlg,SW_SHOW);
- {
- int x = 0;
- HWND hw = GetDlgItem(hwndDlg,IDC_SELBOX);
- // prevents showing the full playlist contents on loading as needed
- if (!config_jtf_check)
- {
- int t = PlayList_getPosition();
- int v = PlayList_getlength();
- SendMessageW(hw,WM_SETREDRAW,FALSE,0);
- for (x = 0; x < v; x ++)
- {
- wchar_t ft[FILETITLE_SIZE] = {0};
- PlayList_getitem2W(x, 0, ft);
- SendMessageW(hw,LB_SETITEMDATA,SendMessageW(hw,LB_ADDSTRING,0,(LPARAM) ft),x);
- }
- for (x = 0; x < v; x ++)
- {
- if (SendMessageW(hw,LB_GETITEMDATA,x,0)==t)
- break;
- }
- SendMessageW(hw,WM_SETREDRAW,TRUE,0);
- }
- SendMessageW(hw, LB_SETCURSEL, x, 0);
- oldWndProc = (WNDPROC) SetWindowLongPtrW(GetDlgItem(hwndDlg, IDC_EDIT1), GWLP_WNDPROC, (LONG_PTR)newWndProc);
- }
- return TRUE;
- case WM_COMMAND:
- switch (LOWORD(wParam))
- {
- case IDOK:
- {
- LRESULT x=SendDlgItemMessage(hwndDlg,IDC_SELBOX,LB_GETITEMDATA,SendDlgItemMessage(hwndDlg,IDC_SELBOX,LB_GETCURSEL,0,0),0);
- if (x >= 0 && x != PlayList_getPosition())
- {
- PlayList_setposition(x);
- PlayList_getcurrent(FileName,FileTitle,FileTitleNum);
- StartPlaying();
- }
- Sleep(100);
- while (1)
- {
- MSG msg = {0};
- if (!PeekMessage(&msg,hMainWindow,WM_MOUSEFIRST,WM_MOUSELAST,PM_REMOVE))
- break;
- }
- }
- case IDCANCEL:
- DestroyWindow(hwndDlg);
- return FALSE;
- case IDC_SELBOX:
- if (HIWORD(wParam) == LBN_DBLCLK)
- {
- SendMessageW(hwndDlg,WM_COMMAND,IDOK,0);
- }
- return FALSE;
- case IDC_EDIT1:
- if (HIWORD(wParam) == EN_CHANGE)
- {
- wchar_t s[64] = {0};
- if(jtf_comparatorW) GetDlgItemTextW(hwndDlg,IDC_EDIT1,s,64);
- else GetDlgItemTextA(hwndDlg,IDC_EDIT1,(char*)s,64);
- int v = PlayList_getlength();
- HWND hw = GetDlgItem(hwndDlg,IDC_SELBOX);
- SendMessageW(hw,WM_SETREDRAW,FALSE,0);
- SendMessageW(hw,LB_RESETCONTENT,0,0);
- // prevents showing the full playlist contents on searching as needed
- if (!config_jtf_check || s[0] && config_jtf_check)
- {
- int x = 0;
- for (; x < v; x++)
- {
- int addtolist = 1;
- if (jtf_comparatorW)
- {
- wchar_t buf[FILENAME_SIZE+FILETITLE_SIZE+1] = {0};
- PlayList_getitem_jtfW(x, buf);
- addtolist = jtf_comparatorW(buf, s);
- }
- else
- {
- char buf[FILENAME_SIZE+FILETITLE_SIZE+1] = {0}, b2[FILETITLE_SIZE] = {0};
- PlayList_getitem2(x,buf,b2);
- StringCchCatA(buf,FILENAME_SIZE+FILETITLE_SIZE+1," ");
- StringCchCatA(buf,FILENAME_SIZE+FILETITLE_SIZE+1,b2);
- addtolist = jtf_comparator(buf,(char*)s);
- }
- if (!s[0] || addtolist)
- {
- wchar_t b2[FILETITLE_SIZE] = {0};
- PlayList_getitem2W(x, 0, b2);
- SendMessageW(hw,LB_SETITEMDATA,SendMessageW(hw,LB_ADDSTRING,0,(LPARAM) b2),x);
- }
- }
- SendMessageW(hw,LB_SETCURSEL,0,x);
- }
- SendMessageW(hw,WM_SETREDRAW,TRUE,0);
- }
- return FALSE;
- }
- return FALSE;
- case WM_DESTROY:
- jump_hwnd2=0;
- return 0;
- }
- return 0;
- }
|