requesters_windows.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. #include "requesters.h"
  2. #include <windows.h>
  3. #include <shlobj.h>
  4. namespace{
  5. HWND focHwnd;
  6. void beginPanel(){
  7. focHwnd=GetFocus();
  8. }
  9. void endPanel(){
  10. SetFocus( focHwnd );
  11. }
  12. int panel( bbString title,bbString text,int flags ){
  13. beginPanel();
  14. int n=MessageBoxW( GetActiveWindow(),bbWString( text ),bbWString( title ),flags );
  15. endPanel();
  16. return n;
  17. }
  18. WCHAR *tmpWString( bbString str ){
  19. WCHAR *p=(WCHAR*)malloc( str.length()*2+2 );
  20. memcpy( p,str.data(),str.length()*2 );
  21. p[str.length()]=0;
  22. return p;
  23. }
  24. int CALLBACK BrowseForFolderCallbackW( HWND hwnd,UINT uMsg,LPARAM lp,LPARAM pData ){
  25. wchar_t szPath[MAX_PATH];
  26. switch( uMsg ){
  27. case BFFM_INITIALIZED:
  28. SendMessageW( hwnd,BFFM_SETSELECTIONW,TRUE,pData );
  29. break;
  30. case BFFM_SELCHANGED:
  31. if( SHGetPathFromIDListW( (LPITEMIDLIST)lp,szPath ) ){
  32. SendMessageW( hwnd,BFFM_SETSTATUSTEXTW,0,(LPARAM)szPath );
  33. }
  34. break;
  35. }
  36. return 0;
  37. }
  38. int CALLBACK BrowseForFolderCallbackA( HWND hwnd,UINT uMsg,LPARAM lp,LPARAM pData ){
  39. char szPath[MAX_PATH];
  40. switch( uMsg ){
  41. case BFFM_INITIALIZED:
  42. SendMessageA( hwnd,BFFM_SETSELECTIONA,TRUE,pData );
  43. break;
  44. case BFFM_SELCHANGED:
  45. if( SHGetPathFromIDListA( (LPITEMIDLIST)lp,szPath ) ){
  46. SendMessageA( hwnd,BFFM_SETSTATUSTEXTA,0,(LPARAM)szPath );
  47. }
  48. break;
  49. }
  50. return 0;
  51. }
  52. }
  53. void bbRequesters::Notify( bbString title,bbString text,bbBool serious ){
  54. int flags=(serious ? MB_ICONWARNING : MB_ICONINFORMATION)|MB_OK|MB_APPLMODAL|MB_TOPMOST;
  55. panel( title,text,flags );
  56. }
  57. bbBool bbRequesters::Confirm( bbString title,bbString text,bbBool serious ){
  58. int flags=(serious ? MB_ICONWARNING : MB_ICONINFORMATION)|MB_OKCANCEL|MB_APPLMODAL|MB_TOPMOST;
  59. int n=panel( title,text,flags );
  60. if( n==IDOK ) return 1;
  61. return 0;
  62. }
  63. int bbRequesters::Proceed( bbString title,bbString text,bbBool serious ){
  64. int flags=(serious ? MB_ICONWARNING : MB_ICONINFORMATION)|MB_YESNOCANCEL|MB_APPLMODAL|MB_TOPMOST;
  65. int n=panel( title,text,flags );
  66. if( n==IDYES ) return 1;
  67. if( n==IDNO ) return 0;
  68. return -1;
  69. }
  70. bbString bbRequesters::RequestFile( bbString title,bbString exts,bbBool save,bbString path ){
  71. bbString file,dir;
  72. path=path.replace( "/","\\" );
  73. int i=path.findLast( "\\" );
  74. if( i!=-1 ){
  75. dir=path.slice( 0,i );
  76. file=path.slice( i+1 );
  77. }else{
  78. file=path;
  79. }
  80. if( file.length()>MAX_PATH ) return "";
  81. if( exts.length() ){
  82. if( exts.find( ":" )==-1 ){
  83. exts=bbString( "Files\0*.",8 )+exts;
  84. }else{
  85. exts=exts.replace( ":",bbString( "\0*.",3 ) );
  86. }
  87. exts=exts.replace( ";",bbString( "\0",1 ) );
  88. exts=exts.replace( ",",";*." )+bbString( "\0",1 );
  89. }
  90. WCHAR buf[MAX_PATH+1];
  91. memcpy( buf,file.data(),file.length()*2 );
  92. buf[file.length()]=0;
  93. OPENFILENAMEW of={sizeof(of)};
  94. of.hwndOwner=GetActiveWindow();
  95. of.lpstrTitle=tmpWString( title );
  96. of.lpstrFilter=tmpWString( exts );
  97. of.lpstrFile=buf;
  98. of.lpstrInitialDir=dir.length() ? tmpWString( dir ) : 0;
  99. of.nMaxFile=MAX_PATH;
  100. of.Flags=OFN_HIDEREADONLY|OFN_NOCHANGEDIR;
  101. bbString str;
  102. beginPanel();
  103. if( save ){
  104. of.lpstrDefExt=L"";
  105. of.Flags|=OFN_OVERWRITEPROMPT;
  106. if( GetSaveFileNameW( &of ) ){
  107. str=bbString( buf );
  108. }
  109. }else{
  110. of.Flags|=OFN_FILEMUSTEXIST;
  111. if( GetOpenFileNameW( &of ) ){
  112. str=bbString( buf );
  113. }
  114. }
  115. endPanel();
  116. free( (void*)of.lpstrTitle );
  117. free( (void*)of.lpstrFilter );
  118. free( (void*)of.lpstrInitialDir );
  119. str=str.replace( "\\","/" );
  120. return str;
  121. }
  122. bbString bbRequesters::RequestDir( bbString title,bbString dir ){
  123. CoInitialize( 0 );
  124. dir=dir.replace( "/","\\" );
  125. LPMALLOC shm;
  126. BROWSEINFOW bi={0};
  127. WCHAR buf[MAX_PATH],*p;
  128. GetFullPathNameW( bbWString( dir ),MAX_PATH,buf,&p );
  129. bi.hwndOwner=GetActiveWindow();
  130. bi.lpszTitle=tmpWString( title );
  131. bi.ulFlags=BIF_RETURNONLYFSDIRS|BIF_NEWDIALOGSTYLE;
  132. bi.lpfn=BrowseForFolderCallbackW;
  133. bi.lParam=(LPARAM)buf;
  134. beginPanel();
  135. bbString str;
  136. if( ITEMIDLIST *idlist=SHBrowseForFolderW( &bi ) ){
  137. SHGetPathFromIDListW( idlist,buf );
  138. str=bbString( buf );
  139. //SHFree( idlist ); //?!?
  140. str=str.replace( "\\","/" );
  141. if( !str.endsWith( "/" ) ) str+="/";
  142. }
  143. endPanel();
  144. free( (void*)bi.lpszTitle );
  145. return str;
  146. }
  147. void bbRequesters::OpenUrl( bbString url ){
  148. CoInitializeEx( NULL,COINIT_APARTMENTTHREADED|COINIT_DISABLE_OLE1DDE );
  149. ShellExecute( HWND_DESKTOP,0,url.c_str(),0,0,SW_SHOWNORMAL );
  150. // ShellExecute( HWND_DESKTOP,"open",url.c_str(),0,0,SW_SHOWNORMAL );
  151. }