OSDN Git Service

20021009版ソース
[seraphyscrtools/SeraphyScriptTools.git] / CommDialog.cpp
1 // CCommDialog.cpp : CCCommDialog \82Ì\83C\83\93\83v\83\8a\83\81\83\93\83e\81[\83V\83\87\83\93
2
3 #include "stdafx.h"
4 #include "SeraphyScriptTools.h"
5 #include "CommDialog.h"
6 #include "generic.h"
7 #include "ObjectVector.h"
8
9 /////////////////////////////////////////////////////////////////////////////
10 // CCommDialog
11
12 void CCommDialog::CommFileDialog(VARIANT* pvarReturn,VARIANT varPathName, VARIANT varFilter,BOOL bMode,DWORD flag)
13 {
14         ::VariantInit(pvarReturn);
15
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
17         CComVariant path;
18         CComVariant filter;
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};
24
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);
28         }
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);
32                 LPSTR p = szFilter;
33                 LPSTR pExt = NULL;
34                 while(*p){
35                         if(*p == '|'){
36                                 *p++ = 0;
37                                 if(!pExt){
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
39                                         pExt = p;
40                                 }
41                         }
42                         p = CharNextA(p);
43                 }
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;
47                 while(*pExt){
48                         if(*pExt == ';'){
49                                 break;
50                         }
51                         pExt = CharNextA(pExt);
52                 }
53         }
54
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;
61         ofn.Flags       = flag;
62         ofn.hwndOwner   = GetMainWindow();
63
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;
68         }
69
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;
73         }
74
75         TCHAR szCaption[MAX_PATH] = {0};
76         BOOL result = false;
77         if(bMode){
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;
83                 }
84                 result = GetOpenFileName(&ofn);
85                 if(result){
86                         m_bReadonly = (ofn.Flags & OFN_READONLY)?true:false;
87                 }
88         }
89         else{
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;
94                 }
95                 result = GetSaveFileName(&ofn);
96         }
97
98         if(result){
99                 if(!(ofn.Flags & OFN_ALLOWMULTISELECT)){
100                         // \92P\88ê\83t\83@\83C\83\8b\91I\91ð
101                         CComVariant retpath;
102                         retpath = (LPCSTR)ofn.lpstrFile;
103                         retpath.Detach(pvarReturn);
104                 }
105                 else{
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é
108                         int cnt = 0;
109                         LPCSTR p = szPathName;
110                         while(*p){
111                                 cnt++;
112                                 while(*p++);
113                         }
114                         // \83V\83\93\83O\83\8b\82Ü\82½\82Í\83}\83\8b\83`
115                         SAFEARRAY *pArray = NULL;
116                         if(cnt == 1){
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);
120                                 long indx = 0;
121                                 SafeArrayPutElement(pArray,&indx,&tmp);
122                         }
123                         else if(cnt > 1){
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¼
127                                 p = szPathName;
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;
131                                 while(*wp)wp++;
132                                 if(wp - 1 > (LPCWSTR)dirname && *(wp - 1) != '\\'){
133                                         dirname += L"\\";
134                                 }
135                                 while(*p++);
136                                 // 2\94Ô\96Ú\88È\8d~\82Ì\8eæ\93¾
137                                 long indx = 0;
138                                 while(*p){
139                                         _bstr_t name = (LPCSTR)p;
140                                         _bstr_t path = dirname + name;
141                                         CComVariant tmp((BSTR)path);
142                                         SafeArrayPutElement(pArray,&indx,&tmp);
143                                         while(*p++);
144                                         indx++;
145                                 }
146                         }
147                         // SAFEARRAY\82ª\8dì\90¬\82³\82ê\82Ä\82¢\82ê\82Î
148                         if(pArray){
149                                 pvarReturn->vt     = VT_ARRAY | VT_VARIANT;
150                                 pvarReturn->parray = pArray;
151                         }
152                 }// Single or Multi
153         }// if result is ok
154 }
155
156 /////////////////////////////////
157 // \83C\83\93\83^\81[\83t\83F\83C\83X\95\94
158
159 STDMETHODIMP CCommDialog::OpenFileDialog(VARIANT varPathName,VARIANT varFilter,VARIANT* pvarReturn)
160 {
161         DWORD flags =   (m_bEnableCreatePrompt ? OFN_CREATEPROMPT : OFN_FILEMUSTEXIST)
162                                   +     (m_bEnableReadonly     ? 0                : OFN_HIDEREADONLY );
163         CommFileDialog(pvarReturn,varPathName,varFilter,true,flags|OFN_ENABLESIZING);
164         return S_OK;
165 }
166
167 STDMETHODIMP CCommDialog::SaveFileDialog(VARIANT varPathName, VARIANT varFilter, VARIANT* pvarReturn)
168 {
169         CommFileDialog(pvarReturn,varPathName,varFilter,false,OFN_ENABLESIZING|OFN_OVERWRITEPROMPT);
170         return S_OK;
171 }
172
173
174 STDMETHODIMP CCommDialog::MultiOpenFileDialog(VARIANT varMulti,VARIANT varFilter,VARIANT* pvarReturn)
175 {
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);
179         return S_OK;
180 }
181
182 STDMETHODIMP CCommDialog::get_OpenFileCaption(BSTR *pVal)
183 {
184         *pVal = m_bstr_OpenFileCaption.copy();
185         return S_OK;
186 }
187
188 STDMETHODIMP CCommDialog::put_OpenFileCaption(BSTR newVal)
189 {
190         m_bstr_OpenFileCaption = newVal;
191         return S_OK;
192 }
193
194 STDMETHODIMP CCommDialog::get_SaveFileCaption(BSTR *pVal)
195 {
196         *pVal = m_bstr_SaveFileCaption.copy();
197         return S_OK;
198 }
199
200 STDMETHODIMP CCommDialog::put_SaveFileCaption(BSTR newVal)
201 {
202         m_bstr_SaveFileCaption = newVal;
203         return S_OK;
204 }
205
206 STDMETHODIMP CCommDialog::get_EnableCreatePrompt(BOOL *pVal)
207 {
208         *pVal = m_bEnableCreatePrompt?VB_TRUE:VB_FALSE;
209         return S_OK;
210 }
211
212 STDMETHODIMP CCommDialog::put_EnableCreatePrompt(BOOL newVal)
213 {
214         m_bEnableCreatePrompt = newVal;
215         return S_OK;
216 }
217
218 STDMETHODIMP CCommDialog::get_EnableReadOnly(BOOL *pVal)
219 {
220         *pVal = m_bEnableReadonly?VB_TRUE:VB_FALSE;
221         return S_OK;
222 }
223
224 STDMETHODIMP CCommDialog::put_EnableReadOnly(BOOL newVal)
225 {
226         m_bEnableReadonly = newVal;
227         return S_OK;
228 }
229
230 STDMETHODIMP CCommDialog::get_ReadOnly(BOOL *pVal)
231 {
232         *pVal = m_bReadonly?VB_TRUE:VB_FALSE;
233         return S_OK;
234 }
235
236 STDMETHODIMP CCommDialog::put_ReadOnly(BOOL newVal)
237 {
238         m_bReadonly = newVal;
239         return S_OK;
240 }
241
242 STDMETHODIMP CCommDialog::get_NoDereferenceLinks(BOOL *pVal)
243 {
244         *pVal = m_bNoDereferenceLinks;
245         return S_OK;
246 }
247
248 STDMETHODIMP CCommDialog::put_NoDereferenceLinks(BOOL newVal)
249 {
250         m_bNoDereferenceLinks = newVal;
251         return S_OK;
252 }
253
254 STDMETHODIMP CCommDialog::get_InitialDir(BSTR *pVal)
255 {
256         *pVal = m_bstr_InitialDir.copy();
257         return S_OK;
258 }
259
260 STDMETHODIMP CCommDialog::put_InitialDir(BSTR newVal)
261 {
262         m_bstr_InitialDir = newVal;
263         return S_OK;
264 }
265
266 STDMETHODIMP CCommDialog::get_HWND(long *pVal)
267 {
268         *pVal = (long)m_hStaticMainWindow;
269         return S_OK;
270 }
271
272 STDMETHODIMP CCommDialog::put_HWND(long newVal)
273 {
274         m_hStaticMainWindow = (HWND)newVal;
275         if(m_pMainWindow){
276                 m_pMainWindow->Release();
277                 m_pMainWindow = NULL;
278         }
279         return S_OK;
280 }
281
282 STDMETHODIMP CCommDialog::get_BrowseForFolderCaption(BSTR *pVal)
283 {
284         *pVal = m_bstr_BrowseForFolderCaption.copy();
285         return S_OK;
286 }
287
288 STDMETHODIMP CCommDialog::put_BrowseForFolderCaption(BSTR newVal)
289 {
290         m_bstr_BrowseForFolderCaption = newVal;
291         return S_OK;
292 }
293
294 STDMETHODIMP CCommDialog::BrowseForFolder(VARIANT varCaption,VARIANT varDir, VARIANT varMode,VARIANT* pvarReturn)
295 {
296         ::VariantInit(pvarReturn);
297         // \83L\83\83\83v\83V\83\87\83\93\82Ì\90Ý\92è
298         CComVariant caption;
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);
302         }
303
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;
311         }
312         CComVariant path;
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);
316         }
317         binfo.pszDisplayName = szDirName;
318         int mode = 0;
319         CComVariant varTmp;
320         if(varTmp.ChangeType(VT_I4,&varMode) == S_OK){
321                 mode = varTmp.lVal;
322         }
323         binfo.ulFlags = 0;//BIF_NEWDIALOGSTYLE; // BIF_USENEWUI
324         switch(mode & 0x0f)
325         {
326         case 0:
327         default:
328                 binfo.ulFlags |= BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE;
329                 binfo.lpfn           = BrowseCallbackProc;
330                 binfo.lParam         = (LPARAM)szDirName;
331                 break;
332         case 1:
333                 binfo.ulFlags |= BIF_BROWSEFORCOMPUTER;
334                 break;
335         case 2:
336                 binfo.ulFlags |= BIF_BROWSEFORPRINTER;
337                 break;
338         case 3:
339                 binfo.ulFlags |= BIF_RETURNFSANCESTORS;
340                 break;
341         }
342         if(mode & 0x10){
343                 binfo.ulFlags |= BIF_BROWSEINCLUDEFILES;
344         }
345         if(mode & 0x20){
346                 binfo.ulFlags |= BIF_BROWSEINCLUDEURLS;
347         }
348         if(mode & 0x40){
349                 binfo.ulFlags |= BIF_DONTGOBELOWDOMAIN;
350         }
351
352         LPITEMIDLIST idlst = NULL;
353         if((idlst = SHBrowseForFolder(&binfo)) != NULL){
354                 IMalloc *pMalloc;
355                 SHGetMalloc(&pMalloc);
356                 SHGetPathFromIDList(idlst,szDirName);
357                 pMalloc->Free(idlst);
358                 pMalloc->Release();
359                 CComVariant tmp((LPCSTR)szDirName);
360                 tmp.Detach(pvarReturn);
361         }
362         return S_OK;
363 }
364
365
366 int CALLBACK CCommDialog::BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
367 {
368         switch(uMsg)
369         {
370         case BFFM_INITIALIZED:
371                 SendMessage(hwnd,BFFM_SETSELECTION,true,lpData);
372                 break;
373         case BFFM_SELCHANGED:
374                 {
375                         TCHAR szBuf[MAX_PATH];
376                         BOOL bResult = SHGetPathFromIDList((LPITEMIDLIST)lParam,szBuf);
377                         SendMessage(hwnd,BFFM_ENABLEOK,0,bResult);
378                 }
379                 break;
380         case BFFM_VALIDATEFAILED:
381                 break;
382         }
383         return 0;
384 }
385
386 HWND CCommDialog::GetMainWindow()
387 {
388         HWND hWnd = m_hStaticMainWindow;
389         if(m_pMainWindow){
390                 m_pMainWindow->get_HWND((long*)&hWnd);
391         }
392         return hWnd;
393 }
394
395 STDMETHODIMP CCommDialog::SetMainWindow(VARIANT varUnk)
396 {
397         // \8aù\91\82Ì\83C\83\93\83^\81[\83t\83F\83C\83X\82Ì\89ð\95ú
398         if(m_pMainWindow){
399                 m_pMainWindow->Release();
400                 m_pMainWindow = NULL;
401         }
402         // \83C\83\93\83^\81[\83t\83F\83C\83X\82Ì\8eæ\93¾
403         CComVariant tmp;
404         if(tmp.ChangeType(VT_UNKNOWN,&varUnk) == S_OK){
405                 if(tmp.punkVal->QueryInterface(IID_IOverlappedWindow,(void**)&m_pMainWindow) == S_OK){
406                         return S_OK;
407                 }
408         }
409         return DISP_E_UNKNOWNINTERFACE;
410 }
411
412 STDMETHODIMP CCommDialog::MessageBox(VARIANT mes, VARIANT typ, VARIANT icon, VARIANT* pRet)
413 {
414         CComVariant ret;
415         LPSTR pBuf = NULL;
416         CComVariant varMes;
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);
421                 pBuf[sz] = 0;
422         }
423         UINT mode = MB_OK;
424         CComVariant varType,varIcon;
425         if(varType.ChangeType(VT_I2,&typ) == S_OK){
426                 if(varType.iVal / 10){
427                         mode = MB_DEFBUTTON2;
428                 }
429                 switch(varType.iVal % 10)
430                 {
431                 case 0:
432                 default:
433                         mode |= MB_OK;
434                         break;
435                 case 1:
436                         mode |= MB_OKCANCEL;
437                         break;
438                 case 2:
439                         mode |= MB_YESNO;
440                         break;
441                 case 3:
442                         mode |= MB_YESNOCANCEL;
443                         break;
444                 case 4:
445                         mode |= MB_RETRYCANCEL;
446                         break;
447                 case 5:
448                         mode |= MB_ABORTRETRYIGNORE;
449                         break;
450                 }
451         }
452         if(varIcon.ChangeType(VT_I2,&icon) == S_OK){
453                 switch(varIcon.iVal)
454                 {
455                 case 0:
456                 default:
457                         break;
458                 case 1:
459                         mode |= MB_ICONERROR;
460                         break;
461                 case 2:
462                         mode |= MB_ICONWARNING;
463                         break;
464                 case 3:
465                         mode |= MB_ICONINFORMATION;
466                         break;
467                 case 4:
468                         mode |= MB_ICONQUESTION;
469                         break;
470                 }
471         }
472         int md = ::MessageBox(GetMainWindow(),pBuf,GetMainCaption(),mode);
473         switch(md)
474         {
475         case IDOK:
476         case IDYES:
477         case IDRETRY:
478                 ret = (short)1;
479                 break;
480         case IDCANCEL:
481         case IDABORT:
482                 ret = (short)-1;
483                 break;
484         case IDNO:
485         case IDIGNORE:
486                 ret = (short)0;
487                 break;
488         }
489         *pRet = ret;
490         return S_OK;
491 }
492
493 LPCSTR CCommDialog::GetMainCaption()
494 {
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é
498                 BSTR bstrCaption;
499                 m_pMainWindow->get_Caption(&bstrCaption);
500                 int cnt = WideCharToMultiByte(GetACP(),0,bstrCaption,-1,szCaption,MAX_PATH,NULL,NULL);
501                 szCaption[cnt] = 0;
502                 SysFreeString(bstrCaption);
503         }
504         else{
505                 int cnt = WideCharToMultiByte(GetACP(),0,m_bstr_MessageCaption,-1,szCaption,MAX_PATH,NULL,NULL);
506                 szCaption[cnt] = 0;
507         }
508         return szCaption;
509 }
510
511 STDMETHODIMP CCommDialog::get_MessageCaption(BSTR *pVal)
512 {
513         *pVal = m_bstr_MessageCaption.copy();
514         return S_OK;
515 }
516
517 STDMETHODIMP CCommDialog::put_MessageCaption(BSTR newVal)
518 {
519         m_bstr_MessageCaption = newVal;
520         return S_OK;
521 }
522
523 STDMETHODIMP CCommDialog::ColorDialog(VARIANT *pcolorVal)
524 {
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;
530         }
531         return S_OK;
532 }