]>
git.saurik.com Git - wxWidgets.git/blob - src/os2/filedlg.cpp
   1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     wxFileDialog 
   4 // Author:      David Webster 
   8 // Copyright:   (c) David Webster 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 // For compilers that support precompilation, includes "wx.h". 
  13 #include "wx/wxprec.h" 
  23     #include "wx/msgdlg.h" 
  24     #include "wx/filedlg.h" 
  34 #include "wx/os2/private.h" 
  39 #include "wx/tokenzr.h" 
  41 #define wxMAXPATH                    1024 
  42 #define wxMAXFILE                    1024 
  61 IMPLEMENT_CLASS(wxFileDialog
, wxFileDialogBase
) 
  63 // ---------------------------------------------------------------------------- 
  65 // ---------------------------------------------------------------------------- 
  67 wxFileDialog::wxFileDialog ( 
  69 , const wxString
&                   rsMessage
 
  70 , const wxString
&                   rsDefaultDir
 
  71 , const wxString
&                   rsDefaultFileName
 
  72 , const wxString
&                   rsWildCard
 
  76     :wxFileDialogBase(pParent
, rsMessage
, rsDefaultDir
, rsDefaultFileName
, rsWildCard
, lStyle
, rPos
) 
  79     if ((m_dialogStyle 
& wxMULTIPLE
) && (m_dialogStyle 
& wxSAVE
)) 
  80         m_dialogStyle 
&= ~wxMULTIPLE
; 
  83 } // end of wxFileDialog::wxFileDialog 
  85 void wxFileDialog::GetPaths ( 
  86   wxArrayString
&                    rasPaths
 
  90     size_t                          nCount 
= m_fileNames
.GetCount(); 
  93     if (m_dir
.Last() != _T('\\')) 
  96     for ( size_t n 
= 0; n 
< nCount
; n
++ ) 
  98         rasPaths
.Add(sDir 
+ m_fileNames
[n
]); 
 100 } // end of wxFileDialog::GetPaths 
 102 int wxFileDialog::ShowModal() 
 105     wxString                        sFilterBuffer
; 
 106     wxChar
*                         pzFilterBuffer
; 
 107     static wxChar                   zFileNameBuffer
[wxMAXPATH
];           // the file-name 
 109     wxChar                          zTitleBuffer
[wxMAXFILE 
+ 1 + wxMAXEXT
];  // the file-name, without path 
 112     size_t                          nLen 
= m_dir
.length(); 
 117     memset(&vFileDlg
, '\0', sizeof(FILEDLG
)); 
 119         hWnd 
= (HWND
) m_parent
->GetHWND(); 
 120     if (!hWnd 
&& wxTheApp
->GetTopWindow()) 
 121         hWnd 
= (HWND
) wxTheApp
->GetTopWindow()->GetHWND(); 
 124     *zFileNameBuffer 
= wxT('\0'); 
 125     *zTitleBuffer    
= wxT('\0'); 
 127     if (m_dialogStyle 
& wxSAVE
) 
 128         lFlags 
= FDS_SAVEAS_DIALOG
; 
 130         lFlags 
= FDS_OPEN_DIALOG
; 
 132 #if WXWIN_COMPATIBILITY_2_4 
 133     if (m_dialogStyle 
& wxHIDE_READONLY
) 
 134         lFlags 
|= FDS_SAVEAS_DIALOG
; 
 137     if (m_dialogStyle 
& wxSAVE
) 
 138         lFlags 
|= FDS_SAVEAS_DIALOG
; 
 139     if (m_dialogStyle 
& wxMULTIPLE 
) 
 140         lFlags 
|= FDS_OPEN_DIALOG 
| FDS_MULTIPLESEL
; 
 142     vFileDlg
.cbSize 
= sizeof(FILEDLG
); 
 143     vFileDlg
.fl 
= lFlags
; 
 144     vFileDlg
.pszTitle 
= (PSZ
)zTitleBuffer
; 
 147     // Convert forward slashes to backslashes (file selector doesn't like 
 148     // forward slashes) and also squeeze multiple consecutive slashes into one 
 149     // as it doesn't like two backslashes in a row neither 
 152     for ( i 
= 0; i 
< nLen
; i
++ ) 
 154         wxChar                      ch 
= m_dir
[i
]; 
 160                 // Convert to backslash 
 170                     wxChar          chNext 
= m_dir
[i 
+ 1]; 
 172                     if (chNext 
!= _T('\\') && chNext 
!= _T('/')) 
 176                     // Ignore the next one, unless it is at the start of a UNC path 
 194     if ( wxStrlen(m_wildCard
) == 0 ) 
 195         sTheFilter 
= wxEmptyString
; 
 197         sTheFilter 
= m_wildCard
; 
 199     wxStrtok((wxChar
*)sTheFilter
.c_str(), wxT("|"), &pzFilterBuffer
); 
 200     while(pzFilterBuffer 
!= NULL
) 
 202         if (nCount 
> 0 && !(nCount 
% 2)) 
 206             sDir 
+= pzFilterBuffer
; 
 208         wxStrtok(NULL
, wxT("|"), &pzFilterBuffer
); 
 215     wxStrcpy((wxChar
*)vFileDlg
.szFullFile
, sDir
); 
 216     sFilterBuffer 
= sDir
; 
 218     hWnd 
= ::WinFileDlg( HWND_DESKTOP
 
 222     if (hWnd 
&& vFileDlg
.lReturn 
== DID_OK
) 
 225         if ((m_dialogStyle 
& wxMULTIPLE 
) && vFileDlg
.ulFQFCount 
> 1) 
 227             for (int i 
= 0; i 
< (int)vFileDlg
.ulFQFCount
; i
++) 
 231                     m_dir 
= wxPathOnly(wxString((const wxChar
*)*vFileDlg
.papszFQFilename
[0])); 
 232                     m_path 
= (const wxChar
*)*vFileDlg
.papszFQFilename
[0]; 
 234                 m_fileName 
= wxFileNameFromPath(wxString((const wxChar
*)*vFileDlg
.papszFQFilename
[i
])); 
 235                 m_fileNames
.Add(m_fileName
); 
 237             ::WinFreeFileDlgList(vFileDlg
.papszFQFilename
); 
 239         else if (!(m_dialogStyle 
& wxSAVE
)) 
 241             m_path 
= (wxChar
*)vFileDlg
.szFullFile
; 
 242             m_fileName 
= wxFileNameFromPath(wxString((const wxChar
*)vFileDlg
.szFullFile
)); 
 243             m_dir 
= wxPathOnly((const wxChar
*)vFileDlg
.szFullFile
); 
 247             const wxChar
*           pzExtension 
= NULL
; 
 249             wxStrcpy(zFileNameBuffer
, (const wxChar
*)vFileDlg
.szFullFile
); 
 251             int                     nIdx 
= wxStrlen(zFileNameBuffer
) - 1; 
 254             wxSplitPath( zFileNameBuffer
 
 259             if (zFileNameBuffer
[nIdx
] == wxT('.') || sExt
.empty()) 
 261                 zFileNameBuffer
[nIdx
] = wxT('\0'); 
 264                 // User has typed a filename without an extension: 
 266                 // A filename can end in a "." here ("abc."), this means it 
 267                 // does not have an extension. Because later on a "." with 
 268                 // the default extension is appended we remove the "." if 
 269                 // filename ends with one (We don't want files called 
 272                 pzExtension 
= sFilterBuffer
.c_str(); 
 274                 for( int i 
= 0; i 
< (int)sFilterBuffer
.length(); i
++ ) 
 279                     pzExtension 
= wxStrrchr(pzExtension
, wxT('.')); 
 281                         !wxStrrchr(pzExtension
, wxT('*')) && 
 282                         !wxStrrchr(pzExtension
, wxT('?')) && 
 284                         pzExtension
[1] != wxT(' ') 
 288                         // Now concat extension to the fileName: 
 290                         m_path 
= wxString(zFileNameBuffer
) + pzExtension
; 
 296                 m_path 
= (wxChar
*)vFileDlg
.szFullFile
; 
 298             m_fileName 
= wxFileNameFromPath((const wxChar
*)vFileDlg
.szFullFile
); 
 299             m_dir 
= wxPathOnly((const wxChar
*)vFileDlg
.szFullFile
); 
 302             // === Simulating the wxOVERWRITE_PROMPT >>============================ 
 304             if ((m_dialogStyle 
& wxOVERWRITE_PROMPT
) && 
 305                 (m_dialogStyle 
& wxSAVE
) && 
 306                 (wxFileExists(m_path
.c_str()))) 
 308                 wxString            sMessageText
; 
 310                 sMessageText
.Printf( _("File '%s' already exists.\nDo you want to replace it?") 
 313                 if (wxMessageBox( sMessageText
 
 315                                  ,wxYES_NO 
| wxICON_EXCLAMATION
 
 325 } // end of wxFileDialog::ShowModal 
 327 #endif // wxUSE_FILEDLG