123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693 |
- // disabled 30 May 2012 as per email from Tejas w.r.t. to Rovi deal ending
- #if 0
- #include "main.h"
- #include "../nu/AutoUrl.h"
- #include "../nu/AutoWide.h"
- #include "../nu/GrowBuf.h"
- #include "api.h"
- #include "../xml/obj_xml.h"
- #include "../xml/ifc_xmlreadercallback.h"
- #include "..\Components\wac_network\wac_network_http_receiver_api.h"
- #include <api/service/waservicefactory.h>
- #include <api/service/svcs/svc_imgload.h>
- #include "XMLString.h"
- #include <tataki/export.h>
- #include <tataki/bitmap/bitmap.h>
- #include <tataki/canvas/bltcanvas.h>
- #include <strsafe.h>
- static INT_PTR CALLBACK artDownloader(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);
- static INT_PTR CALLBACK scrollChildHostProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);
- static INT_PTR CALLBACK scrollChildProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);
- static INT_PTR CALLBACK imageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);
- #define HTTP_BUFFER_SIZE 32768
- #define WM_ADDCHILD WM_USER+0
- #define WM_SELECTED WM_USER+1
- #define WM_UPDATESTATUS WM_USER+2
- #define AddImageToList(hChild, param) SendMessageW(hChild,WM_ADDCHILD,0,(LPARAM)param)
- #define GetParam(hwndDlg) (ArtParser*)GetWindowLongPtrW(hwndDlg,GWLP_USERDATA)
- #define GetParamC(hwndDlg) (ImgDownloader*)GetWindowLongPtrW(hwndDlg,GWLP_USERDATA)
- #define UpdateStatus(hwndDlg) PostMessageW(hwndDlg,WM_UPDATESTATUS,0,0)
- class ImgDownloader
- {
- public:
- ImgDownloader(const wchar_t *_desc, const char *_url) : done(false), http(0), started(false), error(false), imgbuf(0), imgbufsize(0), imgbufused(0)
- {
- desc = _wcsdup(_desc);
- url = _strdup(_url);
- }
- ~ImgDownloader()
- {
- free(desc);
- free(url);
- free(imgbuf);
- waServiceFactory *httpFactory = WASABI_API_SVC->service_getServiceByGuid(httpreceiverGUID);
- if(httpFactory && http)
- httpFactory->releaseInterface(http);
- }
- bool run();
-
- wchar_t *desc;
- char *url;
- bool done, error;
- api_httpreceiver *http;
- BYTE *imgbuf;
- int imgbufsize;
- int imgbufused;
- private:
- bool started;
- };
- class ArtParser : public ifc_xmlreadercallback
- {
- public:
- ArtParser(artFetchData * data);
- ~ArtParser();
-
- wchar_t curAlbumStr[512] = {0};
- void ArtParser::StartTag(const wchar_t *xmlpath, const wchar_t *xmltag, ifc_xmlreaderparams *params);
- void ArtParser::TextHandler(const wchar_t *xmlpath, const wchar_t *xmltag, const wchar_t *str);
-
- int run();
-
- artFetchData * data;
- bool doneXML;
- int curImage, numImages, failedImages;
- bool error;
- HWND hwndDlg;
- obj_xml *parser;
- waServiceFactory *parserFactory, *httpFactory;
- api_httpreceiver *http;
- std::vector<ImgDownloader*> imgDownload;
- protected:
- #define CBCLASS ArtParser
- START_DISPATCH_INLINE;
- VCB(ONSTARTELEMENT, StartTag);
- VCB(ONCHARDATA, TextHandler);
- END_DISPATCH;
- #undef CBCLASS
- };
- wchar_t tmp_album[512] = {0}, tmp_artist[512] = {0}, tmp_year[5] = {0};
- int RetrieveAlbumArt(artFetchData * data)
- {
- if(!data || data->size < sizeof(artFetchData))
- return 1;
- int ret = 1;
- Tataki::Init(serviceManager);
- {
- ArtParser param(data);
- if(!param.error)
- ret = LPDialogBoxParamW(IDD_ARTDOWNLOADER,data->parent,artDownloader,(LPARAM)¶m);
- while (ret == 2) // Keep in loop till user aborts custom search
- {
- // TODO: benski> maybe we should save the old values and restore at the end
- data->album = tmp_album;
- data->artist = tmp_artist;
- data->year = _wtoi(tmp_year);
- // Martin> we should also set the other values back to null
- // benski> i'm not sure if we want to set these id fields to NULL
- // but we'll go with it for now
- data->amgAlbumId = NULL;
- data->amgArtistId = NULL;
- data->gracenoteFileId = NULL;
- WASABI_API_MEMMGR->sysFree(data->imgData);
- data->imgData = NULL;
- data->imgDataLen = NULL;
- ArtParser param(data);
- ret = LPDialogBoxParamW(IDD_ARTDOWNLOADER,data->parent,artDownloader,(LPARAM)¶m);
- }
- }
- Tataki::Quit();
- return ret;
- }
- #define USER_AGENT_SIZE (10 /*User-Agent*/ + 2 /*: */ + 6 /*Winamp*/ + 1 /*/*/ + 1 /*5*/ + 3/*.21*/ + 1 /*Null*/)
- static void SetUserAgent(api_httpreceiver *http)
- {
- char user_agent[USER_AGENT_SIZE] = {0};
- StringCchCopyA(user_agent, USER_AGENT_SIZE, "User-Agent: Winamp/"APP_VERSION); // as a nice side effect, this will cut off any extra digits after the first two. e.g. 5.111 becomes 5.11
- http->addheader(user_agent);
- }
- class UrlBuilder : private GrowBuf
- {
- public:
- UrlBuilder(const char * base) : first(1) { set(base); }
- ~UrlBuilder(){}
- void AddParam(const char * key, const wchar_t * value) { AddParamI(key,(char*)AutoUrl(value)); }
- void AddParam(const char * key, int value) { char buf[16]; StringCchPrintfA(buf,16,"%d",value); AddParamI(key,buf); }
- void Finish() { GrowBuf::add((void*)"",1); }
- const char * Get() { return (const char*)get(); } // don't call this without first calling finish!
- private:
- void AddParamI(const char * key, const char * value) { if(first){ first=0; add("?");} else add("&"); add(key); add("="); add(value); }
- void add(const char * x) { GrowBuf::add((char*)x,strlen(x)); }
- void set(const char * x) { GrowBuf::set((char*)x,strlen(x)); }
- int first;
- };
- static wchar_t* format(const wchar_t *in, wchar_t *buf, int len)
- {
- wchar_t *p = buf;
- int inbracket = 0;
- while(in && *in)
- {
- if(p >= buf + len - 1) break;
- else if(*in == L'[' || *in == L'(' || *in == L'<') inbracket++;
- else if(*in == L']' || *in == L')' || *in == L'>') inbracket--;
- else if(!inbracket) *(p++) = *in;
- in++;
- }
- *p=0;
- return buf;
- }
- ArtParser::ArtParser(artFetchData * data) : data(data), error(false), parserFactory(0), parser(0), http(0), httpFactory(0), doneXML(false), curImage(0), numImages(0), failedImages(0)
- {
- curAlbumStr[0]=0;
- parserFactory = WASABI_API_SVC->service_getServiceByGuid(obj_xmlGUID);
- if (parserFactory)
- parser = (obj_xml *)parserFactory->getInterface();
- if (parser)
- {
- parser->xmlreader_registerCallback(L"document\fartwork", this);
- parser->xmlreader_registerCallback(L"response\fdata\fartwork", this);
- parser->xmlreader_open();
- }
- else
- {
- error=true;
- return;
- }
- // construct xml url
- UrlBuilder url("http://client.winamp.com/metadata/artwork.php");
-
- wchar_t temp[2048] = {0};
- if(data->artist && data->artist[0] && _wcsicmp(data->artist, L"Various Artists") && _wcsicmp(data->artist, L"VA") && _wcsicmp(data->artist, L"OST"))
- url.AddParam("artist",format(data->artist,temp,2048));
-
- if(data->album && data->album[0])
- url.AddParam("album",format(data->album,temp,2048));
-
- if(data->year)
- url.AddParam("recorddate",data->year);
-
- if(data->amgAlbumId)
- url.AddParam("amgalbumid",data->amgAlbumId);
-
- if(data->amgArtistId)
- url.AddParam("amgartistid",data->amgArtistId);
-
- if(data->gracenoteFileId && data->gracenoteFileId[0])
- url.AddParam("tagid",data->gracenoteFileId);
- url.Finish();
-
- httpFactory = WASABI_API_SVC->service_getServiceByGuid(httpreceiverGUID);
- if(httpFactory) http = (api_httpreceiver *)httpFactory->getInterface();
- if(http)
- {
- http->AllowCompression();
- http->open(API_DNS_AUTODNS, HTTP_BUFFER_SIZE, config_proxy);
- SetUserAgent(http);
- http->connect(url.Get());
- }
- else error = true;
- }
- ArtParser::~ArtParser()
- {
- imgDownload.deleteAll();
- if(parser)
- {
- parser->xmlreader_unregisterCallback(this);
- parser->xmlreader_close();
- if(parserFactory)
- parserFactory->releaseInterface(parser);
- }
- parser = 0;
- parserFactory = 0;
- if(http && httpFactory)
- httpFactory->releaseInterface(http);
- http = 0;
- httpFactory = 0;
- }
- void ArtParser::StartTag(const wchar_t *xmlpath, const wchar_t *xmltag, ifc_xmlreaderparams *params)
- {
- const wchar_t* artist = params->getItemValue(L"amgArtistDispName");
- const wchar_t* album = params->getItemValue(L"amgDispName");
- const wchar_t* year = params->getItemValue(L"recordDate");
- StringCchPrintfW(curAlbumStr,512,L"%s - %s (%s)",artist?artist:L"",album?album:L"",year?year:L"");
- }
- void ArtParser::TextHandler(const wchar_t *xmlpath, const wchar_t *xmltag, const wchar_t *str)
- {
- numImages++;
- imgDownload.push_back(new ImgDownloader(curAlbumStr,AutoChar(str)));
- UpdateStatus(hwndDlg);
- }
- int ArtParser::run()
- {
- int ret = http->run();
- if (ret == -1) // connection failed
- {
- error=true;
- UpdateStatus(hwndDlg);
- return 0;
- }
- int replycode = http->getreplycode();
- switch (replycode)
- {
- case 0:
- case 100:
- return 1;
- case 200:
- {
- char downloadedData[HTTP_BUFFER_SIZE] = {0};
- int xmlResult = API_XML_SUCCESS;
- int downloadSize = http->get_bytes(downloadedData, HTTP_BUFFER_SIZE);
- if(downloadSize)
- xmlResult = parser->xmlreader_feed((void *)downloadedData, downloadSize);
- else if(!downloadSize && ret == 1)
- { // we're finished!
- xmlResult = parser->xmlreader_feed(0,0);
- doneXML=true;
- UpdateStatus(hwndDlg);
- return 0;
- }
- break;
- }
- default:
- error=true;
- UpdateStatus(hwndDlg);
- return 0;
- }
- return 1;
- }
- bool ImgDownloader::run()
- {
- if(!started)
- {
- started = true;
- waServiceFactory *httpFactory = WASABI_API_SVC->service_getServiceByGuid(httpreceiverGUID);
- if(httpFactory) http = (api_httpreceiver *)httpFactory->getInterface();
- if(http)
- {
- http->open(API_DNS_AUTODNS, HTTP_BUFFER_SIZE, config_proxy);
- SetUserAgent(http);
- http->connect(url);
- }
- imgbuf = (BYTE*)malloc(HTTP_BUFFER_SIZE);
- imgbufsize = HTTP_BUFFER_SIZE;
- }
- if(!http || !imgbuf)
- {
- error=true;
- return 0;
- }
- int ret = http->run();
- if(ret == -1) //error
- {
- error=true;
- return 0;
- }
- int replycode = http->getreplycode();
- switch (replycode)
- {
- case 0:
- case 100:
- return 1;
- case 200:
- {
- int downloadSize = http->get_bytes(imgbuf+imgbufused, imgbufsize - imgbufused);
- imgbufused += downloadSize;
- if(imgbufused + 4096 >= imgbufsize)
- {
- imgbufsize += HTTP_BUFFER_SIZE;
- imgbuf = (BYTE*)realloc(imgbuf,imgbufsize);
- }
- if(!downloadSize && ret == 1)
- done=true;
- break;
- }
- default:
- return 0;
- }
- return 1;
- }
- static INT_PTR CALLBACK artDownloader(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
- {
- static HWND m_child;
- switch(uMsg)
- {
- case WM_INITDIALOG:
- {
- m_child = LPCreateDialogW(IDD_ARTDOWNLOADER_SCROLLHOST,hwndDlg,(WNDPROC)scrollChildHostProc);
- SetWindowLong(hwndDlg,GWLP_USERDATA,lParam);
- ArtParser * parser = (ArtParser *)lParam;
- parser->hwndDlg = hwndDlg;
- SetTimer(hwndDlg,0,50,NULL);
- SetTimer(hwndDlg,1,50,NULL);
- UpdateStatus(hwndDlg);
- if(parser->data->showCancelAll) ShowWindow(GetDlgItem(hwndDlg,IDC_CANCELALL),SW_SHOWNA);
- wchar_t old[100]=L"";
- GetWindowTextW(hwndDlg,old,100);
- wchar_t buf[256]=L"";
- if(parser->data->artist && parser->data->artist[0] && parser->data->album && parser->data->album[0])
- StringCchPrintfW(buf,256,L"%s: %s - %s",old,parser->data->artist,parser->data->album);
- else if(parser->data->album && parser->data->album[0])
- StringCchPrintfW(buf,256,L"%s: %s",old,parser->data->album);
- else if(parser->data->artist && parser->data->artist[0])
- StringCchPrintfW(buf,256,L"%s: %s",old,parser->data->artist);
-
- if(buf[0])
- SetWindowTextW(hwndDlg,buf);
- SetWindowTextW(GetDlgItem(hwndDlg,IDC_SEARCHREFINE_ARTIST), parser->data->artist);
- SetWindowTextW(GetDlgItem(hwndDlg,IDC_SEARCHREFINE_ALBUM), parser->data->album);
- wchar_t yearbuf[5]=L"";
- _itow(parser->data->year,yearbuf,10);
- SetWindowTextW(GetDlgItem(hwndDlg,IDC_SEARCHREFINE_YEAR), (parser->data->year?yearbuf:L""));
- }
- break;
- case WM_SELECTED:
- {
- ArtParser * parser = GetParam(hwndDlg);
- HWND selchild = (HWND)wParam;
- ImgDownloader *d = (ImgDownloader *)lParam;
- if(parser && d && d->imgbuf && d->imgbufused)
- {
- if (!AGAVE_API_AMGSUCKS || AGAVE_API_AMGSUCKS->WriteAlbumArt(d->imgbuf, d->imgbufused, &parser->data->imgData, &parser->data->imgDataLen) != 0)
- {
- void * img = WASABI_API_MEMMGR->sysMalloc(d->imgbufused);
- memcpy(img,d->imgbuf,d->imgbufused);
- parser->data->imgData = img;
- parser->data->imgDataLen = d->imgbufused;
- }
- char * dot = strrchr(d->url,'.');
- if(dot) lstrcpynW(parser->data->type,AutoWide(dot+1),10);
- EndDialog(hwndDlg,0);
- }
- }
- break;
- case WM_UPDATESTATUS:
- {
- ArtParser * parser = GetParam(hwndDlg);
- if(parser)
- {
- wchar_t s[100] = {0};
- if(parser->error) getStringW(IDS_ART_SEARCH_FAILED,s,100);
- else if(parser->doneXML) getStringW(IDS_ART_SEARCH_FINISHED,s,100);
- else getStringW(IDS_ART_SEARCH_PROGRESS,s,100);
- wchar_t buf[512] = {0};
- StringCchPrintfW(buf,512,getStringW(IDS_ART_SEARCH_STATUS,0,0),s,parser->numImages,parser->curImage - parser->failedImages,parser->failedImages,parser->numImages - parser->curImage);
- SetDlgItemTextW(hwndDlg,IDC_STATUS,buf);
- }
- }
- break;
- case WM_TIMER:
- {
- ArtParser * parser = GetParam(hwndDlg);
- switch(wParam)
- {
- case 0:
- if(parser && !parser->run())
- KillTimer(hwndDlg,0);
- break;
- case 1:
- if(parser && parser->imgDownload.size())
- {
- ImgDownloader *d = parser->imgDownload.at(0);
- if(d->error)
- {
- parser->failedImages++;
- parser->curImage++;
- parser->imgDownload.eraseindex(0);
- delete d;
- UpdateStatus(hwndDlg);
- }
- else if(d->done)
- {
- parser->curImage++;
- parser->imgDownload.eraseindex(0);
- AddImageToList(m_child,d);
- UpdateStatus(hwndDlg);
- }
- else d->run();
- }
- if(parser->error || parser->doneXML)
- {
- if(parser->curImage == parser->numImages)
- {
- KillTimer(hwndDlg,1);
- if(!parser->numImages)
- {
- wchar_t title[100] = {0};
- getStringW(IDS_ART_SEARCH_NOT_FOUND_TITLE,title,100);
- MessageBoxW(hwndDlg,getStringW(IDS_ART_SEARCH_NOT_FOUND,0,0),title,0);
- //EndDialog(hwndDlg,-1); //CUT, since we have now a custom search
- }
- EnableWindow(GetDlgItem(hwndDlg, IDC_SEARCHAGAIN), true);
- }
- }
- break;
- }
- }
- break;
- case WM_DESTROY:
- {
- SetWindowLong(hwndDlg,GWLP_USERDATA,0);
- }
- break;
- case WM_CLOSE:
- EndDialog(hwndDlg,-1);
- break;
- case WM_COMMAND:
- switch(LOWORD(wParam))
- {
- case IDCANCEL:
- EndDialog(hwndDlg,-1);
- break;
- case IDC_CANCELALL:
- EndDialog(hwndDlg,-2);
- break;
- case IDC_SEARCHAGAIN: // copy text field params to parser
- ArtParser * parser = GetParam(hwndDlg);
- // Let the first search process finish
- if (!(parser->doneXML || parser->error))
- {
- //TODO change this string
- MessageBoxW(hwndDlg, L"Please wait till the current retrieval is finished", L"", 0);
- return 0;
- }
- GetDlgItemTextW(hwndDlg,IDC_SEARCHREFINE_ALBUM, tmp_album, 512);
- GetDlgItemTextW(hwndDlg,IDC_SEARCHREFINE_ARTIST, tmp_artist, 512);
- GetDlgItemTextW(hwndDlg,IDC_SEARCHREFINE_YEAR, tmp_year, 5);
- // End Dialog w/ returning 2: indicates that teh users wants to start a custom search
- EndDialog(hwndDlg,2);
- break;
- }
- break;
- }
- return 0;
- }
- // from FileInfo.cpp
- extern HBITMAP getBitmap(ARGB32 * data, int dw, int dh, int targetW, int targetH, HWND parent);
- extern ARGB32 * decompressImage(const void *data, int datalen, int * dataW, int * dataH);
- HBITMAP loadImage(const void * data, int datalen, int w, int h, HWND parent, int *dw=0, int *dh=0)
- {
- int dataW=0, dataH=0;
- ARGB32* ret = decompressImage(data,datalen,&dataW,&dataH);
-
- if(dw) *dw = dataW;
- if(dh) *dh = dataH;
- if(!ret) return 0;
- HBITMAP r = getBitmap(ret, dataW, dataH, w, h, parent);
- WASABI_API_MEMMGR->sysFree(ret);
- return r;
- }
- #define GetDlgParent(hwndDlg) GetParent(GetParent(GetParent(hwndDlg)))
- static INT_PTR CALLBACK imageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
- {
- switch(uMsg)
- {
- case WM_INITDIALOG:
- {
- SetWindowLong(hwndDlg,GWLP_USERDATA,lParam);
- ImgDownloader *d = (ImgDownloader *)lParam;
- int w=0,h=0;
- HBITMAP bm = loadImage(d->imgbuf,d->imgbufused,140,140,hwndDlg,&w,&h);
- SendDlgItemMessage(hwndDlg,IDC_IMAGE,STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)bm);
- wchar_t buf[1024] = {0};
- StringCchPrintfW(buf,1024,L"%s: %dx%d (%d kB)",d->desc,w,h,(d->imgbufused/1024));
- SetDlgItemTextW(hwndDlg,IDC_IMGTEXT,buf);
- }
- break;
- case WM_DESTROY:
- {
- ImgDownloader *d = GetParamC(hwndDlg);
- SetWindowLong(hwndDlg,GWLP_USERDATA,0);
- if(d) delete d;
- HBITMAP bm = (HBITMAP)SendDlgItemMessage(hwndDlg,IDC_IMAGE,STM_SETIMAGE,IMAGE_BITMAP,0);
- if(bm) DeleteObject(bm);
- }
- break;
- case WM_COMMAND:
- if(LOWORD(wParam) != IDC_SELECT)
- break;
- // else run through
- case WM_LBUTTONDBLCLK:
- SendMessageW(GetDlgParent(hwndDlg),WM_SELECTED,(WPARAM)hwndDlg,(LPARAM)GetParamC(hwndDlg));
- break;
- }
- return 0;
- }
- // scroll shit, nothing interesting is happening down here...
- static INT_PTR CALLBACK scrollChildHostProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
- {
- //static HWND m_child;
- switch(uMsg)
- {
- case WM_INITDIALOG:
- {
- RECT r;
- HWND hw = GetParent(hwndDlg);
- GetWindowRect(GetDlgItem(hw,IDC_PLACEHOLDER),&r);
- ScreenToClient(hw,(LPPOINT)&r);
- ScreenToClient(hw,((LPPOINT)&r)+1);
- SetWindowPos(hwndDlg,NULL,r.left,r.top,r.right-r.left,r.bottom-r.top,SWP_NOZORDER|SWP_NOACTIVATE);
- LPCreateDialogW(IDD_ARTDOWNLOADER_SCROLLCHILD,hwndDlg,(WNDPROC)scrollChildProc);
- SCROLLINFO si={sizeof(si),SIF_RANGE|SIF_PAGE,0};
- si.nPage = (r.right - r.left);
- SetScrollInfo(hwndDlg,SB_HORZ,&si,TRUE);
- }
- break;
- case WM_ADDCHILD:
- {
- HWND m_child = GetWindow(hwndDlg,GW_CHILD);
- HWND newChild = (HWND)SendMessageW(m_child,uMsg,wParam,lParam);
- RECT r,r2;
- GetClientRect(m_child,&r);
- GetClientRect(hwndDlg,&r2);
- SCROLLINFO si={sizeof(si),SIF_RANGE|SIF_PAGE,0};
- si.nMin = 0;
- si.nMax = (r.right - r.left);
- si.nPage = (r2.right - r2.left);
- if(si.nMax < 0) si.nMax = 0;
- SetScrollInfo(hwndDlg,SB_HORZ,&si,TRUE);
- return (INT_PTR)newChild;
- }
- break;
- case WM_HSCROLL:
- {
- HWND m_child = GetWindow(hwndDlg,GW_CHILD);
- int v=0;
- RECT r;
- RECT r2;
- GetClientRect(hwndDlg,&r2);
- GetClientRect(m_child,&r);
- int action = LOWORD(wParam);
- if (r2.right < r.right) {
- if (action == SB_THUMBPOSITION || action == SB_THUMBTRACK) {
- SCROLLINFO si={sizeof(si),SIF_TRACKPOS|SIF_POS};
- GetScrollInfo(hwndDlg,SB_HORZ,&si);
- v=si.nTrackPos;
- }
- else if (action == SB_TOP)
- v=0;
- else if (action == SB_BOTTOM)
- v=r.right-r2.right;
- else if (action == SB_PAGEDOWN || action == SB_LINEDOWN) {
- SCROLLINFO si={sizeof(si),SIF_TRACKPOS|SIF_POS};
- GetScrollInfo(hwndDlg,SB_HORZ,&si);
- if(action == SB_LINEDOWN)
- v=si.nPos + (r2.right)/10;
- else
- v=si.nPos + r2.right;
- if (v > r.right-r2.right) v=r.right-r2.right;
- }
- else if (action == SB_PAGEUP || action == SB_LINEUP) {
- SCROLLINFO si={sizeof(si),SIF_TRACKPOS|SIF_POS};
- GetScrollInfo(hwndDlg,SB_HORZ,&si);
- if(action == SB_LINEUP)
- v=si.nPos - (r2.right)/10;
- else
- v=si.nPos - r2.right;
- if (v < 0) v=0;
- }
- else return 0;
- SetScrollPos(hwndDlg,SB_HORZ,v,!(action == SB_THUMBPOSITION || action == SB_THUMBTRACK));
- SetWindowPos(m_child,NULL,0-v,0,0,0,SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE);
- }
- else {
- SetScrollPos(hwndDlg,SB_HORZ,0,!(action == SB_THUMBPOSITION || action == SB_THUMBTRACK));
- SetWindowPos(m_child,NULL,0,0,0,0,SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE);
- }
- }
- break;
- }
- return 0;
- }
- static INT_PTR CALLBACK scrollChildProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
- {
- switch(uMsg)
- {
- case WM_INITDIALOG:
- {
- RECT r;
- GetClientRect(hwndDlg,&r);
- SetWindowPos(hwndDlg,0,0,0,0,r.bottom,SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE);
- }
- break;
- case WM_ADDCHILD:
- {
- HWND newChild = LPCreateDialogParamW(IDD_ARTDOWNLOADER_IMAGE,hwndDlg,imageProc,lParam);
- RECT r,r2;
- GetClientRect(hwndDlg,&r);
- GetClientRect(newChild,&r2);
- SetWindowPos(hwndDlg,0,0,0,r.right + r2.right,r.bottom,SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE);
- SetWindowPos(newChild,0,r.right,0,0,0,SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE);
- ShowWindow(newChild,SW_SHOWNA);
- return (INT_PTR)newChild;
- }
- break;
- }
- return 0;
- }
- #endif
|