1 // CCommDialog.cpp : CCCommDialog
\82Ì
\83C
\83\93\83v
\83\8a\83\81\83\93\83e
\81[
\83V
\83\87\83\93
4 #include "SeraphyScriptTools.h"
5 #include "CommDialog.h"
7 #include "ObjectVector.h"
9 /////////////////////////////////////////////////////////////////////////////
12 void CCommDialog::CommFileDialog(VARIANT* pvarReturn,VARIANT varPathName, VARIANT varFilter,BOOL bMode,DWORD flag)
14 ::VariantInit(pvarReturn);
16 //
\83t
\83@
\83C
\83\8b\82ð
\8aJ
\82
\81E
\95Û
\91¶
\83_
\83C
\83A
\83\8d\83O
\8b¤
\92Ê
\83\8b\81[
\83`
\83\93
19 const int PATHBUFMAX = 8192;
20 CHAR szPathName[PATHBUFMAX] = {0};
21 CHAR szFilter [MAX_PATH+2] = {0};
22 CHAR szDefExtention[MAX_PATH] = {0};
23 CHAR szInitialDir[MAX_PATH] = {0};
25 if(path.ChangeType(VT_BSTR,&varPathName) == S_OK){
26 //
\83t
\83@
\83C
\83\8b\96¼
\82Ì
\8eæ
\82è
\8fo
\82µ
27 WideCharToMultiByte(GetACP(),0,path.bstrVal,-1,szPathName,PATHBUFMAX,NULL,NULL);
29 if(filter.ChangeType(VT_BSTR,&varFilter) == S_OK){
30 //
\83t
\83B
\83\8b\83^
\8ew
\92è
\82ª
\82 \82é
31 WideCharToMultiByte(GetACP(),0,filter.bstrVal,-1,szFilter,MAX_PATH,NULL,NULL);
38 //
\8dÅ
\8f\89\82Ì
\8bæ
\90Ø
\82è
\83}
\81[
\83N
\82ª
\8dÅ
\8f\89\82Ì
\8ag
\92£
\8eq
\83}
\81[
\83N
\82Å
\82 \82ë
\82¤
\81B
44 //
\95¡
\90\94\8ag
\92£
\8eq
\83t
\83B
\83\8b\83^
\82Å
\82 \82ê
\82Î
\8dÅ
\8f\89\82Ì
\8ag
\92£
\8eq
\82Ì
\82Ý
\8eæ
\82è
\8fo
\82·
45 lstrcpyA(szDefExtention,pExt);
46 pExt = szDefExtention;
51 pExt = CharNextA(pExt);
55 OPENFILENAME ofn = {0};
56 ofn.lStructSize = sizeof(OPENFILENAME);
57 ofn.lpstrFilter = szFilter;
58 ofn.lpstrFile = szPathName;
59 ofn.nMaxFile = PATHBUFMAX;
60 ofn.lpstrDefExt = szDefExtention;
62 ofn.hwndOwner = GetMainWindow();
64 if(m_bstr_InitialDir.length() > 0){
65 //
\8f\89\8aú
\83f
\83B
\83\8c\83N
\83g
\83\8a
66 WideCharToMultiByte(GetACP(),0,m_bstr_InitialDir,-1,szInitialDir,MAX_PATH,NULL,NULL);
67 ofn.lpstrInitialDir = szInitialDir;
70 if(m_bNoDereferenceLinks){
71 //
\83V
\83\87\81[
\83g
\83J
\83b
\83g
\82ð
\81A
\82»
\82Ì
\82Ü
\82Ü
\8eæ
\82é
\81B
72 ofn.Flags |= OFN_NODEREFERENCELINKS;
75 TCHAR szCaption[MAX_PATH] = {0};
78 //
\8aJ
\82
\83_
\83C
\83A
\83\8d\83O
79 ofn.Flags |= (m_bReadonly)?OFN_READONLY:0;
80 if(m_bstr_OpenFileCaption.length() > 0){
81 WideCharToMultiByte(GetACP(),0,m_bstr_OpenFileCaption,-1,szCaption,MAX_PATH,NULL,NULL);
82 ofn.lpstrTitle = szCaption;
84 result = GetOpenFileName(&ofn);
86 m_bReadonly = (ofn.Flags & OFN_READONLY)?true:false;
90 //
\95Û
\91¶
\83_
\83C
\83A
\83\8d\83O
91 if(m_bstr_SaveFileCaption.length() > 0){
92 WideCharToMultiByte(GetACP(),0,m_bstr_SaveFileCaption,-1,szCaption,MAX_PATH,NULL,NULL);
93 ofn.lpstrTitle = szCaption;
95 result = GetSaveFileName(&ofn);
99 if(!(ofn.Flags & OFN_ALLOWMULTISELECT)){
100 //
\92P
\88ê
\83t
\83@
\83C
\83\8b\91I
\91ð
102 retpath = (LPCSTR)ofn.lpstrFile;
103 retpath.Detach(pvarReturn);
106 //
\95¡
\90\94\83t
\83@
\83C
\83\8b\91I
\91ð
107 //
\95Ô
\82³
\82ê
\82½
\83t
\83@
\83C
\83\8b\90\94\82ð
\8cv
\90\94\82·
\82é
109 LPCSTR p = szPathName;
114 //
\83V
\83\93\83O
\83\8b\82Ü
\82½
\82Í
\83}
\83\8b\83`
115 SAFEARRAY *pArray = NULL;
117 // 1
\82Â
\82¾
\82¯
\82È
\82ç
\83t
\83\8b\83p
\83X
\82ª
\95Ô
\82Á
\82Ä
\82¢
\82é
118 CComVariant tmp((LPCSTR)szPathName);
119 pArray = SafeArrayCreateVector(VT_VARIANT,0,1);
121 SafeArrayPutElement(pArray,&indx,&tmp);
124 // SAFEARRAY
\82Ì
\8dì
\90¬
125 pArray = SafeArrayCreateVector(VT_VARIANT,0,cnt-1);
126 //
\95¡
\90\94\82È
\82ç
\8dÅ
\8f\89\82ª
\83f
\83B
\83\8c\83N
\83g
\83\8a\96¼
\81A2
\94Ô
\96Ú
\88È
\8d~
\82ª
\83t
\83@
\83C
\83\8b\96¼
128 _bstr_t dirname = (LPCSTR)p;
129 //
\96\96\94ö
\82ª
\83t
\83H
\83\8b\83_
\83v
\83\8c\83C
\83X
\82ª
\8fI
\82í
\82Á
\82Ä
\82È
\82¯
\82ê
\82Î
\92Ç
\89Á
\82·
\82é
130 LPCWSTR wp = dirname;
132 if(wp - 1 > (LPCWSTR)dirname && *(wp - 1) != '\\'){
136 // 2
\94Ô
\96Ú
\88È
\8d~
\82Ì
\8eæ
\93¾
139 _bstr_t name = (LPCSTR)p;
140 _bstr_t path = dirname + name;
141 CComVariant tmp((BSTR)path);
142 SafeArrayPutElement(pArray,&indx,&tmp);
147 // SAFEARRAY
\82ª
\8dì
\90¬
\82³
\82ê
\82Ä
\82¢
\82ê
\82Î
149 pvarReturn->vt = VT_ARRAY | VT_VARIANT;
150 pvarReturn->parray = pArray;
156 /////////////////////////////////
157 //
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\95\94
159 STDMETHODIMP CCommDialog::OpenFileDialog(VARIANT varPathName,VARIANT varFilter,VARIANT* pvarReturn)
161 DWORD flags = (m_bEnableCreatePrompt ? OFN_CREATEPROMPT : OFN_FILEMUSTEXIST)
162 + (m_bEnableReadonly ? 0 : OFN_HIDEREADONLY );
163 CommFileDialog(pvarReturn,varPathName,varFilter,true,flags|OFN_ENABLESIZING);
167 STDMETHODIMP CCommDialog::SaveFileDialog(VARIANT varPathName, VARIANT varFilter, VARIANT* pvarReturn)
169 CommFileDialog(pvarReturn,varPathName,varFilter,false,OFN_ENABLESIZING|OFN_OVERWRITEPROMPT);
174 STDMETHODIMP CCommDialog::MultiOpenFileDialog(VARIANT varMulti,VARIANT varFilter,VARIANT* pvarReturn)
176 DWORD flags = (m_bEnableCreatePrompt ? OFN_CREATEPROMPT : OFN_FILEMUSTEXIST)
177 + (m_bEnableReadonly ? 0 : OFN_HIDEREADONLY );
178 CommFileDialog(pvarReturn,varMulti,varFilter,true,flags|OFN_ALLOWMULTISELECT|OFN_EXPLORER|OFN_ENABLESIZING);
182 STDMETHODIMP CCommDialog::get_OpenFileCaption(BSTR *pVal)
184 *pVal = m_bstr_OpenFileCaption.copy();
188 STDMETHODIMP CCommDialog::put_OpenFileCaption(BSTR newVal)
190 m_bstr_OpenFileCaption = newVal;
194 STDMETHODIMP CCommDialog::get_SaveFileCaption(BSTR *pVal)
196 *pVal = m_bstr_SaveFileCaption.copy();
200 STDMETHODIMP CCommDialog::put_SaveFileCaption(BSTR newVal)
202 m_bstr_SaveFileCaption = newVal;
206 STDMETHODIMP CCommDialog::get_EnableCreatePrompt(BOOL *pVal)
208 *pVal = m_bEnableCreatePrompt?VB_TRUE:VB_FALSE;
212 STDMETHODIMP CCommDialog::put_EnableCreatePrompt(BOOL newVal)
214 m_bEnableCreatePrompt = newVal;
218 STDMETHODIMP CCommDialog::get_EnableReadOnly(BOOL *pVal)
220 *pVal = m_bEnableReadonly?VB_TRUE:VB_FALSE;
224 STDMETHODIMP CCommDialog::put_EnableReadOnly(BOOL newVal)
226 m_bEnableReadonly = newVal;
230 STDMETHODIMP CCommDialog::get_ReadOnly(BOOL *pVal)
232 *pVal = m_bReadonly?VB_TRUE:VB_FALSE;
236 STDMETHODIMP CCommDialog::put_ReadOnly(BOOL newVal)
238 m_bReadonly = newVal;
242 STDMETHODIMP CCommDialog::get_NoDereferenceLinks(BOOL *pVal)
244 *pVal = m_bNoDereferenceLinks;
248 STDMETHODIMP CCommDialog::put_NoDereferenceLinks(BOOL newVal)
250 m_bNoDereferenceLinks = newVal;
254 STDMETHODIMP CCommDialog::get_InitialDir(BSTR *pVal)
256 *pVal = m_bstr_InitialDir.copy();
260 STDMETHODIMP CCommDialog::put_InitialDir(BSTR newVal)
262 m_bstr_InitialDir = newVal;
266 STDMETHODIMP CCommDialog::get_HWND(long *pVal)
268 *pVal = (long)m_hStaticMainWindow;
272 STDMETHODIMP CCommDialog::put_HWND(long newVal)
274 m_hStaticMainWindow = (HWND)newVal;
276 m_pMainWindow->Release();
277 m_pMainWindow = NULL;
282 STDMETHODIMP CCommDialog::get_BrowseForFolderCaption(BSTR *pVal)
284 *pVal = m_bstr_BrowseForFolderCaption.copy();
288 STDMETHODIMP CCommDialog::put_BrowseForFolderCaption(BSTR newVal)
290 m_bstr_BrowseForFolderCaption = newVal;
294 STDMETHODIMP CCommDialog::BrowseForFolder(VARIANT varCaption,VARIANT varDir, VARIANT varMode,VARIANT* pvarReturn)
296 ::VariantInit(pvarReturn);
297 //
\83L
\83\83\83v
\83V
\83\87\83\93\82Ì
\90Ý
\92è
299 if(varCaption.vt != VT_ERROR && varCaption.vt != VT_NULL && varCaption.vt != VT_EMPTY &&
300 caption.ChangeType(VT_BSTR,&varCaption) == S_OK){
301 put_BrowseForFolderCaption(caption.bstrVal);
304 TCHAR szDirName[MAX_PATH];
305 TCHAR szTitle[MAX_PATH];
306 BROWSEINFO binfo = {0};
307 binfo.hwndOwner = GetMainWindow();
308 if(m_bstr_BrowseForFolderCaption.length() > 0){
309 WideCharToMultiByte(GetACP(),0,m_bstr_BrowseForFolderCaption,-1,szTitle,MAX_PATH,NULL,NULL);
310 binfo.lpszTitle = szTitle;
313 if(path.ChangeType(VT_BSTR,&varDir) == S_OK){
314 //
\83t
\83@
\83C
\83\8b\96¼
\82Ì
\8eæ
\82è
\8fo
\82µ
315 WideCharToMultiByte(GetACP(),0,path.bstrVal,-1,szDirName,MAX_PATH,NULL,NULL);
317 binfo.pszDisplayName = szDirName;
320 if(varTmp.ChangeType(VT_I4,&varMode) == S_OK){
323 binfo.ulFlags = 0;//BIF_NEWDIALOGSTYLE; // BIF_USENEWUI
328 binfo.ulFlags |= BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE;
329 binfo.lpfn = BrowseCallbackProc;
330 binfo.lParam = (LPARAM)szDirName;
333 binfo.ulFlags |= BIF_BROWSEFORCOMPUTER;
336 binfo.ulFlags |= BIF_BROWSEFORPRINTER;
339 binfo.ulFlags |= BIF_RETURNFSANCESTORS;
343 binfo.ulFlags |= BIF_BROWSEINCLUDEFILES;
346 binfo.ulFlags |= BIF_BROWSEINCLUDEURLS;
349 binfo.ulFlags |= BIF_DONTGOBELOWDOMAIN;
352 LPITEMIDLIST idlst = NULL;
353 if((idlst = SHBrowseForFolder(&binfo)) != NULL){
355 SHGetMalloc(&pMalloc);
356 SHGetPathFromIDList(idlst,szDirName);
357 pMalloc->Free(idlst);
359 CComVariant tmp((LPCSTR)szDirName);
360 tmp.Detach(pvarReturn);
366 int CALLBACK CCommDialog::BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
370 case BFFM_INITIALIZED:
371 SendMessage(hwnd,BFFM_SETSELECTION,true,lpData);
373 case BFFM_SELCHANGED:
375 TCHAR szBuf[MAX_PATH];
376 BOOL bResult = SHGetPathFromIDList((LPITEMIDLIST)lParam,szBuf);
377 SendMessage(hwnd,BFFM_ENABLEOK,0,bResult);
380 case BFFM_VALIDATEFAILED:
386 HWND CCommDialog::GetMainWindow()
388 HWND hWnd = m_hStaticMainWindow;
390 m_pMainWindow->get_HWND((long*)&hWnd);
395 STDMETHODIMP CCommDialog::SetMainWindow(VARIANT varUnk)
397 //
\8aù
\91¶
\82Ì
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82Ì
\89ð
\95ú
399 m_pMainWindow->Release();
400 m_pMainWindow = NULL;
402 //
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82Ì
\8eæ
\93¾
404 if(tmp.ChangeType(VT_UNKNOWN,&varUnk) == S_OK){
405 if(tmp.punkVal->QueryInterface(IID_IOverlappedWindow,(void**)&m_pMainWindow) == S_OK){
409 return DISP_E_UNKNOWNINTERFACE;
412 STDMETHODIMP CCommDialog::MessageBox(VARIANT mes, VARIANT typ, VARIANT icon, VARIANT* pRet)
417 if(varMes.ChangeType(VT_BSTR,&mes) == S_OK){
418 int sz = WideCharToMultiByte(GetACP(),0,varMes.bstrVal,-1,NULL,0,NULL,NULL);
419 pBuf = new CHAR[sz+1];
420 WideCharToMultiByte(GetACP(),0,varMes.bstrVal,-1,pBuf,sz,NULL,NULL);
424 CComVariant varType,varIcon;
425 if(varType.ChangeType(VT_I2,&typ) == S_OK){
426 if(varType.iVal / 10){
427 mode = MB_DEFBUTTON2;
429 switch(varType.iVal % 10)
442 mode |= MB_YESNOCANCEL;
445 mode |= MB_RETRYCANCEL;
448 mode |= MB_ABORTRETRYIGNORE;
452 if(varIcon.ChangeType(VT_I2,&icon) == S_OK){
459 mode |= MB_ICONERROR;
462 mode |= MB_ICONWARNING;
465 mode |= MB_ICONINFORMATION;
468 mode |= MB_ICONQUESTION;
472 int md = ::MessageBox(GetMainWindow(),pBuf,GetMainCaption(),mode);
493 LPCSTR CCommDialog::GetMainCaption()
495 static CHAR szCaption[MAX_PATH];
496 if(!m_bstr_MessageCaption.length() && m_pMainWindow){
497 //
\83L
\83\83\83v
\83V
\83\87\83\93\82ª
\8ew
\92è
\82³
\82ê
\82Ä
\82¢
\82È
\82¢
\82È
\82ç
\8eæ
\93¾
\82·
\82é
499 m_pMainWindow->get_Caption(&bstrCaption);
500 int cnt = WideCharToMultiByte(GetACP(),0,bstrCaption,-1,szCaption,MAX_PATH,NULL,NULL);
502 SysFreeString(bstrCaption);
505 int cnt = WideCharToMultiByte(GetACP(),0,m_bstr_MessageCaption,-1,szCaption,MAX_PATH,NULL,NULL);
511 STDMETHODIMP CCommDialog::get_MessageCaption(BSTR *pVal)
513 *pVal = m_bstr_MessageCaption.copy();
517 STDMETHODIMP CCommDialog::put_MessageCaption(BSTR newVal)
519 m_bstr_MessageCaption = newVal;
523 STDMETHODIMP CCommDialog::ColorDialog(VARIANT *pcolorVal)
525 ::VariantInit(pcolorVal);
526 m_color.hwndOwner = GetMainWindow();
527 if(ChooseColor(&m_color)){
528 pcolorVal->vt = VT_I4;
529 pcolorVal->lVal = (long)m_color.rgbResult;